Am Montag, 9. Dezember 2024 um 19:50:19 MEZ hat Johannes Khoshnazar-Thoma 
<johan...@johannesthoma.com> Folgendes geschrieben:

> Hi:
>
> When compiling following C program:
>
> #include <stdio.h>
>
> int main(int argc, char ** argv)
> {
>     volatile unsigned long long a = 0;
>     volatile unsigned long long b = a + (1ULL << 63);
>
>     if (((long long) a - (long long) b) >= 0)
>         printf("wrong\n");
>     else
>         printf("right\n");
>
>     return 0;
> }
>
> with mingw gcc compiler:
>
> /home/johannes/.zeranoe/mingw-w64/x86_64/bin/x86_64-w64-mingw32-gcc --version
> x86_64-w64-mingw32-gcc (GCC) 12.3.1 20230814
>
> and -O2 the output of the program is:
>
> wrong
>
> When compiling without -O2 or compiling on another gcc (the one that comes
> with Linux Ubuntu for example) the result is:
>
> right
>
> Is the above comparision in the C program something that is undefined?
>
> Looking at the assembly code the difference seems to be the
> conditional jump expression: it is
>
>     js    .L4
>
> in the right case and
>
>     jl    .L4
>
> in the wrong case.
>
> My 8086 assembly is almost about 35-40 years old, however I recall
> that jl jumps if operand 2 is less than operand 1 (in System-V
> syntax ...).
>
> Is this maybe a mingw gcc bug?

UBSAN [1] says it's undefined behavior, and I would tend to agree:

example.c:8:24: runtime error: signed integer overflow: 0 - 
-9223372036854775808 cannot be represented in type 'long long int'

[1] https://godbolt.org/z/TcvYsec8j


Hannes


_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to