是否有可能在C ++中检查空for循环,也许是一些聪明的模板/宏技巧?好像GCC不支持-wempty-body for for循环。
答案 0 :(得分:4)
答案 1 :(得分:2)
你认为什么是空的for循环?此?
for(;;) {}
此?
for(;;);
这个怎么样?
for(int i = 0; i < 10; ++i);
所有这些表格都是合法的(;
被视为空声明)。前两个等同于while(true)
,而最后一个定义i
并将其递增10次。从历史上看,GCC并没有对此进行优化,因为for(;;);
是main()
末尾的内核和其他嵌入式程序中的常见模式。
...然而
以下测试用例确实会产生警告(缩进很重要):
int main()
{
for (; 1<2; );
{
if (1==1);
}
while (1==1);
return 0;
}
main.cpp: In function 'int main()':
main.cpp:4:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
for (; 1<2; );
^~~
main.cpp:5:11: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'for'
if (1==1);
^~
main.cpp:5:20: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
if (1==1);
^
main.cpp:6:9: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
while (1==1);
^~~~~
main.cpp:7:11: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'while'
return 0;
^~~~~~
这意味着如果你担心一个散乱的分号并且你的代码正确缩进,你应该没事。
答案 2 :(得分:2)
除了learvst对静态分析工具的建议之外,还有一个额外的建议,如果你正在寻找这些空的for循环来追踪bug。
有许多空循环是完全正确的。例如:
for (auto it=v.begin(); it!=v.end() && *it!=val; it++)
;
但有一些令人讨厌的因;
而难以发现
for (auto it=v.begin(); it!=v.end(); it++); // oops !!!
do_something(*v);
幸运的是,这些令人讨厌的错误通常与误导性缩进有关。因此,您可以使用GCC's 6 indentation警告-Wmisleading-indentation