Не понимаю, почему тут нет buffer overflow?
int main()
{
char buffer[512];
char *ostr;
char *bptr;
bptr = buffer;
ostr = bptr + 10;
while ((*(ostr++) = *(bptr++)));
printf("OK\n");
return 0;
}
Почему printf выполняется и программа завершается? Разве этот while не бесконечный?
Ответы (1 шт):
Ваш конкретный код с конкретным VC++ 2019.
Оптимизатор включен:
main PROC ; COMDAT
; 15 : {
$LN10:
sub rsp, 40 ; 00000028H
; 16 : char buffer[512];
; 17 : char *ostr;
; 18 : char *bptr;
; 19 : bptr = buffer;
; 20 : ostr = bptr + 10;
; 21 : while(*(ostr++) = *(bptr++));
; 22 :
; 23 : printf("OK\n");
lea rcx, OFFSET FLAT:??_C@_03JLOMOCCD@OK?6@
call printf
Код просто выброшен, так как его выполнение формально не влияет на результат - вывод OK.
Оптимизатор отключен. Длинный код, который честно выполняет копирование с проверкой на 0. Поскольку в первых 10 символах случайно оказался 0, у меня - работает без проблем. Но если дописать
char buffer[512] = "abcdefghijk";
то код валится - потому что теперь нолика в пределах 10 символов нет.
Если вы добавите какой-то код в цикл - например,
char c;
while( c = *(ostr++) = *(bptr++)) printf("[%c]",c);
то оптимизатор уже не сможет выбросить цикл совсем, и вы получите вывод мусора (если он есть) до нулевого символа.
А вообще строго формально - у вас нет определенного поведения хотя бы потому, что в buffer изначально мусор. И спрашивать при UB, почему программа не валится - все равно что интересоваться, почему при переходе на красный цвет светофора вы остались живы :)