[ASan][libcxx] Annotating std::vector with all allocators
authorAdvenam Tacet <advenam.tacet@trailofbits.com>
Fri, 5 May 2023 00:43:51 +0000 (17:43 -0700)
committerNikolas Klauser <n_klauser@apple.com>
Fri, 5 May 2023 00:44:06 +0000 (17:44 -0700)
commitc08d4ad25cf3f335e9b2e7b1b149eb1b486868f1
tree9257cff309db19fbac6cd0b26e06b8215709e2f6
parent901266dad313c114e12c181651249e30e5902e26
[ASan][libcxx] Annotating std::vector with all allocators

This revision is a part of a series of patches extending
AddressSanitizer C++ container overflow detection
capabilities by adding annotations, similar to those existing
in std::vector, to std::string and std::deque collections.
These changes allow ASan to detect cases when the instrumented
program accesses memory which is internally allocated by
the collection but is still not in-use (accesses before or
after the stored elements for std::deque, or between the size and
capacity bounds for std::string).

The motivation for the research and those changes was a bug,
found by Trail of Bits, in a real code where an out-of-bounds read
could happen as two strings were compared via a std::equals function
that took iter1_begin, iter1_end, iter2_begin iterators
(with a custom comparison function).
When object iter1 was longer than iter2, read out-of-bounds on iter2
could happen. Container sanitization would detect it.

In revision D132522, support for non-aligned memory buffers (sharing
first/last granule with other objects) was added, therefore the
check for standard allocator is not necessary anymore.
This patch removes the check in std::vector annotation member
function (__annotate_contiguous_container) to support
different allocators.

Additionally, this revision fixes unpoisoning in std::vector.
It guarantees that __alloc_traits::deallocate may access returned memory.
Originally suggested in D144155 revision.

If you have any questions, please email:
 - advenam.tacet@trailofbits.com
 - disconnect3d@trailofbits.com

Reviewed By: #libc, #sanitizers, philnik, vitalybuka, ldionne

Spies: mikhail.ramalho, manojgupta, ldionne, AntonBikineev, ayzhao, hans, EricWF, philnik, #sanitizers, libcxx-commits

Differential Revision: https://reviews.llvm.org/D136765
libcxx/include/vector
libcxx/test/libcxx/containers/sequences/vector/asan.pass.cpp
libcxx/test/libcxx/containers/sequences/vector/asan_turning_off.pass.cpp [new file with mode: 0644]