Является ли 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
.
Может кто-нибудь помочь мне здесь?
Спасибо.