bugprone-suspicious-semicolon

查找大多数情况下意外改变代码含义的错误分号。更具体地说,它查找 ifwhileforfor-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();

在这种情况下,检查将假设你知道你在做什么,并且不会发出警告。