2015-07-02 2 views
-3
void go() 
{ 
    //{1} 
    char buffer[2]; 
    gets(buffer); 
    //{2} 
    cout << allow; 
} 

Я попытался запустить описанную выше процедуру в 2-х случаях:переполнения буфера - Изменения переменных

-1st: Я объявляю «ИНТ позволяет;» в позиции 1

-2nd: Я объявляю «int allow;»; в позиции 2

В обоих случаях, когда я попытался ввести строку «123» (без кавычек), значение allow было равно 51. Однако, когда я прочитал о макете памяти, только в первом случае , позиция «allow» в стеке находится перед буфером, что означает, что, когда строка длиннее буфера, изменяется значение «allow».

Затем я попытался объявить «char sth [10]» в обоих положениях. На этот раз, только когда я объявил sth в первой позиции, значение было изменено.

Может ли кто-нибудь объяснить, что произошло?

+0

Установили ли вы позволить в любое другое значение, прежде чем '' получает ...? – Amit

+5

Нет никакой гарантии, как переменные выложены в памяти на основе того, где они объявлены. –

+0

Ничего себе, вы на самом деле пытаетесь обнаружить разбивку стека на уровне приложения? В любом случае, второй комментарий Пола Томблина выше. – balajeerc

ответ

3

Поскольку изменения allow через переполнение Undefined Behavior, компилятор может даже не иметь переменную allow на все и изменить свой код cout << 0 вместо при компиляции с оптимизацией. Это не действительный способ проверки переполнения, независимо от того, где вы положили allow.

Поднять выделение: Все изменения allow Вы видите, результат UB. В этом стандарте нет никаких гарантий того, что так было. Вы можете идти дальше и рассуждать о том, почему вы видите этот результат сегодня, в вашей системе, с этой самой инструментальной цепочкой, но результат может измениться на что угодно (как ваша программа, перемещающая вашу лужайку или кражу драгоценностей короны) для любой reason ,

Действительно, безопасно использовать gets. Вот почему он удаляется как в текущем стандарте C++, так и в C.

Вы можете использовать std::string и std::getline вместо:

string buffer; 
std::getline(std::cin, buffer); 
Смежные вопросы