Как исправить эту ошибку времени выполнения C ++ UBSAN vptr (ошибка времени выполнения: вызов члена по адресу)

Я включил тест ubsan (-fsanitize = undefined) в своем проекте и обнаружил несколько ошибок времени выполнения ubsan. Может ли кто-нибудь помочь мне понять, почему здесь не удалось? Как исправить эту проблему в GCC и Clang?

Вот модуль lib.so, который включает lib.h и lib.cpp.

lib.h:

#ifndef LIB_H
#define LIB_H

#ifdef API_EXPORTS
   #define API __attribute__((visibility("default")))
#else
   #define API 
#endif

class API Exception
{
public:
     virtual ~ Exception() = 0;
     void SetReporter();
};

class API FileException : public Exception
{
public:
   ~FileException();
};

#endif

lib.cpp:

#include "lib.h"

Exception::~Exception() = default;

FileException::~FileException() = default;

void Exception::SetReporter()
{

}

Вот исполняемый модуль, который будет вызывать модуль lib.so:

main.cpp

#include "lib.h"

int main(void) {
    FileException ex;
    ex.SetReporter();

    return 0;
}

Соберите модули (lib.so и main) и запустите main, есть ошибки времени выполнения:

build_run_gcc.sh

#!/bin/bash

# Test gcc version
gcc --version

# Build the API library
g++ -fPIC -D API_EXPORTS -o lib.so -shared lib.cpp -fvisibility=hidden -Wall -fsanitize=undefined -lubsan

# Build the main
g++ -o main main.cpp ./lib.so -fvisibility=hidden -Wall -fsanitize=undefined -lubsan

# Test main
./main

Ошибки:

main.cpp:5:19: runtime error: member call on address 0x7ffcb88a8c60 which does not point to an object of type 'Exception'
0x7ffcb88a8c60: note: object is of type 'FileException'
 14 56 00 00  48 cd 41 3d 14 56 00 00  00 fa 14 fd f4 29 3f 51  60 8d 8a b8 fc 7f 00 00  00 00 00 00
              ^~~~~~~~~~~~~~~~~~~~~~~
              vptr for 'FileException'

person Hongliang Du    schedule 09.12.2019    source источник
comment
Для получения дополнительных вопросов вам необходимо извлечь и предоставить минимальный воспроизводимый пример, встроенный в ваш вопрос. Никаких ссылок на внешние сайты. Как новый пользователь, пройдите тур и прочтите Как спросить.   -  person Ulrich Eckhardt    schedule 09.12.2019
comment
Этот пример на github - мой минимальный воспроизводимый пример для демонстрации этой проблемы.   -  person Hongliang Du    schedule 09.12.2019
comment
Пожалуйста, сделайте вопросы самодостаточными, что означает, что вам необходимо представить весь соответствующий код и другую информацию внутри самого вопроса. Ссылки могут исчезнуть или информация на страницах может измениться, что сделает вопросы с такими ссылками бесполезными. Помните, что вопросы здесь не только для вас прямо сейчас, но и для тех, у кого в будущем могут возникнуть такие же или похожие проблемы.   -  person Some programmer dude    schedule 09.12.2019
comment
Спасибо. Я удалил внешнюю ссылку и уточнил свои вопросы.   -  person Hongliang Du    schedule 09.12.2019
comment
Я не смог воспроизвести это с помощью archlinux + gcc8.2. Но я воспроизвел его в docker ubuntu: latest с gcc7.4, как в действиях github. Не могли бы вы восстановить ссылки и добавить вывод версии gcc к ошибкам?   -  person KamilCuk    schedule 09.12.2019
comment
Дубликат https://stackoverflow.com/questions/57294792/c-ubsan-produces-false-positives-with-dehibited-objects?   -  person KamilCuk    schedule 09.12.2019
comment
Привет, @KamilCuk, вот мой минимальный демонстрационный код: github.com/oneiric/TestUBSan. результаты здесь: github.com/oneiric/TestUBSan/runs/339546431 Нажмите кнопку «Создать и Запустите, затем посмотрите результаты в действиях на github. Я также использую gcc 7.4 в действиях на github.   -  person Hongliang Du    schedule 09.12.2019
comment
@KamilCuk, как вы думаете, почему это дублированная проблема с другим? Наше использование экспортируемых макросов отличается от этого. Как вы думаете, следует ли использовать согласованный экспорт макросов как для внутреннего совместно используемого файла, так и для внешнего вызывающего приложения?   -  person Hongliang Du    schedule 09.12.2019
comment
Согласно этому stackoverflow.com/ questions / 2164827 / EXPORT и IMPORT должны использовать разные макросы перед классом экспорта. Итак, моя проблема отличается от stackoverflow.com/questions/57294792/ В этом вопросе stackoverflow.com/questions/57294792/, они просто используют один и тот же макрос EXPORT как для .so, так и для основных модулей.   -  person Hongliang Du    schedule 09.12.2019