2

我正在使用 clang(通过 Python 绑定通过 libclang)来组合一个代码审查机器人。我一直假设所有 FOR_STMT 游标都有 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 个组件是使用访问者对象从 clang::ForStmt 类中添加的。ForStmt 对象应该返回空语句对象,但是某处的某个层似乎正在将这些从访问节点向量中剥离出来......?

4

1 回答 1

0

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

于 2017-03-12T17:25:25.230 回答