"vector subscript out of range" 的 CppUnitTestFramework 和测试

CppUnitTestFramework and test for "vector subscript out of range"

我有一些代码想要测试。如果传递了错误的参数,我可以访问超出其范围的向量。我想测试这种情况。是否可以使用 CppUnitTestFramework 测试此代码?

 #if _ITERATOR_DEBUG_LEVEL == 2
        if (size() <= _Pos)
            {   // report error
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }

 #elif _ITERATOR_DEBUG_LEVEL == 1
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
 #endif /* _ITERATOR_DEBUG_LEVEL */

如果您想测试某些东西,那么这意味着您期望某种可预测的行为。使用 vector::operator[] 访问超出范围的项目会引发未定义的行为。在 Debug MS VS build 的情况下,您可能会得到一个断言,但在 Release build 中,任何事情都可能发生。所以测试 operator[] 是没有意义的,实际上开发人员有责任确保传递的索引值是正确的。但是如果传递的索引无效,还有 vector::at() 方法会抛出 out_of_range 异常,因此您可以这样测试它:

TEST_METHOD(VectorOutOfRangeAccess_Test)
{
    auto out_of_range_thrown{false};
    try
    {
        ::std::vector< int > const values{0, 1, 2};
        values.at(3);
    }
    catch(::std::out_of_range const &)
    {
        out_of_range_thrown = true;
    }
    catch(...){}
    Assert::IsTrue(out_of_range_thrown);
}