Есть ли в любом случае, чтобы обойти ошибки, предоставленные ndefinedBehaviorSanitizer - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующий код:

#include <memory>
#include <functional>
#include <boost/lockfree/queue.hpp>

#define _ThreadPoolLength_  100

class thread_pool {
public:
    thread_pool() : q(_ThreadPoolLength_) {}

private:
    mutable boost::lockfree::queue<std::function<void(int id)> *> q;
};

class Worker
{
    thread_pool workerPool;
};

Worker* worker;

int main() {
    worker = new Worker();
    delete worker;
    return 0;
}

Если скомпилировать его с clang++ -fsanitize=address,undefined code.cpp, то во время работы он выдаст что-то вроде:

вызов конструктора по смещенному адресу 0x6060000025a0 для типа 'boost :: lockfree :: queue *> :: node', для которого требуется выравнивание по 64 байта 0x6060000025a0: примечание: указатель указывает здесь

01 00 00 3 c 40 25 00 00 60 60 будет быть быть быть быть быть быть быть быть быть быть быть быть быть быть ^

#0 0x519fc5 in boost::lockfree::queue<std::function<void (int)>*>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<std::function<void (int)>*>::node, std::allocator<boost::lockfree::queue<std::function<void (int)>*>::node> >::construct<true, false, boost::lockfree::queue<std::function<void (int)>*>::node*>(boost::lockfree::queue<std::function<void (int)>*>::node* const&) 
#1 0x517e77 in boost::lockfree::queue<std::function<void (int)>*>::initialize() 
#2 0x51743c in boost::lockfree::queue<std::function<void (int)>*>::queue(unsigned long) 
#3 0x51713f in thread_pool::thread_pool() 
#4 0x517048 in Worker::Worker() 
#5 0x516ed9 in main 
#6 0x7f6c3cb6bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#7 0x41a5f9 in _start

РЕЗЮМЕ: UndefinedBehaviorSanitizer: undefined-поведение ...

Я подозреваю, что ошибки были вызваны boost::lockfree::queue<std::function<void(int id)> *>, но почему? Есть ли способы обойти это?

clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)

Наконец, я заменил использование boost::lockfree::queue<std::function<void(int id)> *> на аналогичный класс, сославшись на сообщение в блоге .

1 Ответ

0 голосов
/ 21 апреля 2020

Вы пропускаете worker, потому что вы использовали new для его создания и никогда не использовали delete для его разрушения. Есть другие сообщения ASan, потому что как часть построения worker, также создается его очередь членов.

...