cppcheck在模板中使用时抱怨unreadVariable

时间:2016-10-28 13:28:52

标签: c++ googletest static-code-analysis cppcheck

有人可以向我解释为什么单元测试的以下代码在cppcheck中为n和k提供了错误unreadVariable? 组合是一个模板类,它计算n选择k的所有组合,但这在这里无关紧要。

TEST(Combinations, ChooseOne)
{
    const UINT8 n = 3;
    const UINT8 k = 1;

    Combinations<n, k> comb;
    comb.calc();
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } };
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect));
}

我可以将代码更改为以下内容,不再出现cppcheck错误。但我不喜欢这样,因为它使代码更简洁。 n,k是统计中明确定义的数量,它们使得调用中的内容更加清晰。

TEST(Combinations, ChooseOne)
{
    Combinations<3, 1> comb;
    comb.calc();
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } };
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect));
}

2 个答案:

答案 0 :(得分:2)

这是一个众所周知的问题:http://trac.cppcheck.net/ticket/7542

因此,除非将其修复,否则cppcheck将报告此误报。

答案 1 :(得分:1)

我试着把它放在评论中,但这是一个想法。

据我所知,Google Tests正在以下列方式使用TEST子句:

TEST(test_case_name, test_name) {
 ... test body ...
}

我个人没有遇到类似的东西,但在您的情况下,您的测试用例名称和您测试的实际课程名称相同。 对我来说,这似乎是某种名称冲突。

您是否尝试过重命名

TEST(Combinations, ChooseOne)
{
    const UINT8 n = 3;
    const UINT8 k = 1;

    Combinations<n, k> comb;
    comb.calc();
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } };
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect));
}

到a:

TEST(CombinationsTest, ChooseOne)
{
    const UINT8 n = 3;
    const UINT8 k = 1;

    Combinations<n, k> comb;
    comb.calc();
    std::vector< std::vector<UINT8> > _vui8Expect = { { 2 }, { 1 }, { 0 } };
    EXPECT_THAT(comb.result, ::testing::ContainerEq(_vui8Expect));
}