Заставить Пейдж Границу Сегфо?

Я хочу написать тест (gcc 4.7), в котором я выделяю страницу памяти, которая каким-то образом находится рядом со страницей памяти, которой не владеет мой процесс, так что неправильно выровненное чтение конца страницы должно привести к сбою.

Возможно ли это и как я могу это сделать?

0

Решение

Ты можешь использовать mprotect с защитой = PROT_NONE сделать страницу недоступной, например,

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>

int main(void)
{
char * a = valloc(4096 * 2);            // page-aligned memory allocation (two pages)

int status = mprotect(&a[4096], 4096, PROT_NONE);
if (status != 0) { perror("mprotect"); exit(1); }
// protect second page

for (int i = 0; i <= 4096; i += 256)    // test - should fail when i == 4096
{
printf("a[%d] = %u\n", i, a[i]);
}

return 0;
}

Скомпилируйте и протестируйте:

$ gcc -Wall mprotect.c && ./a.out
a[0] = 0
a[256] = 0
a[512] = 0
a[768] = 0
a[1024] = 0
a[1280] = 0
a[1536] = 0
a[1792] = 0
a[2048] = 0
a[2304] = 0
a[2560] = 0
a[2816] = 0
a[3072] = 0
a[3328] = 0
a[3584] = 0
a[3840] = 0
Bus error: 10
$

Обратите внимание, что при попытке чтения произошла ошибка шины a[4096],

Если вы запустите это под GDB, вы получите немного больше информации:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x0000000100803000
0x0000000100000eff in main () at mprotect.c:14
14          printf("a[%d] = %u\n", i, a[i]);
3

Другие решения

Я полагаю, что не существует простого способа сделать гарантию того, что вызов будет зависать.

Из немногих языков доступ за пределами выделенной (собственной) памяти undefined behaviour, И какой результат будет иметь доступ, даже неопределенный, но часто? Сегфо, но не всегда. Таким образом, решение, предоставленное Полом, может иногда выполнять работу, но не в качестве гарантии.

Если вы выполняете свою работу под контролем valgrind вы всегда можете получить segfault с доступом к памяти, которой вы не владеете. Но это не поведение по умолчанию. Также вы можете использовать гораздо больше библиотек, таких как efence или другие, чтобы поймать эти ошибки. Также memory-sanitize с более новых версий компилятора это отправная точка.

Как ответ на ваш вопрос: нет, нет никакого способа гарантировать segfault с простыми c-утверждениями.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector