草庐IT

c++ - Clang 前端 API 的所有权问题

coder 2024-02-25 原文

我正在使用 Clang C++ API。由于 API 没有正确使用智能指针,我一直在努力解决所有权问题。到目前为止,我自己解决了所有发现的问题,但这个问题让我很烦恼。当代码执行时,我遇到了访问冲突。我相当确定这是一个双重删除,但由于文档不存在,我不知道去哪里看。幸运的是,复制程序相当短。有什么建议吗?

#define _SCL_SECURE_NO_WARNINGS

#pragma warning(push, 0)

#include <clang/CodeGen/CodeGenAction.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Sema/Lookup.h>
#include <clang/Lex/Preprocessor.h>
#include <clang/AST/ASTContext.h>
#include <clang/AST/Mangle.h>
#include <clang/Frontend/TextDiagnosticPrinter.h>
#include <clang/Basic/TargetInfo.h>
#include <clang/Sema/Sema.h>
#include <clang/Sema/SemaConsumer.h>
#include <clang/Sema/CodeCompleteConsumer.h>
#include <llvm/LLVMContext.h>
#include <llvm/Support/DataTypes.h>
#include <llvm/Module.h>
#include <llvm/Support/Host.h>

#pragma warning(pop)

#include <string>
#include <iostream>

int main(int argc, char* argv[])
{
    llvm::LLVMContext c;
    llvm::Module m("", c);
    clang::EmitLLVMOnlyAction emit(&c);
    emit.setLinkModule(&m);
    clang::CompilerInstance CI;

    std::string errors;
    llvm::raw_string_ostream error_stream(errors);
    clang::DiagnosticOptions diagopts;
    clang::TextDiagnosticPrinter printer(error_stream, &diagopts);
    llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagids(new clang::DiagnosticIDs);
    clang::DiagnosticsEngine engine(diagids, &diagopts, &printer, false);
    CI.setDiagnostics(&engine);

    CI.createFileManager();
    CI.createSourceManager(CI.getFileManager());

    llvm::raw_null_ostream empty;
    clang::PrintingCodeCompleteConsumer print(CodeCompleteOptions(), empty);        

    clang::TargetOptions target;
    target.Triple = llvm::sys::getDefaultTargetTriple();
    CI.setTarget(clang::TargetInfo::CreateTargetInfo(engine, &target));

    CI.createPreprocessor();
    CI.createASTContext();

    clang::SemaConsumer* cons = new clang::SemaConsumer();

    CI.setASTConsumer(cons);    
    CI.createSema(clang::TranslationUnitKind::TU_Complete, &print);
    cons->InitializeSema(CI.getSema());

    clang::FrontendInputFile f("header", clang::InputKind::IK_CXX, true);
    emit.BeginSourceFile(CI, f);
    emit.Execute();
    emit.EndSourceFile();
    emit.takeModule();
    clang::LookupResult lr(CI.getSema(), clang::DeclarationName(CI.getPreprocessor().getIdentifierInfo("function")), clang::SourceLocation(), clang::Sema::LookupNameKind::LookupOrdinaryName);
    auto result = CI.getSema().LookupName(lr, CI.getSema().TUScope);

    std::string temp;
    llvm::raw_string_ostream out(temp);
    CI.getASTContext().createMangleContext()->mangleName(lr.getFoundDecl(), out);
    auto fun = m.getFunction(temp);

    std::cout << fun->getName().str();

    return 0;
}

编辑:此外,我有没有提到如果我更改它以便文件实际存在,即使它是一个微不足道的程序,Clang 也会在执行操作时因访问冲突而失败,甚至在 EndSourceFile 中的前一个操作之前。为什么。

最佳答案

我最终通过跳过整个前端解决了这个问题,因为这主要是所有不可靠的所有权所在的地方,我只是调用我自己需要的函数。

关于c++ - Clang 前端 API 的所有权问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13944270/

有关c++ - Clang 前端 API 的所有权问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  7. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  8. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  9. ruby-on-rails - ActionController::RoutingError: 未初始化常量 Api::V1::ApiController - 2

    我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐