cl goin crazy??



  • Visual Studio 2022 (v17.4.4), cl v19.34.31937

    Code:

    #include <cstddef>
    #include <bitset>
    #include <iostream>
    
    int main()
    {
    	std::size_t constexpr digits{ 32 };
    
    	for (std::size_t i = 0; i < digits; ++i) {
    		std::cout << i << '\t' << std::bitset<digits>{ 1ull << i } << '\n';
    		std::cout.flush();  // desperation
    	}
    	std::cout.put('\n');
    }
    

    output win32:

    0       00000000000000000000000000000001
    1       00000000000000000000000000000010
    2       00000000000000000000000000000100
    3       00000000000000000000000000001000
    4       00000000000000000000000000010000
    5       00000000000000000000000000100000
    6       00000000000000000000000001000000
    7       00000000000000000000000010000000
    8       00000000000000000000000100000000
    9       00000000000000000000001000000000
    10      00000000000000000000010000000000
    11      00000000000000000000100000000000                                                                                6       00000000000000000000000001000000
    7       00000000000000000000000010000000
    8       00000000000000000000000100000000
    9       00000000000000000000001000000000
    10      00000000000000000000010000000000
    11      00000000000000000000100000000000
    12      00000000000000000001000000000000
    13      00000000000000000010000000000000
    14      00000000000000000100000000000000
    15      00000000000000001000000000000000
    16      00000000000000010000000000000000
    17      00000000000000100000000000000000
    18      00000000000001000000000000000000
    19      00000000000010000000000000000000
    20      00000000000100000000000000000000
    21      00000000001000000000000000000000
    22      00000000010000000000000000000000
    23      00000000100000000000000000000000
    24      00000001000000000000000000000000
    25      00000010000000000000000000000000
    26      00000100000000000000000000000000
    27      00001000000000000000000000000000
    28      00010000000000000000000000000000
    29      00100000000000000000000000000000
    

    output x64:

    0       00000000000000000000000000000001
    1       00000000000000000000000000000010
    2       00000000000000000000000000000100
    3       00000000000000000000000000001000
    4       00000000000000000000000000010000
    5       00000000000000000000000000100000
    6       00000000000000000000000001000000
    7       00000000000000000000000010000000
    8       00000000000000000000000100000000
    9       00000000000000000000001000000000
    10      00000000000000000000010000000000
    11      00000000000000000000100000000000                                                                                6       00000000000000000000000001000000
    7       00000000000000000000000010000000
    8       00000000000000000000000100000000
    9       00000000000000000000001000000000
    10      00000000000000000000010000000000
    11      00000000000000000000100000000000
    12      00000000000000000001000000000000
    13      00000000000000000010000000000000
    14      00000000000000000100000000000000
    15      00000000000000001000000000000000
    16      00000000000000010000000000000000
    17      00000000000000100000000000000000
    18      00000000000001000000000000000000
    19      00000000000010000000000000000000
    20      00000000000100000000000000000000
    21      00000000001000000000000000000000
    22      00000000010000000000000000000000
    23      00000000100000000000000000000000
    24      00000001000000000000000000000000
    25      00000010000000000000000000000000
    26      00000100000000000000000000000000
    27      00001000000000000000000000000000
    28      00010000000000000000000000000000
    29      00100000000000000000000000000000
    

    What the verdammt??


  • Mod

    Hast du jetzt versehentlich 2x die gleiche unerwartete Ausgabe gezeigt, oder wolltest du eigentlich zeigen, dass es bei einem von beidem geht und beim anderen nicht?



  • Nene, bei beidem der selbe Mist.


  • Mod

    Puh, übel. Kannst du Assemblerausgabe zeigen, so dass man nachvollziehen kann, was da passiert? Das scheint ja eher ein Fehler im Programmablauf zu sein, als ein Timingproblem mit der Ausgabe, sonst wäre es nicht 2x exakt das gleiche



  • Ja, kann ich wenn Du mir einen Moment gibst.



  • win32:

    #include <cstddef>
    #include <bitset>
    #include <iostream>
    
    int main()
    {
    008184C0  push        ebp  
    008184C1  mov         ebp,esp  
    008184C3  sub         esp,0ECh  
    008184C9  push        ebx  
    008184CA  push        esi  
    008184CB  push        edi  
    008184CC  lea         edi,[ebp-2Ch]  
    008184CF  mov         ecx,0Bh  
    008184D4  mov         eax,0CCCCCCCCh  
    008184D9  rep stos    dword ptr es:[edi]  
    008184DB  mov         ecx,offset _47F81F2A_main@cpp (082706Eh)  
    008184E0  call        @__CheckForDebuggerJustMyCode@4 (0811618h)  
    	std::size_t constexpr digits{ 32 };
    008184E5  mov         dword ptr [digits],20h  
    
    	for (std::size_t i = 0; i < digits; ++i) {
    008184EC  mov         dword ptr [ebp-14h],0  
    008184F3  jmp         __$EncStackInitStart+32h (08184FEh)  
    008184F5  mov         eax,dword ptr [ebp-14h]  
    008184F8  add         eax,1  
    008184FB  mov         dword ptr [ebp-14h],eax  
    008184FE  cmp         dword ptr [ebp-14h],20h  
    00818502  jae         __$EncStackInitStart+0C3h (081858Fh)  
    		std::cout << i << '\t' << std::bitset<digits>{ 1ull << i } << '\n';
    00818508  mov         esi,esp  
    0081850A  mov         eax,dword ptr [ebp-14h]  
    0081850D  push        eax  
    0081850E  mov         ecx,dword ptr [__imp_std::cout (08250F8h)]  
    00818514  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0825100h)]  
    0081851A  cmp         esi,esp  
    0081851C  call        __RTC_CheckEsp (0811479h)  
    00818521  push        9  
    00818523  push        eax  
    00818524  call        std::operator<<<std::char_traits<char> > (0811190h)  
    00818529  add         esp,8  
    0081852C  mov         dword ptr [ebp-0E8h],eax  
    00818532  mov         eax,1  
    00818537  xor         edx,edx  
    00818539  mov         ecx,dword ptr [ebp-14h]  
    0081853C  call        __allshl (0811749h)  
    00818541  push        edx  
    00818542  push        eax  
    00818543  lea         ecx,[ebp-0E0h]  
    00818549  call        std::bitset<32>::bitset<32> (08113C0h)  
    0081854E  mov         dword ptr [ebp-0ECh],eax  
    00818554  mov         ecx,dword ptr [ebp-0ECh]  
    0081855A  push        ecx  
    0081855B  mov         edx,dword ptr [ebp-0E8h]  
    00818561  push        edx  
    00818562  call        std::operator<<<char,std::char_traits<char>,32> (08114FBh)  
    00818567  add         esp,8  
    0081856A  push        0Ah  
    0081856C  push        eax  
    0081856D  call        std::operator<<<std::char_traits<char> > (0811190h)  
    00818572  add         esp,8  
    		std::cout.flush();  // desperation
    00818575  mov         esi,esp  
    00818577  mov         ecx,dword ptr [__imp_std::cout (08250F8h)]  
    0081857D  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::flush (08250A0h)]  
    00818583  cmp         esi,esp  
    00818585  call        __RTC_CheckEsp (0811479h)  
    	}
    0081858A  jmp         __$EncStackInitStart+29h (08184F5h)  
    	std::cout.put('\n');
    0081858F  mov         esi,esp  
    00818591  push        0Ah  
    00818593  mov         ecx,dword ptr [__imp_std::cout (08250F8h)]  
    00818599  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::put (08250A4h)]  
    0081859F  cmp         esi,esp  
    008185A1  call        __RTC_CheckEsp (0811479h)  
    }
    008185A6  xor         eax,eax  
    008185A8  pop         edi  
    008185A9  pop         esi  
    008185AA  pop         ebx  
    008185AB  add         esp,0ECh  
    008185B1  cmp         ebp,esp  
    008185B3  call        __RTC_CheckEsp (0811479h)  
    008185B8  mov         esp,ebp  
    008185BA  pop         ebp  
    008185BB  ret  
    

    x64:

    int main()
    {
    00007FF795B68780  push        rbp  
    00007FF795B68782  push        rdi  
    00007FF795B68783  sub         rsp,158h  
    00007FF795B6878A  lea         rbp,[rsp+20h]  
    00007FF795B6878F  lea         rcx,[__47F81F2A_main@cpp (07FF795B7D06Eh)]  
    00007FF795B68796  call        __CheckForDebuggerJustMyCode (07FF795B61695h)  
    	std::size_t constexpr digits{ 32 };
    00007FF795B6879B  mov         qword ptr [digits],20h  
    
    	for (std::size_t i = 0; i < digits; ++i) {
    00007FF795B687A3  mov         qword ptr [rbp+28h],0  
    00007FF795B687AB  jmp         main+38h (07FF795B687B8h)  
    00007FF795B687AD  mov         rax,qword ptr [rbp+28h]  
    00007FF795B687B1  inc         rax  
    00007FF795B687B4  mov         qword ptr [rbp+28h],rax  
    00007FF795B687B8  cmp         qword ptr [rbp+28h],20h  
    00007FF795B687BD  jae         main+0C7h (07FF795B68847h)  
    		std::cout << i << '\t' << std::bitset<digits>{ 1ull << i } << '\n';
    00007FF795B687C3  mov         rdx,qword ptr [rbp+28h]  
    00007FF795B687C7  mov         rcx,qword ptr [__imp_std::cout (07FF795B7B150h)]  
    00007FF795B687CE  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF795B7B170h)]  
    00007FF795B687D4  mov         dl,9  
    00007FF795B687D6  mov         rcx,rax  
    00007FF795B687D9  call        std::operator<<<std::char_traits<char> > (07FF795B61500h)  
    00007FF795B687DE  mov         qword ptr [rbp+118h],rax  
    00007FF795B687E5  mov         rax,qword ptr [rbp+28h]  
    00007FF795B687E9  mov         ecx,1  
    00007FF795B687EE  mov         qword ptr [rbp+120h],rcx  
    00007FF795B687F5  movzx       ecx,al  
    00007FF795B687F8  mov         rax,qword ptr [rbp+120h]  
    00007FF795B687FF  shl         rax,cl  
    00007FF795B68802  mov         rdx,rax  
    00007FF795B68805  lea         rcx,[rbp+104h]  
    00007FF795B6880C  call        std::bitset<32>::bitset<32> (07FF795B61717h)  
    00007FF795B68811  mov         qword ptr [rbp+128h],rax  
    00007FF795B68818  mov         rdx,qword ptr [rbp+128h]  
    00007FF795B6881F  mov         rcx,qword ptr [rbp+118h]  
    00007FF795B68826  call        std::operator<<<char,std::char_traits<char>,32> (07FF795B61712h)  
    00007FF795B6882B  mov         dl,0Ah  
    00007FF795B6882D  mov         rcx,rax  
    00007FF795B68830  call        std::operator<<<std::char_traits<char> > (07FF795B61500h)  
    		std::cout.flush();  // desperation
    00007FF795B68835  mov         rcx,qword ptr [__imp_std::cout (07FF795B7B150h)]  
    00007FF795B6883C  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::flush (07FF795B7B160h)]  
    	}
    00007FF795B68842  jmp         main+2Dh (07FF795B687ADh)  
    	std::cout.put('\n');
    00007FF795B68847  mov         dl,0Ah  
    00007FF795B68849  mov         rcx,qword ptr [__imp_std::cout (07FF795B7B150h)]  
    00007FF795B68850  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::put (07FF795B7B168h)]  
    }
    00007FF795B68856  xor         eax,eax  
    00007FF795B68858  lea         rsp,[rbp+138h]  
    00007FF795B6885F  pop         rdi  
    00007FF795B68860  pop         rbp  
    00007FF795B68861  ret  
    

  • Mod

    Erwarte nicht viel von mir 🙂 Meine Assemblerkenntnisse sind zu rudimentär um hier mehr als einen extrem offensichtlichen Fehler zu diagnostizieren. Aber vielleicht hilft es jemand anderem, der das besser kann.



  • @SeppJ Da sitzen wir zur Abwechslung mal im selben Boot ^^
    (Aber mein Hass auf cl steigt merklich)

    Ohne dem bitset

    #include <cstddef>
    #include <bitset>
    #include <iostream>
    
    int main()
    {
    	std::size_t constexpr digits{ 32 };
    
    	for (std::size_t i = 0; i < digits; ++i) {
    		std::cout << i << '\t' /* << std::bitset<digits>{ 1ull << i } */ << '\n';
    		std::cout.flush();  // desperation
    	}
    	std::cout.put('\n');
    }
    

    zählt wenigstens i richtig.



  • @Others: Hilfts eher wenn ich ASM von release-builds bringe ohne debug-gedöhns?

    release win32:

    #include <cstddef>
    #include <bitset>
    #include <iostream>
    
    int main()
    {
    00601220  push        ebp  
    00601221  mov         ebp,esp  
    00601223  and         esp,0FFFFFFF8h  
    00601226  sub         esp,8  
    00601229  push        esi  
    0060122A  push        edi  
    	std::size_t constexpr digits{ 32 };
    
    	for (std::size_t i = 0; i < digits; ++i) {
    0060122B  xor         esi,esi  
    0060122D  nop         dword ptr [eax]  
    		std::cout << i << '\t' << std::bitset<digits>{ 1ull << i } << '\n';
    00601230  mov         ecx,dword ptr [__imp_std::cout (0603070h)]  
    00601236  push        esi  
    00601237  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0603034h)]  
    0060123D  mov         dl,9  
    0060123F  mov         ecx,eax  
    00601241  call        std::operator<<<std::char_traits<char> > (06013B0h)  
    00601246  mov         edx,esi  
    00601248  xor         edi,edi  
    0060124A  bts         edi,edx  
    0060124D  xor         ecx,ecx  
    0060124F  cmp         edx,20h  
    00601252  lea         edx,[esp+0Ch]  
    00601256  cmovae      ecx,edi  
    00601259  xor         edi,ecx  
    0060125B  mov         ecx,eax  
    0060125D  mov         dword ptr [esp+0Ch],edi  
    00601261  call        std::operator<<<char,std::char_traits<char>,32> (06015C0h)  
    00601266  mov         dl,0Ah  
    00601268  mov         ecx,eax  
    0060126A  call        std::operator<<<std::char_traits<char> > (06013B0h)  
    		std::cout.flush();  // desperation
    0060126F  mov         ecx,dword ptr [__imp_std::cout (0603070h)]  
    00601275  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::flush (060303Ch)]  
    0060127B  inc         esi  
    0060127C  cmp         esi,20h  
    0060127F  jb          main+10h (0601230h)  
    	}
    	std::cout.put('\n');
    00601281  mov         ecx,dword ptr [__imp_std::cout (0603070h)]  
    00601287  push        0Ah  
    00601289  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::put (0603038h)]  
    }
    0060128F  pop         edi  
    00601290  xor         eax,eax  
    00601292  pop         esi  
    00601293  mov         esp,ebp  
    00601295  pop         ebp  
    00601296  ret  
    

    release x64:

    #include <cstddef>
    #include <bitset>
    #include <iostream>
    
    int main()
    {
    00007FF7B8C11290  mov         qword ptr [rsp+10h],rbx  
    00007FF7B8C11295  push        rdi  
    00007FF7B8C11296  sub         rsp,20h  
    	std::size_t constexpr digits{ 32 };
    
    	for (std::size_t i = 0; i < digits; ++i) {
    00007FF7B8C1129A  xor         edi,edi  
    00007FF7B8C1129C  lea         ebx,[rdi+1]  
    00007FF7B8C1129F  nop  
    		std::cout << i << '\t' << std::bitset<digits>{ 1ull << i } << '\n';
    00007FF7B8C112A0  mov         rcx,qword ptr [__imp_std::cout (07FF7B8C130B8h)]  
    00007FF7B8C112A7  mov         rdx,rdi  
    00007FF7B8C112AA  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF7B8C130F8h)]  
    00007FF7B8C112B0  mov         rcx,rax  
    00007FF7B8C112B3  mov         dl,9  
    00007FF7B8C112B5  call        std::operator<<<std::char_traits<char> > (07FF7B8C113E0h)  
    00007FF7B8C112BA  lea         rdx,[rsp+30h]  
    00007FF7B8C112BF  mov         dword ptr [rsp+30h],ebx  
    00007FF7B8C112C3  mov         rcx,rax  
    00007FF7B8C112C6  call        std::operator<<<char,std::char_traits<char>,32> (07FF7B8C115A0h)  
    00007FF7B8C112CB  mov         rcx,rax  
    00007FF7B8C112CE  mov         dl,0Ah  
    00007FF7B8C112D0  call        std::operator<<<std::char_traits<char> > (07FF7B8C113E0h)  
    		std::cout.flush();  // desperation
    00007FF7B8C112D5  mov         rcx,qword ptr [__imp_std::cout (07FF7B8C130B8h)]  
    00007FF7B8C112DC  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::flush (07FF7B8C130A8h)]  
    00007FF7B8C112E2  inc         rdi  
    00007FF7B8C112E5  rol         rbx,1  
    00007FF7B8C112E8  cmp         rdi,20h  
    00007FF7B8C112EC  jb          main+10h (07FF7B8C112A0h)  
    	}
    	std::cout.put('\n');
    00007FF7B8C112EE  mov         rcx,qword ptr [__imp_std::cout (07FF7B8C130B8h)]  
    00007FF7B8C112F5  mov         dl,0Ah  
    00007FF7B8C112F7  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::put (07FF7B8C130F0h)]  
    }
    00007FF7B8C112FD  mov         rbx,qword ptr [rsp+38h]  
    00007FF7B8C11302  xor         eax,eax  
    00007FF7B8C11304  add         rsp,20h  
    00007FF7B8C11308  pop         rdi  
    00007FF7B8C11309  ret  
    


  • @SeppJ Am C++-input irgendwas auszusetzten was phöse ausgehen könnte?


  • Mod

    Ich sehe nichts offensichtliches. Riecht nach einem Fehler im Bitset, aber so einen krassen Fehler würde ich einem großen Compiler eigentlich nicht zutrauen



  • Mit bitset scheint es nichts zu tun zu haben. Es tritt selbst bei der einfachsten Schleife auf:

    #include <iostream>
    
    int main()
    {
    	for (std::size_t i = 0; i < 32; i++)
    	{
    		std::cout << i << std::endl;
    	}
    }
    


  • @Swordfish sagte in cl goin crazy??:

    std::bitset<digits>{ 1ull << i }

    Was kommt heraus wenn du den obigen Teil in eine Variable auslagerst?



  • Das Verhalten ist auch anders wenn man es mit F5 oder mit STRG + F5 ausführt. Der Bug tritt nur ohne Debugger auf. Vielleicht gar kein Fehler im Compiler sondern im Runner. Oder das neue Terminal.



  • @Quiche-Lorraine schon probiert. dasselbe.



  • @servus_ dadsächlich. Mit debugger passts. Ich geh' bugreport schreiben.



  • Der Fehler tritt auch erst auf, wenn die Scrollbar des Terminals eingeblendet werden muss 😃
    Also bei ca. 30 Zeilen.



  • @servus_ sagte in cl goin crazy??:

    Der Fehler tritt auch erst auf, wenn die Scrollbar des Terminals eingeblendet werden muss 😃
    Also bei ca. 30 Zeilen.

    Klingt jetzt stark, dass das Terminal hier Probleme hat.
    Tritt es auch auf wenn man das test programm unter cmd.exe oder powershell startet?
    Dadurch könnte man eventuell herausfinden ob es wirklich am neuen Terminal liegt.



  • @firefly sagte in cl goin crazy??:

    @servus_ sagte in cl goin crazy??:

    Der Fehler tritt auch erst auf, wenn die Scrollbar des Terminals eingeblendet werden muss 😃
    Also bei ca. 30 Zeilen.

    Klingt jetzt stark, dass das Terminal hier Probleme hat.
    Tritt es auch auf wenn man das test programm unter cmd.exe oder powershell startet?
    Dadurch könnte man eventuell herausfinden ob es wirklich am neuen Terminal liegt.

    In einem selbst geöffneten Terminal gibt es auch keine Probleme. Visual Studio scheint schon mit beteiligt zu sein. 🙂

    Selbst wenn man ohne Debugger startet, steht im Terminal als Titel "Microsoft Visual Studio Debug Console".

    Ich vermute, dass der Fehler in folgendem Programm liegt:

    C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE\CommonExtensions\Microsoft\Terminal\ServiceHub\os64\OpenConsole.exe



  • @servus_ sagte in cl goin crazy??:

    @firefly sagte in cl goin crazy??:

    @servus_ sagte in cl goin crazy??:

    Der Fehler tritt auch erst auf, wenn die Scrollbar des Terminals eingeblendet werden muss 😃
    Also bei ca. 30 Zeilen.

    Klingt jetzt stark, dass das Terminal hier Probleme hat.
    Tritt es auch auf wenn man das test programm unter cmd.exe oder powershell startet?
    Dadurch könnte man eventuell herausfinden ob es wirklich am neuen Terminal liegt.

    In einem selbst geöffneten Terminal gibt es auch keine Probleme. Visual Studio scheint schon mit beteiligt zu sein. 🙂

    Selbst wenn man ohne Debugger startet, steht im Terminal als Titel "Microsoft Visual Studio Debug Console". Da ist wohl der Fehler.

    Ist doch gut wenn man was ausschließen kann 😉


Anmelden zum Antworten