xref: /openbsd-src/gnu/llvm/compiler-rt/lib/scudo/standalone/tests/strings_test.cpp (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- strings_test.cpp ----------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick 
93cab2bb3Spatrick #include "tests/scudo_unit_test.h"
103cab2bb3Spatrick 
113cab2bb3Spatrick #include "string_utils.h"
123cab2bb3Spatrick 
133cab2bb3Spatrick #include <limits.h>
143cab2bb3Spatrick 
TEST(ScudoStringsTest,Constructor)15d89ec533Spatrick TEST(ScudoStringsTest, Constructor) {
16d89ec533Spatrick   scudo::ScopedString Str;
17d89ec533Spatrick   EXPECT_EQ(0ul, Str.length());
18d89ec533Spatrick   EXPECT_EQ('\0', *Str.data());
19d89ec533Spatrick }
20d89ec533Spatrick 
TEST(ScudoStringsTest,Basic)213cab2bb3Spatrick TEST(ScudoStringsTest, Basic) {
22d89ec533Spatrick   scudo::ScopedString Str;
233cab2bb3Spatrick   Str.append("a%db%zdc%ue%zuf%xh%zxq%pe%sr", static_cast<int>(-1),
243cab2bb3Spatrick              static_cast<scudo::uptr>(-2), static_cast<unsigned>(-4),
253cab2bb3Spatrick              static_cast<scudo::uptr>(5), static_cast<unsigned>(10),
263cab2bb3Spatrick              static_cast<scudo::uptr>(11), reinterpret_cast<void *>(0x123),
273cab2bb3Spatrick              "_string_");
283cab2bb3Spatrick   EXPECT_EQ(Str.length(), strlen(Str.data()));
293cab2bb3Spatrick 
303cab2bb3Spatrick   std::string expectedString = "a-1b-2c4294967292e5fahbq0x";
313cab2bb3Spatrick   expectedString += std::string(SCUDO_POINTER_FORMAT_LENGTH - 3, '0');
323cab2bb3Spatrick   expectedString += "123e_string_r";
333cab2bb3Spatrick   EXPECT_EQ(Str.length(), strlen(Str.data()));
343cab2bb3Spatrick   EXPECT_STREQ(expectedString.c_str(), Str.data());
353cab2bb3Spatrick }
363cab2bb3Spatrick 
TEST(ScudoStringsTest,Clear)37d89ec533Spatrick TEST(ScudoStringsTest, Clear) {
38d89ec533Spatrick   scudo::ScopedString Str;
39d89ec533Spatrick   Str.append("123");
40d89ec533Spatrick   Str.clear();
41d89ec533Spatrick   EXPECT_EQ(0ul, Str.length());
42d89ec533Spatrick   EXPECT_EQ('\0', *Str.data());
43d89ec533Spatrick }
44d89ec533Spatrick 
TEST(ScudoStringsTest,ClearLarge)45d89ec533Spatrick TEST(ScudoStringsTest, ClearLarge) {
46*810390e3Srobert   constexpr char appendString[] = "123";
47d89ec533Spatrick   scudo::ScopedString Str;
48*810390e3Srobert   Str.reserve(sizeof(appendString) * 10000);
49d89ec533Spatrick   for (int i = 0; i < 10000; ++i)
50*810390e3Srobert     Str.append(appendString);
51d89ec533Spatrick   Str.clear();
52d89ec533Spatrick   EXPECT_EQ(0ul, Str.length());
53d89ec533Spatrick   EXPECT_EQ('\0', *Str.data());
54d89ec533Spatrick }
55d89ec533Spatrick 
TEST(ScudoStringsTest,Precision)563cab2bb3Spatrick TEST(ScudoStringsTest, Precision) {
57d89ec533Spatrick   scudo::ScopedString Str;
583cab2bb3Spatrick   Str.append("%.*s", 3, "12345");
593cab2bb3Spatrick   EXPECT_EQ(Str.length(), strlen(Str.data()));
603cab2bb3Spatrick   EXPECT_STREQ("123", Str.data());
613cab2bb3Spatrick   Str.clear();
623cab2bb3Spatrick   Str.append("%.*s", 6, "12345");
633cab2bb3Spatrick   EXPECT_EQ(Str.length(), strlen(Str.data()));
643cab2bb3Spatrick   EXPECT_STREQ("12345", Str.data());
653cab2bb3Spatrick   Str.clear();
663cab2bb3Spatrick   Str.append("%-6s", "12345");
673cab2bb3Spatrick   EXPECT_EQ(Str.length(), strlen(Str.data()));
683cab2bb3Spatrick   EXPECT_STREQ("12345 ", Str.data());
693cab2bb3Spatrick }
703cab2bb3Spatrick 
fillString(scudo::ScopedString & Str,scudo::uptr Size)713cab2bb3Spatrick static void fillString(scudo::ScopedString &Str, scudo::uptr Size) {
723cab2bb3Spatrick   for (scudo::uptr I = 0; I < Size; I++)
733cab2bb3Spatrick     Str.append("A");
743cab2bb3Spatrick }
753cab2bb3Spatrick 
TEST(ScudoStringTest,PotentialOverflows)763cab2bb3Spatrick TEST(ScudoStringTest, PotentialOverflows) {
773cab2bb3Spatrick   // Use a ScopedString that spans a page, and attempt to write past the end
783cab2bb3Spatrick   // of it with variations of append. The expectation is for nothing to crash.
793cab2bb3Spatrick   const scudo::uptr PageSize = scudo::getPageSizeCached();
80d89ec533Spatrick   scudo::ScopedString Str;
81*810390e3Srobert   Str.reserve(2 * PageSize);
823cab2bb3Spatrick   Str.clear();
833cab2bb3Spatrick   fillString(Str, 2 * PageSize);
843cab2bb3Spatrick   Str.clear();
853cab2bb3Spatrick   fillString(Str, PageSize - 64);
863cab2bb3Spatrick   Str.append("%-128s", "12345");
873cab2bb3Spatrick   Str.clear();
883cab2bb3Spatrick   fillString(Str, PageSize - 16);
893cab2bb3Spatrick   Str.append("%024x", 12345);
903cab2bb3Spatrick   Str.clear();
913cab2bb3Spatrick   fillString(Str, PageSize - 16);
923cab2bb3Spatrick   Str.append("EEEEEEEEEEEEEEEEEEEEEEEE");
933cab2bb3Spatrick }
943cab2bb3Spatrick 
953cab2bb3Spatrick template <typename T>
testAgainstLibc(const char * Format,T Arg1,T Arg2)963cab2bb3Spatrick static void testAgainstLibc(const char *Format, T Arg1, T Arg2) {
97d89ec533Spatrick   scudo::ScopedString Str;
983cab2bb3Spatrick   Str.append(Format, Arg1, Arg2);
993cab2bb3Spatrick   char Buffer[128];
1003cab2bb3Spatrick   snprintf(Buffer, sizeof(Buffer), Format, Arg1, Arg2);
1013cab2bb3Spatrick   EXPECT_EQ(Str.length(), strlen(Str.data()));
1023cab2bb3Spatrick   EXPECT_STREQ(Buffer, Str.data());
1033cab2bb3Spatrick }
1043cab2bb3Spatrick 
TEST(ScudoStringsTest,MinMax)1053cab2bb3Spatrick TEST(ScudoStringsTest, MinMax) {
1063cab2bb3Spatrick   testAgainstLibc<int>("%d-%d", INT_MIN, INT_MAX);
1073cab2bb3Spatrick   testAgainstLibc<unsigned>("%u-%u", 0, UINT_MAX);
1083cab2bb3Spatrick   testAgainstLibc<unsigned>("%x-%x", 0, UINT_MAX);
1093cab2bb3Spatrick   testAgainstLibc<long>("%zd-%zd", LONG_MIN, LONG_MAX);
1103cab2bb3Spatrick   testAgainstLibc<unsigned long>("%zu-%zu", 0, ULONG_MAX);
1113cab2bb3Spatrick   testAgainstLibc<unsigned long>("%zx-%zx", 0, ULONG_MAX);
1123cab2bb3Spatrick }
1133cab2bb3Spatrick 
TEST(ScudoStringsTest,Padding)1143cab2bb3Spatrick TEST(ScudoStringsTest, Padding) {
1153cab2bb3Spatrick   testAgainstLibc<int>("%3d - %3d", 1, 0);
1163cab2bb3Spatrick   testAgainstLibc<int>("%3d - %3d", -1, 123);
1173cab2bb3Spatrick   testAgainstLibc<int>("%3d - %3d", -1, -123);
1183cab2bb3Spatrick   testAgainstLibc<int>("%3d - %3d", 12, 1234);
1193cab2bb3Spatrick   testAgainstLibc<int>("%3d - %3d", -12, -1234);
1203cab2bb3Spatrick   testAgainstLibc<int>("%03d - %03d", 1, 0);
1213cab2bb3Spatrick   testAgainstLibc<int>("%03d - %03d", -1, 123);
1223cab2bb3Spatrick   testAgainstLibc<int>("%03d - %03d", -1, -123);
1233cab2bb3Spatrick   testAgainstLibc<int>("%03d - %03d", 12, 1234);
1243cab2bb3Spatrick   testAgainstLibc<int>("%03d - %03d", -12, -1234);
1253cab2bb3Spatrick }
126