This is an archive of the discontinued LLVM Phabricator instance.

[WinASan] Improve exception reporting accuracy
ClosedPublic

Authored by rnk on Nov 30 2020, 12:58 PM.

Details

Summary

Previously, ASan would produce reports like this:
ERROR: AddressSanitizer: breakpoint on unknown address 0x000000000000 (pc 0x7fffdd7c5e86 ...)

This is unhelpful, because the developer may think this is a null
pointer dereference, and not a breakpoint exception on some PC.

The cause was that SignalContext::GetAddress would read the
ExceptionInformation array to retreive an address for any kind of
exception. That data is only available for access violation exceptions.
This changes it to be conditional on the exception type, and to use the
PC otherwise.

I added a variety of tests for common exception types:

  • int div zero
  • breakpoint
  • ud2a / illegal instruction
  • SSE misalignment

I also tightened up IsMemoryAccess and GetWriteFlag to check the
ExceptionCode rather than looking at ExceptionInformation[1] directly.

Diff Detail

Event Timeline

rnk created this revision.Nov 30 2020, 12:58 PM
Herald added a project: Restricted Project. · View Herald TranscriptNov 30 2020, 12:58 PM
Herald added a subscriber: Restricted Project. · View Herald Transcript
rnk requested review of this revision.Nov 30 2020, 12:58 PM
mcgov accepted this revision.Nov 30 2020, 3:29 PM
This revision is now accepted and ready to land.Nov 30 2020, 3:29 PM
This revision was automatically updated to reflect the committed changes.