有正确的重要答案,但我想澄清一下。不幸的是,测试示例的格式不正确。我们可以这样写:
void F1()
{
size_t i = 0;
std::wstring s;
s = (i < 0) ? L"ABC" : L"DEF";
s = (i != -1) ? L"ABC" : L"DEF";
}
在这种情况下,分析仪将发出两个V547警告:
- V547 表达式 'i < 0' 始终为假。无符号类型值永远不会 < 0。consoleapplication1.cpp 15
- V547 表达式 'i != - 1' 始终为真。控制台应用程序1.cpp 16
(V519也会发生,但与问题无关。)
因此,第一个 V547 警告是打印,因为无符号变量不能小于零。变量的值也无关紧要。发出第二个警告是因为分析器反应将 0 分配给变量 i 并且该变量在任何地方都没有改变。
现在让我们编写另一个测试示例,以便分析器对变量的值一无所知i
:
void F2(size_t i)
{
std::wstring s;
s = (i < 0) ? L"ABC" : L"DEF";
s = (i != -1) ? L"ABC" : L"DEF";
}
现在将只有一个 V547 警告:
- V547 表达式 'i < 0' 始终为假。无符号类型值永远不会 < 0。consoleapplication1.cpp 22
分析仪无法说明(i != -1)
情况。这是完全正常的,例如,它可以是与 的比较npos
,正如已经注意到的那样。
如果有人决定使用 PVS-Studio 测试源示例,我写了这个,把它排除在外。当他看到两个警告时,这个人会感到惊讶,尽管有人讨论过只有一个。