3

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() を使用して達成できない場合、バッファオーバーフローについてコードをテストする方法について他にアドバイスはありますか?

4

2 に答える 2

0

これはあなたの質問に完全に関連しているわけではありません (最終的な目標が実際にテストを機能させることでない限り) が、私見では、この種の障害処理に依存することは誤解を招く可能性があります (最も顕著なのは、複数のプラットフォームをターゲットにしている場合で、テストが不特定の動作のためにセグフォルトがトリガーされなかったというだけで失敗するはずでした)。

たとえば、必要以上に大きなバッファーを割り当て、その末尾にマーカーを配置し、上書きされたかどうかを確認するなど、別のアプローチの方が理にかなっているかもしれません。

他の人が述べたように、より複雑なテスト環境をセットアップする意思がある場合は、電気フェンス、valgrind、またはその他のツールの分析がより精巧になるでしょう。

于 2009-03-03T12:50:03.530 に答える