2017-02-08 8 views
1

私はfoo()での問題は、それがバッファの終わりを過ぎて読むようsizeof(int)が、私のプラットフォーム上で4であるということであるテスト中のユニットは、バッファの過去の終了を読み取ります - テストが失敗する方法を確認するには?

int foo(Bar *obj) 
{ 
    char buffer[2]; 

    readDataIntoBuffer(buffer, 2); 

    return obj->processData((int*)buffer); 
} 

のようなものに単純化することができ、いくつかの方法foo()のためのユニットテストを書かれています。

私のユニットテストでは、期待値を指すポインターでprocessDataが呼び出されていることを確認します(バーの模擬バージョンで)。しかし、私の問題はそれが薄れているということです。私の推測は、それはバッファの後の2バイトのメモリのややランダムな内容に依存するということです。もしそれらがゼロになるとテストは合格しますが、失敗した場合は失敗します。processDataは何らかのランダム値で呼び出されます。

私のテストが必ず失敗することを確認するにはどうすればよいですか? processDataが期待値で呼び出されているかどうか、私は気にしないでください。

重要な場合は、gccバージョン4.8.4 googletestgooglemockを使用しています。

+0

代わりに、いくつかの静的ツール解析を実行し、C-Castを禁止することができます。 – Jarod42

+0

@nwpはい、意味があります。私は '-fsanitize = address'でコンパイルしてリンクすることでgccでAsanを使用しようとしましたが、out-of-bounds-readを検出しませんでした。 Ubsanは残念ながらgcc 4.9からしか利用できません。 – sigy

+0

@nwpコメントを回答に変換しますか? UBsanを使ってテストを中止するのは私の質問に対する正解ですが、ATMには使えないので実装できません – sigy

答えて

1

コードには未定義の動作があります。定義によって、テストが期待する動作やテストがスキップされるなど、何かが起こる可能性があるため、プログラム内からテストを失敗させる方法はありません。

私はAsan + UBsanまたは同様のツールを使用して、動作を定義してテスト可能にすることをお勧めします。

関連する問題