【问题标题】:Evaluating constant expressions in clang tools评估 clang 工具中的常量表达式
【发布时间】:2013-08-28 11:02:02
【问题描述】:

我正在编写一个 Clang 工具,并试图弄清楚如何在访问程序 AST 的情况下评估字符串文字。给定以下程序:

class DHolder { 
public:
  DHolder(std::string s) {}
};

DHolder x("foo");    

我在 Clang 工具中有以下代码:

const CXXConstructExpr *ctor = ... // constructs `x` above
const Expr *expr = ctor->getArg(0); // the "foo" expression
???

如何在我的工具中从代表"foo" 字符串文字的Expr 转换为实际的C++ 字符串?我试图做类似的事情:

// From ExprConstant.cpp
Evaluate(result, info, expr);

但我不知道如何初始化resultinfo 参数。

有什么线索吗?

【问题讨论】:

    标签: clang clang++


    【解决方案1】:

    我意识到这是一个老问题,但是当我无法使用 stringLiteral() 绑定到任何参数(代码不是 C++11)时,我遇到了这个问题。比如我有一个CXXMMemberCallExpr

    addProperty(object, char*, char*, ...); // has 7 arguments, N=[0,6]
    

    AST 转储显示StringLiteral 前面是CXXBindTemporaryExpr。因此,为了让我的 memberCallExpr 查询使用hasArgument(N,expr()) 进行绑定,我用bindTemporaryExpr() 包装了我的查询(为了便于阅读,此处显示在单独的行中):

    memberCallExpr(
        hasArgument(6, bindTemporaryExpr( 
            hasDescendant(stringLiteral().bind("argument"))
            )
        )
    )
    

    【讨论】:

      【解决方案2】:

      这样做的正确方法是使用 AST 匹配器来匹配字符串文字并将名称绑定到它,以便以后可以引用它,如下所示:

      StatementMatcher m = 
          constructExpr(hasArgument(0, stringLiteral().bind("myLiteral"))).bind("myCtor");
      

      然后在匹配回调中这样做:

      const CXXConstructExpr *ctor = 
          result.Nodes.getNodeAs<CXXConstructExpr("optionMatcher");
      
      const StringLiteral *optNameLiteral = 
          result.Nodes.getNodeAs<StringLiteral>("optName");
      

      然后可以通过以下方式访问文字

      optNameLiteral->getString().str();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 2012-12-26
        相关资源
        最近更新 更多