Я включил тест 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'