条件中带有快捷二进制运算符的Clang IfStmt

条件中带有快捷二进制运算符的Clang IfStmt,clang,llvm,abstract-syntax-tree,llvm-clang,Clang,Llvm,Abstract Syntax Tree,Llvm Clang,我试图检测if语句中是否有函数调用作为条件的一部分;例如: if (cmp(a, b)){ \\do something } I have found I could do this with AST matcher in following manner: Matcher.addMatcher(ifStmt(hasCondition(callExpr().bind("call_expr"))) .bind("call_if_stmt")

我试图检测if语句中是否有函数调用作为条件的一部分;例如:

if (cmp(a, b)){
  \\do something
}
I have found I could do this with AST matcher in following manner:
Matcher.addMatcher(ifStmt(hasCondition(callExpr().bind("call_expr")))
                           .bind("call_if_stmt"),&handleMatch);
if(a != b && cmp(a,b) || c == 10){
\\ do something
}
但问题是,条件可能有像&、| |这样的捷径;例如:

if (cmp(a, b)){
  \\do something
}
I have found I could do this with AST matcher in following manner:
Matcher.addMatcher(ifStmt(hasCondition(callExpr().bind("call_expr")))
                           .bind("call_if_stmt"),&handleMatch);
if(a != b && cmp(a,b) || c == 10){
\\ do something
}

现在这个条件有了二进制运算符&&和| |;还有一个调用表达式作为它的一部分。现在,我如何检测这个if语句中有一个调用表达式?当然,我不知道有多少二进制运算符作为快捷方式,所以我正在寻找一个通用的解决方案,可能使用clange AST matcher。

在第一种情况下,
if(cmp(a,b))
,CallExpr节点是IfStmt的直接子节点。在第二种情况下,它是IfStmt的后代,但不是子代。相反,它嵌套在两个BinaryOperator节点下。(我通过使用
clangcheck-AST dump test.cpp--
查看AST发现了这一点)添加
hasDescendant
遍历匹配器将找到嵌套更深的CallExpr。不幸的是,仅此一点无法找到第一个病例。因此,我们可以使用
anyOf
将其与原始匹配器相结合:

ifStmt( 
  hasCondition( 
    anyOf(
      callExpr().bind("top_level_call_expr"),
      hasDescendant(
        callExpr().bind("nested_call_expr")
      )
    )
  )
).bind("call_if_stmt")
如果我使用test.cpp获得以下代码:

bool cmp(int a, int b){return a < b;}

int f(int a, int c){
  int b = 42;
  if( a != b && cmp(a,b) || c == 10){
    return 2;
  }
  return c;
}

int g(int a, int c){
  int b = 42;
  if( cmp(a,b)) {
    return 2;
  }
  return c;
}

在第一种情况下,
if(cmp(a,b))
,CallExpr节点是IfStmt的直接子节点。在第二种情况下,它是IfStmt的后代,但不是子代。相反,它嵌套在两个BinaryOperator节点下。(我通过使用
clangcheck-AST dump test.cpp--
查看AST发现了这一点)添加
hasDescendant
遍历匹配器将找到嵌套更深的CallExpr。不幸的是,仅此一点无法找到第一个病例。因此,我们可以使用
anyOf
将其与原始匹配器相结合:

ifStmt( 
  hasCondition( 
    anyOf(
      callExpr().bind("top_level_call_expr"),
      hasDescendant(
        callExpr().bind("nested_call_expr")
      )
    )
  )
).bind("call_if_stmt")
如果我使用test.cpp获得以下代码:

bool cmp(int a, int b){return a < b;}

int f(int a, int c){
  int b = 42;
  if( a != b && cmp(a,b) || c == 10){
    return 2;
  }
  return c;
}

int g(int a, int c){
  int b = 42;
  if( cmp(a,b)) {
    return 2;
  }
  return c;
}

这真的很好,如果我在if语句中有多个调用,我是否也可以计算它们;我的意思是我可以计算if语句中有多少个调用表达式?我得到了答案:ifStmt(hasCondition(foreachDigenant(callExpr().bind(“call\u expression”)))).bind(“if\stmt\u inside\u call”)真的很棒,如果if语句中有多个调用,我也可以计算它们;我的意思是我可以计算if语句中有多少个调用表达式?我得到了答案:ifStmt(hasCondition(foreachsubstant(callExpr().bind(“call\u expression”))).bind(“if\stmt\u inside\u call”)