C++ ((CxMethodeCl*)(VarDecl->;getParentFunctionOrMethod())中的程序段错误

C++ ((CxMethodeCl*)(VarDecl->;getParentFunctionOrMethod())中的程序段错误,c++,clang,C++,Clang,我正在编译我的程序,它使用ubuntu13.04x86机器上的clang3.5。我想在cpp项目中声明所有变量。以下是我写的:- // Declares clang::SyntaxOnlyAction. #include "clang/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" #include "clang/ASTMat

我正在编译我的程序,它使用
ubuntu13.04x86
机器上的
clang3.5
。我想在cpp项目中声明所有变量。以下是我写的:-

// Declares clang::SyntaxOnlyAction.
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
// Declares llvm::cl::extrahelp.
#include "llvm/Support/CommandLine.h"
#include "clang/AST/DeclCXX.h"
#include <iostream>
#include <vector>

using namespace clang::tooling;
using namespace llvm;
using namespace clang::ast_matchers;
using namespace clang;
using namespace std;

static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);

static cl::extrahelp MoreHelp("\nMore help text...");

static cl::OptionCategory MyToolCategory("My Tool Category");

internal::Matcher<Decl> fields = fieldDecl().bind("field");
internal::Matcher<Decl> params = parmVarDecl().bind("param");
internal::Matcher<Decl> vars = varDecl().bind("var");

class VarDeclPrinter : public MatchFinder::MatchCallback {
  public:
  int counter;

  virtual void run(const MatchFinder::MatchResult &Result) {
    const Decl* dec;

    if(const FieldDecl* field = Result.Nodes.getNodeAs<FieldDecl>("field"))
      llvm::outs() << "Member Variable: " << field->getName() << "\t\t" 
                   << field->getParent()->getQualifiedNameAsString() << "\n";

    if(const ParmVarDecl* param = Result.Nodes.getNodeAs<ParmVarDecl>("param"))
      llvm::outs() << "Argument Variable: " << param->getName() << "\t\t"
                   << ((CXXMethodDecl*)(param->getParentFunctionOrMethod()))->getQualifiedNameAsString() << "\n";

    if(const VarDecl* var = Result.Nodes.getNodeAs<VarDecl>("var"))
      llvm::outs() << "Local Variable: " << var->getName() << "\t\t"
                   << ((CXXMethodDecl*)(var->getParentFunctionOrMethod()))->getQualifiedNameAsString() << "\n";

    counter++;
    //llvm::outs() << "Variable count: " << counter << "\n";
    //ASTContext* Context = Result.Context;
  }
};

int main(int argc, const char **argv) {
  CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
  ClangTool Tool(OptionsParser.getCompilations(),
                 OptionsParser.getSourcePathList());

  VarDeclPrinter VarDeclCallback;
  MatchFinder Finder;

  Finder.addMatcher(fields, &VarDeclCallback);
  Finder.addMatcher(params, &VarDeclCallback);
  Finder.addMatcher(vars, &VarDeclCallback);
  return Tool.run(newFrontendActionFactory(&Finder));
}
//声明clang::SyntaxOnlyAction。
#包括“clang/Frontend/FrontendActions.h”
#包括“clang/Tooling/CommonOptionsParser.h”
#包括“叮当声/工具/工具.h”
#包括“clang/ASTMatchers/ASTMatchers.h”
#包括“clang/ASTMatchers/ASTMatchFinder.h”
//声明llvm::cl::extrahelp。
#包括“llvm/Support/CommandLine.h”
#包括“clang/AST/DeclCXX.h”
#包括
#包括
使用namespace-clang::工具;
使用名称空间llvm;
使用名称空间clang::ast_匹配器;
使用名称空间铿锵;
使用名称空间std;
静态cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
静态cl::extrahelp MoreHelp(“\n更多帮助文本…”);
静态cl::OptionCategory MyToolCategory(“我的工具类别”);
内部::Matcher fields=fieldDecl().bind(“字段”);
内部::Matcher params=parmVarDecl().bind(“param”);
内部::Matcher vars=varDecl().bind(“var”);
类VarDeclPrinter:public MatchFinder::MatchCallback{
公众:
整数计数器;
虚拟无效运行(常量MatchFinder::MatchResult和Result){
const Decl*dec;
if(const FieldDecl*field=Result.Nodes.getNodeAs(“字段”))

llvm::outs()我得到了解决方案。这是因为我试图获取方法名称,即使
var
不在方法内部。以下是解决方案:-

if(const VarDecl* var = Result.Nodes.getNodeAs<VarDecl>("var")) {
  llvm::outs() << "Local Variable: " << var->getName() << "\t\t";
  if(var->isFunctionOrMethodVarDecl())
    llvm::outs() << ((CXXMethodDecl*)(var->getParentFunctionOrMethod()))->getQualifiedNameAsString();
  llvm::outs() << "\n";
}
if(const VarDecl*var=Result.Nodes.getNodeAs(“var”)){
llvm::outs()getQualifiedNameAsString();

llvm::outs()这通常是你一生中学习如何使用调试工具的好时机。我建议GDB用于一般调试,Valgrind套件用于更繁重的内存问题。GDB是一个很棒的工具。它只是在我的情况下不起作用。我在llvm的cmake中添加了
-DCMAKE\u BUILD\u TYPE=Debug
。在花费了大量编译时间之后(执行make时比以前更有效),现在它给了我
libclangStaticAnalyzerCheckers.a:文件格式不可识别;将其视为链接器脚本
。无论如何,感谢您的评论。