cppcheck 在模板中使用时抱怨 unreadVariable

cppcheck complains about unreadVariable when used in template

谁能给我解释一下为什么下面的单元测试代码在 cppcheck 中给出了 unreadVariable for n and k 的错误? Combinations 是一个模板class,它计算 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));
}

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

据我所知 Google 测试按以下方式使用 TEST 子句:

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

我个人没有遇到过类似的情况,但在您的情况下,您的测试用例名称与您测试的实际 class 名称完全相同。 对我来说,这似乎是某种名称冲突。

你试过重命名吗

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));
}

给一个:

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));
}

这是一个已知问题:http://trac.cppcheck.net/ticket/7542

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