【问题标题】:Why g++ with -O3 segfault with the following LLVM library code为什么带有-O3 segfault的g ++带有以下LLVM库代码
【发布时间】:2017-02-25 13:09:56
【问题描述】:

所以我想使用llvm::Twine字符串块类。

我有以下示例:

#include <llvm/ADT/Twine.h>
#include <iostream>

int main()
{
  llvm::Twine twine1 = llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd";
  llvm::Twine twine2 = llvm::Twine(twine1) + "dddd" + "eeee";
  std::cout << twine1.str() << std::endl;
  std::cout << twine2.str() << std::endl;

  return 0;
}

它与clang++ 与-O3 和g++ 与-O0 一起运行,但与g++ 与-O3 一起运行。我从 3.4 到 3.9 尝试了这段代码的不同版本的 clang 库,并尝试使用 g++ 4.8.4、g++ 4.8.5 和 mingw-5.3.0。

您需要 llvm 库并将代码与 -lLLVMSupport -lLLVMCore 和来自 llvm-config --ldflags 的其他代码链接

【问题讨论】:

    标签: c++ c++11 clang llvm


    【解决方案1】:

    来自Twine documentation:

    Twine 不能直接使用,也不应存放,其 实现依赖于存储指向临时指针的能力 可以在语句末尾释放的堆栈对象。 Twines 只能在参数中用作 const 引用, 当 API 希望接受可能连接的字符串时。

    换句话说,Twine 对象不拥有它的部分,因此它们在语句结束时被销毁。

    正确的用法是:

    #include <llvm/ADT/Twine.h>
    #include <iostream>
    
    void bar(const llvm::Twine& twine1, const llvm::Twine2& twine2){
        std::cout << twine1.str() << std::endl;
        std::cout << twine2.str() << std::endl;
    }
    
    void foo(const llvm::Twine& twine1){
        bar(twine1, twine1 + "dddd" + "eeee");
    }
    
    int main()
    {
      foo(llvm::Twine("aaaa") + "bbbb" + "cccc" + "dddd");
    
      return 0;
    }  
    

    【讨论】:

      【解决方案2】:

      您似乎正在尝试使用gcc 编译一些代码,并将其与使用不同编译器构建的库链接;即llvm。

      不同的编译器通常会使用不同的internal ABIs。通常,由一个 C++ 编译器编译的代码不能与由不同编译器构建的代码链接,除非有明确的 ABI 兼容性保证。 TMK,在 gcc 和 llvm 之间没有。即使实际链接可能成功,结果也不会具有定义的行为。

      事实上,由一个版本的 gcc 构建的代码通常不能与由不同版本的 gcc 构建的代码链接(许多版本的 gcc 确实有一定的 ABI 兼容性保证,但不是所有其他版本的 gcc)。

      【讨论】:

      • 我用gcc编译了llvm库
      • 您是否使用相同版本的 gcc 编译了您链接的每个库?
      • 是的,但是这个简单的示例只使用了 llvm
      • 您在问题中陈述了一些不同的内容:您说需要链接多个库。无论如何,下一步是验证 llvm 库是否被明确记录为可与 gcc 编译。由于它们是 llvm 基础设施和堆栈的一部分,除非在某处声明它们可以与 gcc 一起编译和使用,否则我不会认为这是真的。
      • 谢谢,我会仔细检查这些东西。其他库是 pthread、-ldl、libterm 和其他一些通用库。
      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多