goto не зло, просто им нужно уметь пользоваться, anyway компиль все равно вставит jmp если нужно. Да и вообще компиляторы нынче шибко умные.
Оригинал вида:
#include <iostream>
void dd();
int main(int argc, const char * argv[]) {
s:
if(rand() % 100 == 99){
goto e;
}
goto s;
e:
return 0;
}
Кошерно превращает в обычный цикл:
int _main(int arg0, int arg1) {
do {
rax = rand();
temp_3 = rax % 0x64;
if (temp_3 == 0x63) {
break;
}
} while (true);
return 0x0;
}
ну и на асме.
_main:
push rbp
mov rbp, rsp
sub rsp, 0x10
mov dword [ss:rbp+var_4], 0x0
mov dword [ss:rbp+var_8], edi
mov qword [ss:rbp+var_10], rsi
_100000f66: call imp___stubs__rand
mov ecx, 0x64
cdq
idiv ecx
cmp edx, 0x63
jne _100000f81
jmp _100000f86
_100000f81: jmp _100000f66
_100000f86: xor eax, eax
add rsp, 0x10
pop rbp
ret