On Wed, Aug 2, 2017 at 1:56 PM, Yury Gribov <tetra2005.patc...@gmail.com> wrote:
> On 02.08.2017 21:48, H.J. Lu wrote:
>>
>> On Wed, Aug 2, 2017 at 1:39 PM, Yury Gribov <tetra2005.patc...@gmail.com>
>> wrote:
>>>
>>> On 02.08.2017 20:02, Jeff Law wrote:
>>>>
>>>>
>>>> On 08/02/2017 12:47 PM, Jakub Jelinek wrote:
>>>>>
>>>>>
>>>>> On Wed, Aug 02, 2017 at 12:38:13PM -0600, Jeff Law wrote:
>>>>>>
>>>>>>
>>>>>> On 07/17/2017 01:23 AM, Yuri Gribov wrote:
>>>>>>>
>>>>>>>
>>>>>>> I've rebased the previous patch to trunk per Andrew's suggestion.
>>>>>>> Original patch description/motivation/questions are in
>>>>>>> https://gcc.gnu.org/ml/gcc-patches/2017-06/msg01869.html
>>>>>>
>>>>>>
>>>>>> Is his stuff used for exception handling?  If so, doesn't that make
>>>>>> the
>>>>>> performance a significant concern (ie that msync call?)
>>>>>
>>>>>
>>>>>
>>>>> For the performance issue, I wonder if it wouldn't be better to just
>>>>> compile the unwinder twice, basically include everything needed for the
>>>>> verification backtrace in a single *.c file with special defines, and
>>>>> not export anything from that *.o file except the single entrypoint.
>>>>> That would also handle the ABI problems.
>>>>
>>>>
>>>> Yea.
>>>>
>>>> Given that the vast majority of the time the addresses are valid, I
>>>> wonder if we could take advantage of that property to keep the overhead
>>>> lower in the most common cases.
>>>>
>>>>> For the concurrent calls of other threads unmapping stacks of running
>>>>> threads (that is where most of the verification goes against), I'm
>>>>> afraid
>>>>> that is simply non-solveable, even if you don't cache anything, it will
>>>>> still be racy.
>>>>
>>>>
>>>> Absolutely -- I think solving this stuff 100% reliably without races
>>>> isn't possible.  I think the question is can we make this significantly
>>>> better.
>>>
>>>
>>>
>>> All,
>>>
>>> First of all, thanks for the feedback.  This is indeed not a 100% robust
>>> solution, just something to allow tools like Asan to produce more sane
>>> backtraces on crash (currently when stack is corrupted they would crash
>>> in
>>> the unwinder without printing at least partial backtrace).
>>>
>>
>> FWIW, glibc 2.26 is changed to abort as soon as possible when stack is
>> corrupted:
>>
>> https://sourceware.org/bugzilla/show_bug.cgi?id=21752
>> https://sourceware.org/bugzilla/show_bug.cgi?id=12189
>>
>> There is very little point to unwind stack when stack is corrupted.
>
>
> I'd argue that situation with __stack_chk_fail is very special.  It's used
> in production code where you'd want to halt as soon as corruption is
> detected to prevent further damage so even printing message is an additional
> risk.  Debugging tools (e.g. sanitizers) are different and would prefer to
> print as many survived frames as possible.
>

But stack unwinder in libgcc is primarily for production use, not for debugging.
Use it to unwind corrupted stack isn't appropriate.   Santizer can try similar
similar to valgrind to invoke a debugger to unwind corrupted stack.

-- 
H.J.

Reply via email to