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