зеркало из https://github.com/microsoft/STL.git
`<vector>`: Correctly pass target size, not size change to ASan annotator (#2420)
This commit is contained in:
Родитель
3318135d9c
Коммит
303df3dae6
|
@ -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() {
|
||||
|
|
Загрузка…
Ссылка в новой задаче