【问题标题】:cppcheck complains about unreadVariable when used in templatecppcheck 在模板中使用时抱怨 unreadVariable
【发布时间】:2016-10-28 13:28:51
【问题描述】:

有人可以向我解释为什么下面的单元测试代码会在 cppcheck 中为 n 和 k 提供错误 unreadVariable 吗? Combinations 是一个模板类,它计算 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));
}

【问题讨论】:

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


    【解决方案1】:

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

    所以除非它被修复,否则 cppcheck 会报告这个误报。

    【讨论】:

    • 感谢您的链接。我没有质疑cppcheck的权威。 ;-)
    【解决方案2】:

    我试图将其放在评论中,但这是一个想法。

    据我所知,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));
    }
    

    到:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2017-01-17
      • 2016-10-30
      相关资源
      最近更新 更多