【发布时间】:2020-04-21 06:14:08
【问题描述】:
我有以下代码:
#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 3c 40 25 00 00 60 60 是 be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be bebe ^
#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:未定义行为 ...
我怀疑错误是由boost::lockfree::queue<std::function<void(int id)> *> 引起的,但为什么呢?有什么办法可以解决吗?
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
最后,我通过引用a blog post,将boost::lockfree::queue<std::function<void(int id)> *>的使用替换为类似的类。
【问题讨论】:
-
对不起,我很笨。我试图剥离一个大型项目并错过了删除操作。现在我添加了delete,但是UndefinedBehaviorSanitizer的问题还是提醒了。我现在将更新问题。
-
@DanielLangr 我明白了,谢谢。这是 Boost 的一个错误
标签: c++ address-sanitizer sanitizer