c++ - 为什么 -fsanitize=undefined 导致 "undefined reference to typeinfo"?

标签 c++ qt gcc shared-libraries ubsan

以下测试用例,从真实世界的应用程序中缩减而来,无法与 -fsanitize=undefined 链接(使用 GCC 6.1.1),但没有它也能正常链接。谁能告诉我为什么?

似乎与Qt/QObject、-fvisibility=hidden-fsanitize=undefined的组合有关,但问题到底出在哪里超越我。

lib1.h:

#include <QObject>

class MyObject : public QObject
{
public:
    MyObject (QObject * parent = nullptr);
    ~MyObject ();

    void myMethod ();
};

lib1.cc:

#include "lib1.h"

#define EXPORT __attribute__((visibility("default")))

EXPORT MyObject::MyObject (QObject * parent) : QObject (parent)
{
}

EXPORT MyObject::~MyObject ()
{
}

EXPORT void MyObject::myMethod ()
{
}

lib2.cc:

#include "lib1.h"

void test (MyObject * object)
{
    object->myMethod ();
}

构建步骤:

LIBFLAGS="-fPIC -shared -Wall -Wl,-z,defs"
QTFLAGS="-I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core"

g++ -fsanitize=undefined -fvisibility=hidden \
 ${QTFLAGS} ${LIBFLAGS} lib1.cc -o lib1.so

g++ -fsanitize=undefined \
 ${QTFLAGS} ${LIBFLAGS} lib1.so lib2.cc -o lib2.so

构建输出(来自最后一步):

/tmp/ccY7PHv4.o:(.data.rel+0x18): undefined reference to `typeinfo for MyObject'
collect2: error: ld returned 1 exit status

最佳答案

所问实际问题的答案是,-fsanitize=undefined 实际上是一组 sanitizer ,包括 vptr sanitizer 。

https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

vptr sanitizer 被清楚地标记为需要 RTTI,其他答案已经描述了为什么它不可用。

要运行除 vptr 之外的所有测试,您可以说

-fsanitize=undefined -fno-sanitize=vptr

关于c++ - 为什么 -fsanitize=undefined 导致 "undefined reference to typeinfo"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37358573/

相关文章:

c++ - GCC 可以用于编译到自定义平台吗?

c - 寄存器存储类的范围是什么?

qt - 如何以编程方式进入 Qt Context Help 模式?

c++ - QGraphicsItem 在场景中的位置始终为 NULL

c# - 调用存储过程时未检索到数据

c++ - 继承与组合::我的理解正确吗?

c++ - Qt如何将字符串翻译成函数?

gcc - 将编译器添加到code::blocks

c++ - 获取进程用户名c++

c++ - 缺少着色器 C 兼容性是否重要?