64 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <string>10 11// This test verifies that the ASan annotations for basic_string objects remain accurate12// after invoking basic_string::reserve(size_type __requested_capacity).13// Different types are used to confirm that ASan works correctly with types of different sizes.14#include <string>15#include <cassert>16 17#include "test_macros.h"18#include "asan_testing.h"19 20template <class S>21void test() {22 S short_s1(3, 'a'), long_s1(100, 'c');23 short_s1.reserve(0x1337);24 long_s1.reserve(0x1337);25 26 LIBCPP_ASSERT(is_string_asan_correct(short_s1));27 LIBCPP_ASSERT(is_string_asan_correct(long_s1));28 29 short_s1.clear();30 long_s1.clear();31 32 LIBCPP_ASSERT(is_string_asan_correct(short_s1));33 LIBCPP_ASSERT(is_string_asan_correct(long_s1));34 35 short_s1.reserve(0x1);36 long_s1.reserve(0x1);37 38 LIBCPP_ASSERT(is_string_asan_correct(short_s1));39 LIBCPP_ASSERT(is_string_asan_correct(long_s1));40 41 S short_s2(3, 'a'), long_s2(100, 'c');42 short_s2.reserve(0x1);43 long_s2.reserve(0x1);44 45 LIBCPP_ASSERT(is_string_asan_correct(short_s2));46 LIBCPP_ASSERT(is_string_asan_correct(long_s2));47}48 49int main(int, char**) {50 test<std::string>();51#ifndef TEST_HAS_NO_WIDE_CHARACTERS52 test<std::wstring>();53#endif54#if TEST_STD_VER >= 1155 test<std::u16string>();56 test<std::u32string>();57#endif58#if TEST_STD_VER >= 2059 test<std::u8string>();60#endif61 62 return 0;63}64