我该如何找到没有牙套的语句
How can I find if and for statements without braces?
我正在寻找一个项目,其中某些if
和for
语句没有其关联的括号,例如:
if(condition)
single_line_statement;
for(int i=0;i<10;i++)
single_line_statement;
我想找到这些语句!
但是,这是通过具有两种不同的括号样式的代码的存在而变得挑战的:
if(condition){
stuff;
}
和
if(condition(a) && condition(b))
{
stuff;
}
以及通过复杂的语句,例如(注意嵌套括号(:
for (auto const &x : y)
{
for (auto const &m : ted.bob())
{
if (m.n(o) != 0)
{
p[q] = true;
}
r["s"].push_back(rn.t(u));
}
}
我如何在没有括号的情况下找到if
和for
语句?
要解决这个问题,我创建了一个方便的花花公子脚本:
#!/bin/bash
find . -name '*.h' -o -name '*.cpp' | #Find all C++ files
xargs pcregrep -A 1 -nHM 'b(?:if|for)s*((([^()]++|(?1))*))(?!.*{|.*n.*{)'
这会找到所有C 文件,然后使用Perl兼容的正则表达式研究每个文件的内容。此表达式使用递归(?1)
在if
和for
语句之后提取(condition)
,并且.
字符匹配不是Newlines的字符,并且n
常数以匹配新行。负面的(?!...)
用于找到无括号的线。
正则表达式可以在此处在线测试。
输出看起来像这样:
./dir1/file1.cpp:845: if (!a)
./dir1/file1.cpp-846- std::cout << "a not found!" << std::endl;
--
./dir2/file2.cpp:20: if (b == NULL)
./dir2/file2.cpp-21- throw std::runtime_error("b was NULL");
由于脚本实际上并没有解析C ,因此在某些情况下会出现不良行为。例如,它将错过以下内容:
if (condition) // An example {
statement;
此答案利用clang-tidy
提供完整的检查,费用必须将clang-tidy
纳入一个人的构建系统。
我使用 vera++
在项目中验证该代码符合特定样式规则。
Vera: https://bitbucket.org/verateam/vera/wiki/Rules
Rule: T019 Control structures should have complete curly-braced block of code
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 我的简单if-else语句是如何无法访问的代码
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- 这个基于范围的'for'语句需要一个合适的函数,但找不到任何函数
- 这个语句到底是什么意思 stack<int, list<int> > 它与 stack 有何不同<int>?
- C 搜索数组以获取一个数字,但如果找不到该数组,则不会触发其他语句
- 包含语句:找不到 SDL/SDL.h 文件
- 我在第一个 switch 语句中找不到错误
- 找出.h文件之间的#define语句冲突
- 我的代码中有一个错误,可能是语法或我找不到的 if 语句。编程新手