【问题标题】:Are there anyways to work around errors given by ndefinedBehaviorSanitizer无论如何都可以解决 undefinedBehaviorSanitizer 给出的错误
【发布时间】: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&lt;std::function&lt;void(int id)&gt; *&gt; 引起的,但为什么呢?有什么办法可以解决吗?

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

最后,我通过引用a blog post,将boost::lockfree::queue&lt;std::function&lt;void(int id)&gt; *&gt;的使用替换为类似的类。

【问题讨论】:

  • 为什么没有delete?如果我添加它,则不会报告泄漏。至于错位,有一些报告的问题,例如thisthisthis
  • 对不起,我很笨。我试图剥离一个大型项目并错过了删除操作。现在我添加了delete,但是UndefinedBehaviorSanitizer的问题还是提醒了。我现在将更新问题。
  • @DanielLangr 我明白了,谢谢。这是 Boost 的一个错误

标签: c++ address-sanitizer sanitizer


【解决方案1】:

您正在泄漏worker,因为您使用new 来构造它,而从不使用delete 来破坏它。其他 ASan 消息在那里,因为作为构造 worker 的一部分,它的成员队列也被构造了。

【讨论】:

  • 对不起,我的错。我试图使采样代码尽可能小,以便从更大的项目中重现问题。现在我添加回删除,但 UndefinedBehaviorSanitizer 仍然存在。
  • 好吧,是的,这是一个 Boost 问题。这可能是suppressed
  • 把 __attribute__((no_sanitize("undefined"))) 放在 thread_pool 的构造函数甚至 main 函数前面似乎没有帮助。
  • 既然是别人的文件,不妨试试.supp抑制文件
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 2019-04-24
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多