Skip to content

memcpy crash when dest is a multi ptr #15513

Closed
@travisstaloch

Description

@travisstaloch

Zig Version

0.11.0-dev.2912+d65b42e07

Steps to Reproduce and Observed Behavior

I'm not confident that the title is the correct way to frame the issue. But the following code leads to compiler crash below.

// /tmp/tmp.zig
test {
    var value: f64 = undefined;
    var word: u64 = undefined;
    @memcpy(@ptrCast([*]u8, &value), @ptrCast([*]const u8, &word)[0..@sizeOf(f64)]);
    // properly slicing dest does not cause the crash
    // @memcpy(@ptrCast([*]u8, &value)[0..@sizeOf(f64)], @ptrCast([*]const u8, &word)[0..@sizeOf(f64)]);
}
$ zig version
0.11.0-dev.2912+d65b42e07

$ zig test /tmp/tmp.zig
thread 72774 panic: reached unreachable code
~/projects/zig/zig/src/codegen/llvm.zig:5807:26: 0x1828d6f in sliceOrArrayLenInBytes (zig)
            .Many, .C => unreachable,
                         ^
~/projects/zig/zig/src/codegen/llvm.zig:8553:48: 0x18290a2 in airMemcpy (zig)
        const len = self.sliceOrArrayLenInBytes(dest_slice, dest_ptr_ty);
                                               ^
~/projects/zig/zig/src/codegen/llvm.zig:4678:54: 0x11cfcfd in genBody (zig)
                .memcpy         => try self.airMemcpy(inst),
                                                     ^
~/projects/zig/zig/src/codegen/llvm.zig:1232:35: 0x11c9e51 in updateFunc (zig)
        fg.genBody(air.getMainBody()) catch |err| switch (err) {
                                  ^
~/projects/zig/zig/src/link/Elf.zig:2533:74: 0x11d2b2e in updateFunc (zig)
        if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(module, func, air, liveness);
                                                                         ^
~/projects/zig/zig/src/link.zig:578:77: 0xf0794d in updateFunc (zig)
            .elf   => return @fieldParentPtr(Elf,   "base", base).updateFunc(module, func, air, liveness),
                                                                            ^
~/projects/zig/zig/src/Module.zig:4383:37: 0xcca74c in ensureFuncBodyAnalyzed (zig)
            comp.bin_file.updateFunc(mod, func, air, liveness) catch |err| switch (err) {
                                    ^
~/projects/zig/zig/src/Compilation.zig:3127:42: 0xcc7c5d in processOneJob (zig)
            module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
                                         ^
~/projects/zig/zig/src/Compilation.zig:3064:30: 0xb5961e in performAllTheWork (zig)
            try processOneJob(comp, work_item, main_progress_node);
                             ^
~/projects/zig/zig/src/Compilation.zig:2020:31: 0xb5596d in update (zig)
    try comp.performAllTheWork(main_progress_node);
                              ^
~/projects/zig/zig/src/main.zig:3820:24: 0xb87104 in updateModule (zig)
        try comp.update(main_progress_node);
                       ^
~/projects/zig/zig/src/main.zig:3255:17: 0x9f397e in buildOutputType (zig)
    updateModule(comp) catch |err| switch (err) {
                ^
~/projects/zig/zig/src/main.zig:273:31: 0x9c4806 in mainArgs (zig)
        return buildOutputType(gpa, arena, args, .zig_test);
                              ^
~/projects/zig/zig/src/main.zig:211:20: 0x9c3a85 in main (zig)
    return mainArgs(gpa, arena, args);
                   ^
~/projects/zig/zig/lib/std/start.zig:609:37: 0x9c63a4 in main (zig)
            const result = root.main() catch |err| {
                                    ^
Aborted

Expected Behavior

no crash. i would expect this to compile as dest is allowed to be a multiptr in the docs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behavior

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions