bugprone-suspicious-semicolon¶
查找大多数情况下意外改变代码含义的错误分号。更具体地说,它查找 if
、while
、for
和 for-range
语句,其语句体只有一个分号,然后分析代码上下文(例如缩进)以尝试确定这是否是有意的。
if (x < y);
{
x++;
}
这里 if
语句的语句体仅包含第一行末尾的分号,并且无论条件如何,x 都会递增。
while ((line = readLine(file)) != NULL);
processLine(line);
由于这段代码,processLine() 只会在 while
循环(空语句体)以 line == NULL 退出时调用一次。代码的缩进表明了程序员的意图。
if (x >= y);
x -= y;
虽然缩进不暗示任何嵌套,但没有正当理由拥有一个空语句体的 if 语句(但对循环来说是有意义的)。因此,此检查会针对上面的代码发出警告。
要解决此问题,请删除错误分号,或者如果空语句体是故意的,请使用代码缩进反映这一点,或者将分号放在新行中。例如
while (readWhitespace());
Token t = readNextToken();
这里第二行以一种表明它应该是 while 循环语句体的方式缩进 - 由于第一行末尾的分号,其语句体实际上是空的。
要么从第二行删除缩进
while (readWhitespace());
Token t = readNextToken();
…或者将分号从第一行末尾移动到新行
while (readWhitespace())
;
Token t = readNextToken();
在这种情况下,检查将假设你知道你在做什么,并且不会发出警告。