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() 返回的值无效