Не понимаю, почему тут нет 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 шт):

Автор решения: Harry

Ваш конкретный код с конкретным 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, почему программа не валится - все равно что интересоваться, почему при переходе на красный цвет светофора вы остались живы :)

→ Ссылка