C++ 如何使用libclang获得函数的深度?
我目前正在使用libclang为一个学校项目进行静态代码分析。我已经把它设置好并开始工作了,到目前为止,我已经获得了一个函数的文件位置和物理长度(行数),但接下来我想得到的是函数的深度 为了清楚起见,在我看来,任何给定行上函数的深度都是围绕该行的嵌套if/for/while/etc块的数量。假设采用标准语法,深度将与行开始处的制表符/空格数相关 一个函数的总深度就是它的最深线条的深度。例如,其深度为2:C++ 如何使用libclang获得函数的深度?,c++,libclang,C++,Libclang,我目前正在使用libclang为一个学校项目进行静态代码分析。我已经把它设置好并开始工作了,到目前为止,我已经获得了一个函数的文件位置和物理长度(行数),但接下来我想得到的是函数的深度 为了清楚起见,在我看来,任何给定行上函数的深度都是围绕该行的嵌套if/for/while/etc块的数量。假设采用标准语法,深度将与行开始处的制表符/空格数相关 一个函数的总深度就是它的最深线条的深度。例如,其深度为2: int foo() { int n = 0; // Depth 0 for
int foo()
{
int n = 0; // Depth 0
for (int i = 0; i < 10; ++i)
{
n = bar(i); // Depth 1
if (i < n)
++n; // Depth 2, deepest line
}
}
intfoo()
{
int n=0;//深度0
对于(int i=0;i<10;++i)
{
n=巴(i);//深度1
if(i
您可以通过编写
- 在输入深度时,将深度设置为零
- 每次输入节点时增加深度,如
- 每次离开其中一个节点时减小深度
- 当您离开函数时,深度应该为零,并且您可以沿途跟踪最大深度
(kind==CXCursorKind::CXCursor\u CompoundStmt)
来告诉我何时输入复合语句。但是,我如何知道何时离开其中一个节点?对于复合语句的入口和出口,这是否都是真的?如果是这样的话,我如何判断我是来还是走?这是一个使用访问者模式的树遍历。铿锵包装器进行前序或后序遍历。光标按指定的顺序访问所有节点,并调用移动类型的特定方法。在本例中,为了退出,您需要实现clang::RecursiveASTVisitor::dataTraverseStmtPost
-