私は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 googletestとgooglemockを使用しています。
代わりに、いくつかの静的ツール解析を実行し、C-Castを禁止することができます。 – Jarod42
@nwpはい、意味があります。私は '-fsanitize = address'でコンパイルしてリンクすることでgccでAsanを使用しようとしましたが、out-of-bounds-readを検出しませんでした。 Ubsanは残念ながらgcc 4.9からしか利用できません。 – sigy
@nwpコメントを回答に変換しますか? UBsanを使ってテストを中止するのは私の質問に対する正解ですが、ATMには使えないので実装できません – sigy