r300295 - [docs] UBSan: Mention that print_stacktrace=1 is unsupported on Darwin

Vedant Kumar via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 14 11:00:28 PDT 2017


I hacked the UBSan runtime locally to use the fast unwinder. I thought this "worked", but it seems to only print one frame. This explains why:


 67 void BufferedStackTrace::FastUnwindStack(uptr pc, uptr bp, uptr stack_top,                                                                                                                                                                                                                                                
 68                                          uptr stack_bottom, u32 max_depth) {                                                                                                                                                                                                                                              
 69   const uptr kPageSize = GetPageSizeCached();                                                                                                                                                                                                                                                                            
 70   CHECK_GE(max_depth, 2);                                                                                                                                                                                                                                                                                                
 71   trace_buffer[0] = pc;                                                                                                                                                                                                                                                                                                  
 72   size = 1;                                                                                                                                                                                                                                                                                                              
 73   if (stack_top < 4096) return;  // Sanity check for stack top.  


There is a comment by Alexey Samsonov giving a warning about this:
                                                                                                                                                                                                                                                                                                           
 34   // We can only use slow unwind, as we don't have any information about stack                                                                                                                                                                                                                                            
 35   // top/bottom.                                                                                                                                                                                                                                                                                                          
 36   // FIXME: It's better to respect "fast_unwind_on_fatal" runtime flag and                                                                                                                                                                                                                                                
 37   // fetch stack top/bottom information if we have it (e.g. if we're running                                                                                                                                                                                                                                              
 38   // under ASan).                                                                                                                                                                                                                                                                                                        
 39   if (StackTrace::WillUseFastUnwind(false))                                                                                                                                                                                                                                                                              
 40     return;  

So, in the absence of stack top/bottom info, we'd need to add support for the slow unwinder.

vedant


> On Apr 14, 2017, at 10:19 AM, Kuba Mracek <mracek at apple.com> wrote:
> 
> What exactly is wrong with the fast unwinder?  It's used in ASan and TSan and besides not knowing about inlined frames, it works great.  But we're almost always dealing with code that has frame pointers (and the sanitizer runtimes themselves are built with frame pointers).
> 
> Kuba
> 
>> On 13 Apr 2017, at 19:18, Vedant Kumar via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>> 
>> Does anyone know what it would take to get the slow unwinder to work on Darwin?
>> 
>> thanks,
>> vedant
>> 
>>> On Apr 13, 2017, at 6:59 PM, Vedant Kumar via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>>> 
>>> Author: vedantk
>>> Date: Thu Apr 13 20:59:44 2017
>>> New Revision: 300295
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=300295&view=rev
>>> Log:
>>> [docs] UBSan: Mention that print_stacktrace=1 is unsupported on Darwin
>>> 
>>> Printing out stack traces along with UBSan diagnostics is unsupported on
>>> Darwin. That's because it isn't possible to use the fast unwinder or the
>>> slow unwinder.
>>> 
>>> Apparently, it's inappropriate to use the fast unwinder for UBSan
>>> issues. I'm not exactly sure why (see the comment in ubsan_diag.cc).
>>> Forcing use of the fast unwinder produces decent results, AFAICT.
>>> 
>>> Darwin also does not appear to have a slow unwinder suitable for use
>>> with the sanitizers. Apparently that's because of PR20800 [1][2]. But
>>> that bug has been fixed. I'm not sure if there is anything preventing
>>> use of the slow unwinder now.
>>> 
>>> Currently, passing UBSAN_OPTIONS=print_stacktrace=1 does nothing on
>>> Darwin. This isn't good, but it might be a while before we can fix the
>>> situation, so we should at least document it.
>>> 
>>> [1] https://github.com/google/sanitizers/issues/137
>>> "We can't use the slow unwinder on OSX now, because Clang produces
>>> incorrect unwind info for the ASan runtime functions on OSX
>>> (http://llvm.org/PR20800)."
>>> 
>>> [2] https://bugs.llvm.org/show_bug.cgi?id=20800
>>> Bug 20800 - Invalid compact unwind info generated for a function without
>>> frame pointers on OSX
>>> 
>>> Modified:
>>>  cfe/trunk/docs/UndefinedBehaviorSanitizer.rst
>>> 
>>> Modified: cfe/trunk/docs/UndefinedBehaviorSanitizer.rst
>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UndefinedBehaviorSanitizer.rst?rev=300295&r1=300294&r2=300295&view=diff
>>> ==============================================================================
>>> --- cfe/trunk/docs/UndefinedBehaviorSanitizer.rst (original)
>>> +++ cfe/trunk/docs/UndefinedBehaviorSanitizer.rst Thu Apr 13 20:59:44 2017
>>> @@ -157,6 +157,8 @@ will need to:
>>>  ``UBSAN_OPTIONS=print_stacktrace=1``.
>>> #. Make sure ``llvm-symbolizer`` binary is in ``PATH``.
>>> 
>>> +Stacktrace printing for UBSan issues is currently not supported on Darwin.
>>> +
>>> Issue Suppression
>>> =================
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> 



More information about the cfe-commits mailing list