[llvm-dev] [RFC] ASan: patches to support 32-byte shadow granularity

Evgenii Stepanov via llvm-dev llvm-dev at lists.llvm.org
Wed Nov 8 13:10:11 PST 2017


On Tue, Nov 7, 2017 at 4:50 PM, Walter Lee <waltl at google.com> wrote:
> I've finished my initial set of patches to make 32-byte shadow
> granularity work on x86.  Here is a summary of the changes from last
> week:
>
> - As discussed, I added a full redzone after every stack variable.
>
> - We discussed adding a -fsanitize-address-granularity=N flag, but I
>   found the following existing flag has been sufficient for my
>   purposes: -asan-mapping-scale N.  If anyone thinks I should add the
>   flag anyways, possibly replacing the latter, please let me know.

IMO a clang flag would mean that non-standard setting for address
granularity is a supported configuration. That would require the
driver to link correct runtime library, which means we either build
two copies of libclang_rt.asan for each platform and somehow encode
the granularity value in the library name; or export that value from
instrumented code through a global, but then it stops being a
compile-time constant, and that may have effect on performance. Either
way would be an ABI break.

I think what you really want is to test shadow scale = 5 on
linux/x86_64 as a substitute for testing on the real hardware. For
that, a cmake variable in compiler-rt and an LLVM flag
(asan-mapping-scale) is more than enough.

>
> - I've modified the build so that we always run the ASan
>   instrumentation test suite for shadow scale values of 3 and 5.
>
> - I've gone through the asan test suites to make them run cleanly for
>   both shadow scale=3 and shadow scale=5.  Here are the tests I have
>   disabled, grouped by categories:
>
>   - Instrumentation/AddressSanitizer tests.  Most tests work out of
>     the box, and I ported some basic tests, leaving the following:
>
>     llvm/test/Instrumentation/AddressSanitizer/lifetime-throw.ll
>     llvm/test/Instrumentation/AddressSanitizer/lifetime-uar-uas.ll
>     llvm/test/Instrumentation/AddressSanitizer/lifetime.ll
>     llvm/test/Instrumentation/AddressSanitizer/stack-poisoning-and-lifetime-be.ll
>     llvm/test/Instrumentation/AddressSanitizer/stack-poisoning-and-lifetime.ll
>     llvm/test/Instrumentation/AddressSanitizer/stack-poisoning.ll
>     llvm/test/Instrumentation/AddressSanitizer/stack_layout.ll
>
>   - Asm instrumentation not supported:
>     Instrumentation/AddressSanitizer/X86/*
>     compiler-rt/lib/asan/tests/asan_asm_test.cc
>     compiler-rt/test/asan/TestCases/Linux/asan-asm-stacktrace-test.cc
>
>   - Prelinking not supported:
>     compiler-rt/test/asan/TestCases/Linux/asan_prelink_test.cc
>
>   - Intra-object padding not supported:
>     compiler-rt/test/asan/TestCases/intra-object-overflow.cc
>
>   - Calls __asan_poison_memory_region in middle of shadow byte:
>     compiler-rt/lib/asan/tests/asan_interface_test.cc
>       SimplePoisonMemoryRegionTest
>       OverlappingPoisonMemoryRegionTest
>       PoisoningStressTest
>     compiler-rt/test/asan/TestCases/small_memcpy_test.cc
>     compiler-rt/test/asan/TestCases/strtol_strict.c
>     compiler-rt/test/asan/TestCases/strtoll_strict.c
>
>   - Has hardwired memory map:
>     compiler-rt/test/asan/TestCases/Linux/cuda_test.cc
>     compiler-rt/test/asan/TestCases/Linux/kernel-area.cc
>     compiler-rt/test/asan/TestCases/Linux/nohugepage_test.cc
>
>   - Miscellaneous:
>     compiler-rt/test/asan/TestCases/Linux/allocator_oom_test.cc
>       This test assumes amount of available memory.
>     compiler-rt/test/asan/TestCases/stack-buffer-overflow-with-position.cc
>       This fails because we don't have enough redzones to disambiguate
>       overflow of one stack object vs underflow of the next stack
>       object.
>
> - Here is the full list of revisions.  I'll add review requests
>   shortly.
>
> [asan] Add CMake hook to override default shadow scale
>        https://reviews.llvm.org/D39469
> [asan] Fix size/alignment issues with non-default shadow scale
>        https://reviews.llvm.org/D39470
> [asan] Fix small X86_64 ShadowOffset for non-default shadow scale
>        https://reviews.llvm.org/D39471
> [asan] Ensure that the minimum redzone is at least SHADOW_GRANULARITY
>        https://reviews.llvm.org/D39472
> [sanitizers] Increase alignment of low level allocator
>        https://reviews.llvm.org/D39473
> [asan] Avoid assert failure for non-default shadow scale
>        https://reviews.llvm.org/D39474
> [asan] Add full redzone after every stack variable
>        https://reviews.llvm.org/D39475
> [gtest] Increase stack size for child process in EXPECT_DEATH implementation
>        https://reviews.llvm.org/D39771
> [asan] Add lit feature for custom shadow scale
>        https://reviews.llvm.org/D39772
> [asan] Port tests to shadow scale of 5
>        https://reviews.llvm.org/D39773
> [asan] Disable unsupported tests for custom shadow scale
>        https://reviews.llvm.org/D39774
> [asan] Test ASan instrumentation for shadow scale value of 5
>        https://reviews.llvm.org/D39775
>
> Thanks,
>
> Walter


More information about the llvm-dev mailing list