Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve UBSAN stacktraces #13

Merged
merged 2 commits into from
Aug 22, 2019
Merged

Improve UBSAN stacktraces #13

merged 2 commits into from
Aug 22, 2019

Conversation

fsaintjacques
Copy link
Contributor

@fsaintjacques fsaintjacques commented Aug 22, 2019

The following changes ensure that UBSAN will print full stacktraces on failure.

Before:

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/local/RDcsan/lib/R/site-library/Rcpp/include/Rcpp/routines.h:223:12 in
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:745:15: runtime error: member call on address 0x60c00003fdc0 which does not point to an object of type 'std::_Sp_counted_base<__gnu_cxx::_S_atomic>'
0x60c00003fdc0: note: object is of type 'std::_Sp_counted_ptr_inplace<arrow::ArrayData, std::allocator<arrow::ArrayData>, (__gnu_cxx::_Lock_policy)2>'
 b3 00 80 7d  d8 1c 9c e3 a4 7f 00 00  01 00 00 00 01 00 00 00  d0 b2 04 00 60 60 00 00  c0 b2 04 00

After:

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/local/RDcsan/lib/R/site-library/Rcpp/include/Rcpp/routines.h:223:12 in
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:745:15: runtime error: member call on address 0x60c000060100 which does not point to an object of type 'std::_Sp_counted_base<__gnu_cxx::_S_atomic>'
0x60c000060100: note: object is of type 'std::_Sp_counted_ptr_inplace<arrow::ArrayData, std::allocator<arrow::ArrayData>, (__gnu_cxx::_Lock_policy)2>'
 96 00 00 4a  d8 ac bb 7a 89 7f 00 00  01 00 00 00 01 00 00 00  50 b4 04 00 60 60 00 00  40 b4 04 00
              ^~~~~~~~~~~~~~~~~~~~~~~
              vptr for 'std::_Sp_counted_ptr_inplace<arrow::ArrayData, std::allocator<arrow::ArrayData>, (__gnu_cxx::_Lock_policy)2>'
    #0 0x7f897b1ac15e in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_count<(__gnu_cxx::_Lock_policy)2> const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:745:15
    #1 0x7f897b23b793 in std::__shared_ptr<arrow::ArrayData, (__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_ptr<arrow::ArrayData, (__gnu_cxx::_Lock_policy)2> const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:1166:69
    #2 0x7f897b23b5a1 in std::shared_ptr<arrow::ArrayData>::operator=(std::shared_ptr<arrow::ArrayData> const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:309:65
    #3 0x7f897b23b237 in arrow::Array::SetData(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:359:11
    #4 0x7f897b23a363 in arrow::PrimitiveArray::SetData(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:422:18
    #5 0x7f897b239df7 in arrow::PrimitiveArray::PrimitiveArray(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:427:5
    #6 0x7f897b239c2f in arrow::NumericArray<arrow::Int32Type>::NumericArray(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:440:67
    #7 0x7f897b239b4f in void __gnu_cxx::new_allocator<arrow::NumericArray<arrow::Int32Type> >::construct<arrow::NumericArray<arrow::Int32Type>, std::shared_ptr<arrow::ArrayData>&>(arrow::NumericArray<arrow::Int32Type>*, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/ext/new_allocator.h:136:23
    #8 0x7f897b2390a6 in void std::allocator_traits<std::allocator<arrow::NumericArray<arrow::Int32Type> > >::construct<arrow::NumericArray<arrow::Int32Type>, std::shared_ptr<arrow::ArrayData>&>(std::allocator<arrow::NumericArray<arrow::Int32Type> >&, arrow::NumericArray<arrow::Int32Type>*, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/alloc_traits.h:475:8
    #9 0x7f897b2387e4 in std::_Sp_counted_ptr_inplace<arrow::NumericArray<arrow::Int32Type>, std::allocator<arrow::NumericArray<arrow::Int32Type> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::shared_ptr<arrow::ArrayData>&>(std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:545:4
    #10 0x7f897b237e8b in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<arrow::NumericArray<arrow::Int32Type>, std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(arrow::NumericArray<arrow::Int32Type>*&, std::_Sp_alloc_shared_tag<std::allocator<arrow::NumericArray<arrow::Int32Type> > >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:678:6
    #11 0x7f897b237a34 in std::__shared_ptr<arrow::NumericArray<arrow::Int32Type>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(std::_Sp_alloc_shared_tag<std::allocator<arrow::NumericArray<arrow::Int32Type> > >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:1342:14
    #12 0x7f897b23772a in std::shared_ptr<arrow::NumericArray<arrow::Int32Type> >::shared_ptr<std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(std::_Sp_alloc_shared_tag<std::allocator<arrow::NumericArray<arrow::Int32Type> > >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:359:4
    #13 0x7f897b23733e in std::shared_ptr<arrow::NumericArray<arrow::Int32Type> > std::allocate_shared<arrow::NumericArray<arrow::Int32Type>, std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(std::allocator<arrow::NumericArray<arrow::Int32Type> > const&, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:705:14
    #14 0x7f897b230674 in std::shared_ptr<arrow::NumericArray<arrow::Int32Type> > std::make_shared<arrow::NumericArray<arrow::Int32Type>, std::shared_ptr<arrow::ArrayData>&>(std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:721:14
    #15 0x7f897b1ca924 in std::shared_ptr<arrow::Array> arrow::r::MakeSimpleArray<13, arrow::Int32Type>(SEXPREC*) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:913:10
    #16 0x7f897b1b5885 in arrow::r::Array__from_vector_reuse_memory(SEXPREC*) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:919:14
    #17 0x7f897b1b095c in arrow::r::Array__from_vector(SEXPREC*, std::shared_ptr<arrow::DataType> const&, bool) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:983:12
    #18 0x7f897b1b7024 in Array__from_vector(SEXPREC*, SEXPREC*) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:1047:10
    #19 0x7f897b2894fa in _arrow_Array__from_vector /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/arrowExports.cpp:481:20

The following changes ensure that UBSAN will print full stacktraces on
failure.

Before:

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/local/RDcsan/lib/R/site-library/Rcpp/include/Rcpp/routines.h:223:12 in
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:745:15: runtime error: member call on address 0x60c00003fdc0 which does not point to an object of type 'std::_Sp_counted_base<__gnu_cxx::_S_atomic>'
0x60c00003fdc0: note: object is of type 'std::_Sp_counted_ptr_inplace<arrow::ArrayData, std::allocator<arrow::ArrayData>, (__gnu_cxx::_Lock_policy)2>'
 b3 00 80 7d  d8 1c 9c e3 a4 7f 00 00  01 00 00 00 01 00 00 00  d0 b2 04 00 60 60 00 00  c0 b2 04 00

After:

SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/local/RDcsan/lib/R/site-library/Rcpp/include/Rcpp/routines.h:223:12 in
/usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:745:15: runtime error: member call on address 0x60c000060100 which does not point to an object of type 'std::_Sp_counted_base<__gnu_cxx::_S_atomic>'
0x60c000060100: note: object is of type 'std::_Sp_counted_ptr_inplace<arrow::ArrayData, std::allocator<arrow::ArrayData>, (__gnu_cxx::_Lock_policy)2>'
 96 00 00 4a  d8 ac bb 7a 89 7f 00 00  01 00 00 00 01 00 00 00  50 b4 04 00 60 60 00 00  40 b4 04 00
              ^~~~~~~~~~~~~~~~~~~~~~~
              vptr for 'std::_Sp_counted_ptr_inplace<arrow::ArrayData, std::allocator<arrow::ArrayData>, (__gnu_cxx::_Lock_policy)2>'
    #0 0x7f897b1ac15e in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_count<(__gnu_cxx::_Lock_policy)2> const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:745:15
    #1 0x7f897b23b793 in std::__shared_ptr<arrow::ArrayData, (__gnu_cxx::_Lock_policy)2>::operator=(std::__shared_ptr<arrow::ArrayData, (__gnu_cxx::_Lock_policy)2> const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:1166:69
    #2 0x7f897b23b5a1 in std::shared_ptr<arrow::ArrayData>::operator=(std::shared_ptr<arrow::ArrayData> const&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:309:65
    #3 0x7f897b23b237 in arrow::Array::SetData(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:359:11
    #4 0x7f897b23a363 in arrow::PrimitiveArray::SetData(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:422:18
    #5 0x7f897b239df7 in arrow::PrimitiveArray::PrimitiveArray(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:427:5
    #6 0x7f897b239c2f in arrow::NumericArray<arrow::Int32Type>::NumericArray(std::shared_ptr<arrow::ArrayData> const&) /usr/include/arrow/array.h:440:67
    #7 0x7f897b239b4f in void __gnu_cxx::new_allocator<arrow::NumericArray<arrow::Int32Type> >::construct<arrow::NumericArray<arrow::Int32Type>, std::shared_ptr<arrow::ArrayData>&>(arrow::NumericArray<arrow::Int32Type>*, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/ext/new_allocator.h:136:23
    #8 0x7f897b2390a6 in void std::allocator_traits<std::allocator<arrow::NumericArray<arrow::Int32Type> > >::construct<arrow::NumericArray<arrow::Int32Type>, std::shared_ptr<arrow::ArrayData>&>(std::allocator<arrow::NumericArray<arrow::Int32Type> >&, arrow::NumericArray<arrow::Int32Type>*, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/alloc_traits.h:475:8
    #9 0x7f897b2387e4 in std::_Sp_counted_ptr_inplace<arrow::NumericArray<arrow::Int32Type>, std::allocator<arrow::NumericArray<arrow::Int32Type> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::shared_ptr<arrow::ArrayData>&>(std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:545:4
    #10 0x7f897b237e8b in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<arrow::NumericArray<arrow::Int32Type>, std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(arrow::NumericArray<arrow::Int32Type>*&, std::_Sp_alloc_shared_tag<std::allocator<arrow::NumericArray<arrow::Int32Type> > >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:678:6
    #11 0x7f897b237a34 in std::__shared_ptr<arrow::NumericArray<arrow::Int32Type>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(std::_Sp_alloc_shared_tag<std::allocator<arrow::NumericArray<arrow::Int32Type> > >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr_base.h:1342:14
    #12 0x7f897b23772a in std::shared_ptr<arrow::NumericArray<arrow::Int32Type> >::shared_ptr<std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(std::_Sp_alloc_shared_tag<std::allocator<arrow::NumericArray<arrow::Int32Type> > >, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:359:4
    #13 0x7f897b23733e in std::shared_ptr<arrow::NumericArray<arrow::Int32Type> > std::allocate_shared<arrow::NumericArray<arrow::Int32Type>, std::allocator<arrow::NumericArray<arrow::Int32Type> >, std::shared_ptr<arrow::ArrayData>&>(std::allocator<arrow::NumericArray<arrow::Int32Type> > const&, std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:705:14
    #14 0x7f897b230674 in std::shared_ptr<arrow::NumericArray<arrow::Int32Type> > std::make_shared<arrow::NumericArray<arrow::Int32Type>, std::shared_ptr<arrow::ArrayData>&>(std::shared_ptr<arrow::ArrayData>&) /usr/bin/../lib/gcc/x86_64-linux-gnu/8/../../../../include/c++/8/bits/shared_ptr.h:721:14
    #15 0x7f897b1ca924 in std::shared_ptr<arrow::Array> arrow::r::MakeSimpleArray<13, arrow::Int32Type>(SEXPREC*) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:913:10
    #16 0x7f897b1b5885 in arrow::r::Array__from_vector_reuse_memory(SEXPREC*) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:919:14
    #17 0x7f897b1b095c in arrow::r::Array__from_vector(SEXPREC*, std::shared_ptr<arrow::DataType> const&, bool) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:983:12
    #18 0x7f897b1b7024 in Array__from_vector(SEXPREC*, SEXPREC*) /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/array_from_vector.cpp:1047:10
    #19 0x7f897b2894fa in _arrow_Array__from_vector /tmp/RtmpY3I3AL/R.INSTALL1e366ad6e15d/arrow/src/arrowExports.cpp:481:20
@@ -69,8 +69,9 @@ ENV LANG=en_US.UTF-8
RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 \
--slave /usr/bin/g++ g++ /usr/bin/g++-8

RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-7 800 \
--slave /usr/bin/clang++ clang++ /usr/bin/clang++-7
RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-7 700 \
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if the 700 is relevant

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that is a priority level, so I think you can just leave it at the original value.

@jeroen
Copy link
Contributor

jeroen commented Aug 22, 2019

Thanks this makes the output more informative.

@wch wch merged commit 9a1c918 into wch:master Aug 22, 2019
@fsaintjacques
Copy link
Contributor Author

fsaintjacques commented Aug 22, 2019

Note for future users, you probably want to filter R's internal frames since the eval stack frames is quite big (~200 frames), e.g.

RDsan < testthat.R 2>&1 | grep -v '/tmp/r-source/' > RDsan.failures

Otherwise you have a lot of likely irrelevant lines:

    #10 0x7f604f2ee8a7 in R_doDotCall /tmp/r-source/src/main/dotcode.c:570  
    #11 0x7f604f3df4c6 in bcEval /tmp/r-source/src/main/eval.c:7293          
    #12 0x7f604f38afcf in Rf_eval /tmp/r-source/src/main/eval.c:620        
    #13 0x7f604f390e6b in R_execClosure /tmp/r-source/src/main/eval.c:1780   
    #14 0x7f604f3905b9 in Rf_applyClosure /tmp/r-source/src/main/eval.c:1706
    #15 0x7f604f38c298 in Rf_eval /tmp/r-source/src/main/eval.c:743          
    #16 0x7f604f390e6b in R_execClosure /tmp/r-source/src/main/eval.c:1780 
    #17 0x7f604f3905b9 in Rf_applyClosure /tmp/r-source/src/main/eval.c:1706 
    #18 0x7f604f38c298 in Rf_eval /tmp/r-source/src/main/eval.c:743      
    #19 0x7f6043e8792e in rlang_eval export/exported.c:78                  
    #20 0x7f604f2ee914 in R_doDotCall /tmp/r-source/src/main/dotcode.c:573 
    #21 0x7f604f3df4c6 in bcEval /tmp/r-source/src/main/eval.c:7293          
    #22 0x7f604f38afcf in Rf_eval /tmp/r-source/src/main/eval.c:620       
    #23 0x7f604f390e6b in R_execClosure /tmp/r-source/src/main/eval.c:1780 
...
    #244 0x7f604f3905b9 in Rf_applyClosure /tmp/r-source/src/main/eval.c:1706
    #245 0x7f604f3b8309 in bcEval /tmp/r-source/src/main/eval.c:6743
    #246 0x7f604f38afcf in Rf_eval /tmp/r-source/src/main/eval.c:620
    #247 0x7f604f38a7e0 in forcePromise /tmp/r-source/src/main/eval.c:516
    #248 0x7f604f3a2449 in FORCE_PROMISE /tmp/r-source/src/main/eval.c:4900
    #249 0x7f604f3a2d09 in getvar /tmp/r-source/src/main/eval.c:4973

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants