UTF8 操作ライブラリの単体テストを書いていますが、関数がバッファ オーバーフローに陥った場合にテストで segfault を実行したいと考えています。そこで、メモリ内で隣り合う 2 つのページを mmap するというアイデアを思いつきました。PROT_WRITE、および PROT_NONE の 2 番目。そうすれば、オーバーフローが発生した場合、segfault が保証されます。次に例を示します。
void *addr1, *addr2; /* these are the pages; mmap call left out for simplicity */
char *p = (char *) (addr1 + getpagesize() - 8);
utf8_encode(aUtf8String, p, 8); // this shouldn't segfault
問題は、2 番目のページをマップすると、プログラムでセグメンテーション違反が発生することです。問題を再現するプログラムの例を次に示します (GNU/Linux):
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
void checkMap(void *p)
{
if(p == MAP_FAILED) {
printf("error running mmap: %s\n", strerror(errno));
exit(1);
}
}
int main(void)
{
void *addr1, *addr2;
size_t pagesize;
pagesize = getpagesize();
checkMap(addr1 = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
checkMap(addr2 = mmap(addr1 + pagesize, pagesize, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED, -1, 0)); /* segfaults */
munmap(addr1, pagesize);
munmap(addr2, pagesize);
return 0;
}
興味深いことに、最初の mmap() の前に printf() ステートメントがあると、プログラムが正常に実行されます。mmap がセグメンテーション違反を起こしている理由を知っている人はいますか? 私の目標が mmap() を使用して達成できない場合、バッファオーバーフローについてコードをテストする方法について他にアドバイスはありますか?