| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // <string> |
| |
| // This test verifies that the ASan annotations for basic_string objects remain accurate |
| // after invoking basic_string::reserve(size_type __requested_capacity). |
| // Different types are used to confirm that ASan works correctly with types of different sizes. |
| #include <string> |
| #include <cassert> |
| |
| #include "test_macros.h" |
| #include "asan_testing.h" |
| |
| template <class S> |
| void test() { |
| S short_s1(3, 'a'), long_s1(100, 'c'); |
| short_s1.reserve(0x1337); |
| long_s1.reserve(0x1337); |
| |
| LIBCPP_ASSERT(is_string_asan_correct(short_s1)); |
| LIBCPP_ASSERT(is_string_asan_correct(long_s1)); |
| |
| short_s1.clear(); |
| long_s1.clear(); |
| |
| LIBCPP_ASSERT(is_string_asan_correct(short_s1)); |
| LIBCPP_ASSERT(is_string_asan_correct(long_s1)); |
| |
| short_s1.reserve(0x1); |
| long_s1.reserve(0x1); |
| |
| LIBCPP_ASSERT(is_string_asan_correct(short_s1)); |
| LIBCPP_ASSERT(is_string_asan_correct(long_s1)); |
| |
| S short_s2(3, 'a'), long_s2(100, 'c'); |
| short_s2.reserve(0x1); |
| long_s2.reserve(0x1); |
| |
| LIBCPP_ASSERT(is_string_asan_correct(short_s2)); |
| LIBCPP_ASSERT(is_string_asan_correct(long_s2)); |
| } |
| |
| int main(int, char**) { |
| test<std::string>(); |
| #ifndef TEST_HAS_NO_WIDE_CHARACTERS |
| test<std::wstring>(); |
| #endif |
| #if TEST_STD_VER >= 11 |
| test<std::u16string>(); |
| test<std::u32string>(); |
| #endif |
| #if TEST_STD_VER >= 20 |
| test<std::u8string>(); |
| #endif |
| |
| return 0; |
| } |