ziglang / zig

General-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
https://ziglang.org
MIT License
33.71k stars 2.47k forks source link

ReleaseSmall runtime error incorrectly returned. #20701

Open gcoakes opened 1 month ago

gcoakes commented 1 month ago

Zig Version

0.14.0-dev.367+a57479afc

Steps to Reproduce and Observed Behavior

  1. Clone my (embarrassingly incomplete) kernel:
$ git clone -b erroneous-error https://git.sr.ht/~gcoakes/kernel
  1. Ensure qemu-system-riscv64 is installed and available within your PATH environment variable:
$ which qemu-system-riscv64
  1. Run it using ReleaseSmall optimization mode (press CTRL+a, x to exit after it fails):
$ zig build run -Doptimize=ReleaseSmall
...
[ info] (default) 8273 + 49 > 8712
panic: failed to parse root task executable: ElfOutOfBounds
   0: 0x000000008020311e
   1: 0x000a7d7b20656369
  1. Observe an error printed in the last step and observe the impossibility of the conditional that produces that error (src/bootstrap/Elf.zig#L324):
    std.log.info("{} + {} > {}", .{ names_section.offset, names_section.size, data.len });
    if (names_section.offset + names_section.size > data.len)
        return error.ElfOutOfBounds;

The log statement in that function prints: 8273 + 49 > 8712

Note that the specific error which is returned seems to be that of the last defined return location within that function. If I comment out the conditional/return statement from above, it then starts returning the next last defined return error.

I apologize for not being able to minimize this further.

Expected Behavior

The run command is expected to exit without any errors being printed. This can be observed by running the same command with either -Doptimize=ReleaseSafe or no optimization hint (Debug mode):

$ zig build run -Doptimize=ReleaseSafe
...
[ info] (default) 20280 + 174 > 21616
mlugg commented 1 month ago

I should note that this seemingly-impossible behavior could happen if your code exhibited Illegal Behavior -- LLVM can and sometimes will do incredibly strange things in such cases. However, the only thing that stands out to me as suspicious is your @alignCast, but if it were invalid ReleaseSafe would catch it, so this is most likely a bug.

(Note: I haven't confirmed this is an upstream bug, but it almost certainly is, so I'll label it as such for now.)