2016-04-26 70 views
0

我的應用程序正在使用boost::program_options,它在觸發AddressSanitizer「stack-buffer-overflow」時從異常中產生錯誤消息。我該如何抑制gcc中AddressSanitizer的堆棧緩衝區溢出

我並不擔心升級錯誤 - 功能起作用,這只是在非生產應用程序的命令行解析部分。不過,我想禁止AddressSanitizer消息。

ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fffe6ce7070 at pc 0x0000007406cd bp 0x7fffe6ce6fe0 sp 0x7fffe6ce6fd8 
READ of size 8 at 0x7fffe6ce7070 thread T0 
    #0 0x7406cc in std::_Head_base<0ul, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, false>::_M_head(std::_Head_base<0ul, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, false>&) /frc/toolchain6/include/c++/5.3.0/tuple:142 
    #1 0x7406cc in _M_create_node /frc/toolchain6/include/c++/5.3.0/tuple:347 
    #2 0x7403fd in std::_Rb_tree_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_emplace_hint_unique<std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&>, std::tuple<> >(std::_Rb_tree_const_iterator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::piecewise_construct_t const&, std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&>&&, std::tuple<>&&) /frc/toolchain6/include/c++/5.3.0/bits/stl_tree.h:2170 
    #3 0xd5eff8 in boost::program_options::error_with_option_name::substitute_placeholders(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const (/home/joe/myapp_workspace/myapp/myapp-debug+0xd5eff8) 
    #4 0xd5c0dd in boost::program_options::error_with_option_name::what() const (/home/joe/myapp_workspace/myapp/myapp-debug+0xd5c0dd) 
    #5 0x58addf in main /home/joe/myapp_workspace/myapp/main.cpp:62 
    #6 0x7fd7e056176c in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2176c) 
    #7 0x436aa0 (/home/joe/myapp_workspace/myapp/myapp-debug+0x436aa0) 

我使用ASAN_OPTIONS抑制文件的方法嘗試,但僅似乎支持錯誤類型(如「vptr_check」和「泄漏」)的一個很短的列表。

+0

堆棧溢出很可能會導致段錯誤,因此我建議您研究如何捕獲SIGSEGV信號。 –

+0

@MohamadElghawi,在這個術語的意義上,這不是一個真正的堆棧溢出,並且應用程序不會在啓用或不啓用asan時崩潰。 AddressSanitizer正在檢測從緩衝區溢出的內存讀取,但它不是傳統的受OS保護的內存。 – GranBurguesa

回答

1

我不認爲有一個簡單的方法來壓制這個錯誤 - 嘎恩版本的Asan有黑名單機制,但它的上下文不敏感,所以你不得不禁用內存檢查在所有std :: string的用法是非常不可取的。

一個選項是使用-fsanitize-recover =地址編譯器標誌並將halt_on_error = 0添加到您的ASAN_OPTIONS(有關詳細信息,請參見wiki,並注意只支持恢復是相對較新的GCC和Clang)。這將在第一次錯誤後繼續執行。然後,您可以查看完整的牙山報告並選擇您感興趣的內容。