`<vector>`: Correctly pass target size, not size change to ASan annotator (#2420)

This commit is contained in:
Curtis J Bezault 2021-12-16 19:33:10 -08:00 коммит произвёл GitHub
Родитель 3318135d9c
Коммит 303df3dae6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 63 добавлений и 6 удалений

Просмотреть файл

@ -1208,7 +1208,7 @@ public:
_ASAN_VECTOR_MODIFY(static_cast<difference_type>(_Newsize - _Oldsize));
_Mylast = _Uninitialized_fill_n(_Mylast, _Newsize - _Oldsize, _Val, _Al);
} else {
_ASAN_VECTOR_EXTEND_GUARD(static_cast<difference_type>(_Newsize - _Oldsize));
_ASAN_VECTOR_EXTEND_GUARD(_Newsize);
_Mylast = _Uninitialized_fill_n(_Mylast, _Newsize - _Oldsize, _Val, _Al);
_ASAN_VECTOR_RELEASE_GUARD;
}
@ -1290,7 +1290,7 @@ private:
_ASAN_VECTOR_MODIFY(static_cast<difference_type>(_Newsize - _Oldsize));
_Mylast = _Uninitialized_copy(_Mid, _Last, _Mylast, _Al);
} else {
_ASAN_VECTOR_EXTEND_GUARD(static_cast<difference_type>(_Newsize - _Oldsize));
_ASAN_VECTOR_EXTEND_GUARD(_Newsize);
_Mylast = _Uninitialized_copy(_Mid, _Last, _Mylast, _Al);
_ASAN_VECTOR_RELEASE_GUARD;
}
@ -1406,7 +1406,7 @@ private:
return;
}
_ASAN_VECTOR_EXTEND_GUARD(_Newsize - _Oldsize);
_ASAN_VECTOR_EXTEND_GUARD(_Newsize);
const pointer _Oldlast = _Mylast;
if constexpr (is_same_v<_Ty2, _Ty>) {
_Mylast = _Uninitialized_fill_n(_Oldlast, _Newsize - _Oldsize, _Val, _Al);
@ -1948,7 +1948,7 @@ private:
_ASAN_VECTOR_MODIFY(static_cast<difference_type>(_Newsize - _Oldsize));
_Mylast = _Uninitialized_move(_Mid, _Last, _Mylast, _Al);
} else {
_ASAN_VECTOR_EXTEND_GUARD(_Newsize - _Oldsize);
_ASAN_VECTOR_EXTEND_GUARD(_Newsize);
_Mylast = _Uninitialized_move(_Mid, _Last, _Mylast, _Al);
_ASAN_VECTOR_RELEASE_GUARD;
}

Просмотреть файл

@ -30,11 +30,33 @@ void __asan_describe_address(void*) noexcept;
#endif // ASan instrumentation enabled
struct non_trivial_can_throw {
non_trivial_can_throw() {}
non_trivial_can_throw() {
++i;
if (i == 0) {
throw i;
}
}
non_trivial_can_throw(const non_trivial_can_throw&) {
++i;
if (i == 0) {
throw i;
}
}
non_trivial_can_throw& operator=(const non_trivial_can_throw&) {
return *this;
}
unsigned int i = 0;
};
struct non_trivial_cannot_throw {
non_trivial_cannot_throw() noexcept {}
non_trivial_cannot_throw() noexcept {
++i;
}
unsigned int i = 0;
};
struct throw_on_construction {
@ -318,6 +340,23 @@ void test_move_assign() {
v2 = move(v1);
assert(verify_vector(v1));
assert(verify_vector(v2));
vector<T, Alloc> v3;
vector<T, Alloc> v4;
assert(verify_vector(v3));
assert(verify_vector(v4));
v3.reserve(v3.capacity() + 1);
assert(verify_vector(v3));
v3.resize(v3.capacity() + 1, T());
assert(verify_vector(v3));
v3.reserve(v3.capacity() + 1);
assert(verify_vector(v3));
v4.resize(v3.capacity(), T());
assert(verify_vector(v4));
v3 = move(v4);
assert(verify_vector(v3));
assert(verify_vector(v4));
}
template <class Alloc>
@ -420,18 +459,30 @@ void test_assign() {
assert(verify_vector(v1));
v1.assign(v3.begin(), v3.end());
assert(verify_vector(v1));
v1.reserve(v1.size() + 1);
assert(verify_vector(v1));
vector<T, Alloc> larger(v1.capacity());
v1.assign(larger.begin(), larger.end());
assert(verify_vector(v1));
v1.assign(t1.begin(), t1.end());
assert(verify_vector(v1));
v1.assign(t2.begin(), t2.end());
assert(verify_vector(v1));
v1.assign(t1.begin(), t1.end());
assert(verify_vector(v1));
v1.assign(v3.begin(), v3.end());
assert(verify_vector(v1));
v1.assign(v2.begin(), v2.end());
assert(verify_vector(v1));
v1.assign(N, T());
assert(verify_vector(v1));
v1.reserve(v1.size() + 1);
assert(verify_vector(v1));
v1.assign(v1.capacity(), T());
assert(verify_vector(v1));
vector<T, Alloc> v4;
v4.assign({T()});
@ -451,6 +502,12 @@ void test_resize() {
assert(verify_vector(v));
v.resize(1, T());
assert(verify_vector(v));
v.resize(v.capacity(), T());
assert(verify_vector(v));
v.resize(v.size() - 1, T());
assert(verify_vector(v));
v.resize(v.capacity() + N, T());
assert(verify_vector(v));
}
void test_push_back_throw() {