使用libclang在for循环中查找条件求值

使用libclang在for循环中查找条件求值,c,libclang,C,Libclang,我通过Python绑定使用clang-via-libclang来构建一个代码审查机器人。我一直假设所有的临时游标都将有4个孩子;INIT、EVAL、INC.和BODY for( INIT; EVAL; INC ) BODY; 这意味着我可以用python中的某些东西检查求值表达式的内容,如: forLoopComponents = [ c for c in forCursor.get_children() ] assert( len( forLoopComponents ) == 4

我通过Python绑定使用clang-via-libclang来构建一个代码审查机器人。我一直假设所有的临时游标都将有4个孩子;INIT、EVAL、INC.和BODY

for( INIT; EVAL; INC )
    BODY;
这意味着我可以用python中的某些东西检查求值表达式的内容,如:

forLoopComponents = [ c for c in forCursor.get_children() ]
assert( len( forLoopComponents ) == 4 )

initExpressionCursor = forLoopComponents[ 0 ]
evalExpressionCursor = forLoopComponents[ 1 ]
incExpressionCursor = forLoopComponents[ 2 ]
bodyExpressionCursor = forLoopComponents[ 3 ]

errorIfContainsAssignment( evalExpressionCursor ) # example code style rule
这种方法一开始似乎不太好,但我接受它是因为libclang,尤其是Python绑定非常稀疏。然而,我最近注意到一个循环,如:

for( ; a < 4; a-- )
    ;
将只有3个孩子-现在评估将是第一个而不是第二个。我一直以为libclang只会为for STMT的任何未使用部分返回NULL STMT…显然,我错了

解析for STMT的正确方法是什么?我在libclang中找不到任何有用的东西


更新:浏览libclang源代码,这4个组件似乎是使用visitor对象从clang::ForStmt类中无声地添加的。ForStmt对象应该返回null语句对象,但某处的某个层似乎正在从访问的节点向量中剥离这些对象…?

这里也是一样,作为一种解决方法,我用一个伪int foo=0语句替换了第一个空语句。 我可以想象一个解决方案,它使用游标的get_标记来匹配语句的各个部分。 函数get_tokens可以在叮当声不够的情况下提供帮助