zig icon indicating copy to clipboard operation
zig copied to clipboard

Audit uses of std.math.isPowerOfTwo in the compiler

Open wooster0 opened this issue 1 year ago • 0 comments

When trying to compile

export fn x() u0 {
    return 0;
}

a panic happens only with a debug build of the compiler:

src/Sema.zig:23338:43: 0x9395c1 in explainWhyTypeIsNotExtern (zig)
        .Int => if (!std.math.isPowerOfTwo(ty.intInfo(sema.mod.getTarget()).bits)) {
                                          ^

In the release build of the compiler, it takes the wrong branch and exhibits incorrect behavior because we're not checking that ty.intInfo(sema.mod.getTarget()).bits) is not zero. isPowerOfTwo has a assert(value != 0) but in release optimize mode the assert is optimized out and isPowerOfTwo returns true for 0. Cases like this exist in many places in the compiler: git grep isPowerOfTwo. In many places the solution is to add x != 0 and checks.

This is a bit of a prerequisite for #15194

See also the now outdated title and description of #15888.

wooster0 avatar Jun 13 '23 21:06 wooster0