Действительно ли gcc делает выделение памяти интеллектуально, чтобы предотвратить переполнение буфера?проблема выделения памяти gcc - атака переполнения буфера
int function(char *str) {
int a = 0; // See the
char b[16] = "abcd"; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
и
int function(char *str) {
char b[16] = "abcd"; // See the
int a = 0; // changes here
if(!strcmp(b, str))
a = 1;
return a;
}
Когда я отлаживать его с помощью GDB, он всегда выделяет память сначала целочисленных переменных, а затем массив символов; независимо от того, что является порядком объявления переменной. т. Е. В обоих случаях компилятор сначала выделяет память a
, а затем - b
.
(higher address)
Memory
| |
| |
+--------+
| |
| |
| |
| |
+--------+ <----- b (16 bytes)
| |
+--------+ <----- a (4 bytes)
| |
(lower address)
Таким образом, даже если мы поставляем более 16 символов в str
, он не может повлиять на значение a
. Может ли кто-нибудь помочь мне здесь?
спасибо.
_The Standard_ допускает такое переупорядочение для любых целей, которые компилятор хочет выполнить. Наиболее распространенная - оптимизация. Это по-прежнему «интеллект», но не для предотвращения «атаки переполнения буфера». И это все еще неопределенное поведение_ (переполнение буфера) –