cppcheck 在模板中使用时抱怨 unreadVariable

Posted

技术标签:

【中文标题】cppcheck 在模板中使用时抱怨 unreadVariable【英文标题】:cppcheck complains about unreadVariable when used in template 【发布时间】: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));

【问题讨论】:

【参考方案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));

【讨论】:

以上是关于cppcheck 在模板中使用时抱怨 unreadVariable的主要内容,如果未能解决你的问题,请参考以下文章

cppcheck 抱怨 c_str() 的危险使用。此调用后 c_str() 返回的值无效

is_same 上的 Cppcheck 语法错误与模板

Cppcheck : mismatchAllocDealloc 错误

cppcheck 跳过 .hpp 文件

TeamCity 和 cppcheck 输出模板

为啥 jslint 在模板字符串上抱怨 Unexpected '`'