OMG,-10==10 in linux!
-
Hallo,
gerade im Fefeblog gelesen, wollte euch das nicht vorenthalten. Nachfolgenden Code unter Linux mit dem Gcc compilieren und einfach mal gucken, was er ausgibt:
#include <iostream> using namespace std; int main () { int i=2; if( -10*abs (i-1) == 10*abs(i-1) ) cout << ("OMG,-10==10 in linux!\n"); else cout << ("nothing special here\n"); } $ g++ test.cpp && ./a.outHat einer eine Theorie zu dem Verhalten
?
-
$ g++ -ansi -pedantic -o lol2 lol2.cpp lol2.cpp: In function »int main()«: lol2.cpp:7: Fehler: expected primary-expression before »else« lol2.cpp:7: Fehler: expected `;' before »else«EDIT://
Und bevor sich einer wegen der -ansi -pedantic option beschwehrt, den Fehler gibt's auch ohne
-
Bei mir kompiliert der Code einwandfrei.
Hab aber bisher auch keine Erklärung für dieses Verhalten:Ich hab das Ganze mal etwas eingegrenzt, vll findet ja jemand anders den Fehler:
1 #include <iostream> 2 3 int main () { 4 int i=0; 5 asm("#bugA"); 6 int res= abs(i-1)*(-2); 7 asm("#bugE"); 8 std::cout << res << std::endl; 9 }thomas@macbook:~$ g++ test.cpp -O0 -lm -ansi -pedantic && ./a.out 2Sollte aber -2 ergeben
... 264 #APP 265 #bugA 266 .loc 3 6 0 267 #NO_APP 268 movl -12(%ebp), %eax 269 addl %eax, %eax 270 negl %eax 271 addl $2, %eax 272 movl %eax, %edx 273 sarl $31, %edx 274 xorl %edx, %eax 275 movl %eax, -8(%ebp) 276 subl %edx, -8(%ebp) 277 .loc 3 7 0 278 #APP 279 #bugE 280 .loc 3 8 0 ...Meine Assemblerkenntnisse sind leider sehr beschränkt,
aber das sollte die fehlerhafte Stelle sein.
-
Der Fehler bei mir ist auf falsche echo - Anwendung zurückzuführen. -.-
-
http://www.nabble.com/-PATCH--Fix-PR34130,-extract_muldiv-broken-t4826688.html
ist doch schon seit 3 tagen gefixt
aber ist natürlich ein richtiger gau, wer auch immer diese abs optimierung in den gcc gemacht hat ist vermutlich seinen svn account los.

-
Könnte ev. jemand mal die Versionsnummer posten die 'davon' betroffen ist ?
-
Nach LKML sind alle GCC Versionen ab 3.* betroffen. Als workarounf funktioniert -fno-builtin