Undefined compiler behaviour or a compiler bug?

Dimitry Andric dim at FreeBSD.org
Thu Apr 29 22:14:01 UTC 2021

On 29 Apr 2021, at 23:11, Hans Petter Selasky <hps at selasky.org> wrote:
> On 4/29/21 11:06 PM, Hans Petter Selasky wrote:
>> Hi,
>> Can someone please explain what C-compiler flag I'm missing, to make this simple C-program terminate?
>> I have a function _abs() which at some point is equal to one, but the compiler thinks it is not required to emit the test for the while() at all, looking at the assembly code! A printf() clearly verifies that the _abs() function has returned one.
>> clang11 -O2 test.c && ./a.out
> Looks like -fwrapv fixes the issue.

Indeed, in this case UBSan can help you diagnose the issue. E.g.:

% clang -fsanitize=undefined test.c -o test
% ./test
Y:0x00000001 ABS:0x00000011
Y:0x00000007 ABS:0x00000041
Y:0x00000019 ABS:0x00000281
Y:0x00000027 ABS:0x00000601
Y:0x000000d9 ABS:0x0000b801
Y:0x00000327 ABS:0x0009f001
Y:0x000004d9 ABS:0x00178001
Y:0x00003b27 ABS:0x0dab0001
Y:0x000044d9 ABS:0x12840001
test.c:20:26: runtime error: signed integer overflow: 46341 * 46341 cannot be represented in type 'int'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior test.c:20:26 in
Y:0x0001bb27 ABS:0xff200001
Y:0x000e44d9 ABS:0x9a400001
Y:0x0011bb27 ABS:0x64000001
Y:0x01ee44d9 ABS:0xc8000001


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 223 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.freebsd.org/pipermail/freebsd-current/attachments/20210430/781bc77a/attachment.sig>

More information about the freebsd-current mailing list