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.out
    

    Hat 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
    2
    

    Sollte 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


Anmelden zum Antworten