This is an archive of the discontinued LLVM Phabricator instance.

[sanitizer][asan][win] Enable commit on demand for i686
DraftPublic

Authored by alvinhochun on Apr 23 2023, 8:33 AM.
This is a draft revision that has not yet been submitted for review.

Details

Reviewers
None
Summary

D21942 / 1128db8fe1c13800ebc77206efc50d0a219b8750 added support for
committing shadow memory on demand on Win 64-bit. The reason it is not
enabled on 32-bit wasn't clear but the page table overhead on Windows 7
may be a contributing factor.

In AsanMapUnmapCallback::OnUnmap, FlushUnneededASanShadowMemory is
called to release shadow memory. It calls ReleaseMemoryPagesToOS,
which had been a no-op on Windows, until D95892 /
81b1d3da094c54ffd75e05c8d4683792edf17f4c in which it was changed to
unmap full pages that the memory region covers. This was done on both
32-bit and 64-bit.

AddressSanitizerInterface.GetHeapSizeTest appears to fail on i686
targets as a side effect of this. This test allocates and frees a huge
chunk of memory which causes shadow memory to be unmapped immediately.
When the test allocates the chunk of memory a second time, asan tries to
reuse the same shadow memory region, but because the shadow memory has
now been unmapped, it causes an access violation and crashes the test.

x86_64 is not affected, because the code that handles commiting shadow
memory on demand also handles this situation, allowing the test to work
without crashing.

This change fixes the above issue by also enabling the commit-on-demand
feature on i686 target.

Diff Detail