Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Почему следующий код не приводит к сегфолту?

#include
int main() { int i = 0; unsigned char (*b)[5];
b = malloc( 5 );
for ( ; i < 100 ; i++ ) {
*(b+i)[0] = 192; *(b+i)[1] = 168; *(b+i)[2] = 0; *(b+i)[3] = 1+i;
printf( "%d.%d.%d.%d
", *(b+i)[0], *(b+i)[1], *(b+i)[2], *(b+i)[3] ); }
return 0; }
В моем понимании функция malloc() выделяет только 5 байт , и как минимум на 6-м шаге цикла ( i == 5 ) указатель должен выйти за рамки отведенной процессу памяти, почему этого не происходит?
Собираю с помощью gcc version 4.9.2 (Debian 4.9.2-10)


Ответ

Из комментария пользователя @nick_n_a
Потому что размер страницы памяти 4096 байт (по умолчанию, так сказать «квант» памяти), и fail может наступить только если для следущей страницы не сделано allocate. Поэтому даже переходя за грань 4096 fail может быть а может и не быть. Пока программа маленькая такие трюки могут заканчиваться ничем, а при большой программе можно получить глюки, которые очень сложно отловить.
Если у вас стоит задача получить seg-fail, то можно пробовать читать/писать с шагом 4096 байт.

Комментариев нет:

Отправить комментарий