被测单元读取缓冲区的结束 - 如何确保测试失败?

时间:2017-02-08 12:44:51

标签: c++ unit-testing

我为某些方法foo()编写了单元测试,可以简化为

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

    readDataIntoBuffer(buffer, 2);

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

foo()的问题是我的平台上sizeof(int)为4,因此它读取超出缓冲区的末尾。

在我的单元测试中,我验证processData被调用(在模拟版本的Bar上),指针指向期望值。但我的问题是它很脆弱。我的猜测是,它取决于缓冲区后面两个字节中内存的某些随机内容。如果它们恰好为零,则测试通过,但如果它们没有,则失败,因为processData被调用一些随机值。

如何确保我的测试始终失败?我是否完全正确地测试了processData被调用的预期值或者我不应该关心?

如果重要,我使用的是gcc版本4.8.4 googletestgooglemock

1 个答案:

答案 0 :(得分:1)

代码具有未定义的行为。根据定义,任何事情都可能发生,包括测试期望的行为或者跳过测试的行为,因此程序中无法使测试始终失败。

我建议使用Asan + UBsan或类似工具来定义和测试行为。