tsan_printf_test.cc revision da4edd850db1a333c15fc3b0abc01a2e8d2f08fe
1da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===-- tsan_printf_test.cc -------------------------------------*- C++ -*-===// 2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// The LLVM Compiler Infrastructure 4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is distributed under the University of Illinois Open Source 6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// License. See LICENSE.TXT for details. 7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_rtl.h" 14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h" 15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <string.h> 17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include <limits.h> 18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanynamespace __tsan { 20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Printf, Basic) { 22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf[1024]; 23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany uptr len = Snprintf(buf, sizeof(buf), 24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany "a%db%ldc%lldd%ue%luf%llug%xh%lxq%llxw%pe%sr", 25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany (int)-1, (long)-2, (long long)-3, // NOLINT 26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany (unsigned)-4, (unsigned long)5, (unsigned long long)6, // NOLINT 27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany (unsigned)10, (unsigned long)11, (unsigned long long)12, // NOLINT 28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany (void*)0x123, "_string_"); 29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(len, strlen(buf)); 30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(0, strcmp(buf, "a-1b-2c-3d4294967292e5f6gahbqcw" 31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany "0x000000000123e_string_r")); 32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Printf, OverflowStr) { 35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf[] = "123456789"; 36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany uptr len = Snprintf(buf, 4, "%s", "abcdef"); 37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(len, (uptr)6); 38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(0, strcmp(buf, "abc")); 39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[3], 0); 40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[4], '5'); 41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[5], '6'); 42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[6], '7'); 43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[7], '8'); 44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[8], '9'); 45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[9], 0); 46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 47da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 48da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Printf, OverflowInt) { 49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf[] = "123456789"; 50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Snprintf(buf, 4, "%d", -123456789); 51da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(0, strcmp(buf, "-12")); 52da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[3], 0); 53da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[4], '5'); 54da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[5], '6'); 55da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[6], '7'); 56da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[7], '8'); 57da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[8], '9'); 58da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[9], 0); 59da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 61da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Printf, OverflowUint) { 62da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf[] = "123456789"; 63da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Snprintf(buf, 4, "a%llx", (long long)0x123456789); // NOLINT 64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(0, strcmp(buf, "a12")); 65da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[3], 0); 66da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[4], '5'); 67da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[5], '6'); 68da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[6], '7'); 69da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[7], '8'); 70da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[8], '9'); 71da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[9], 0); 72da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 73da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 74da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Printf, OverflowPtr) { 75da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf[] = "123456789"; 76da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany Snprintf(buf, 4, "%p", (void*)0x123456789); 77da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(0, strcmp(buf, "0x0")); 78da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[3], 0); 79da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[4], '5'); 80da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[5], '6'); 81da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[6], '7'); 82da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[7], '8'); 83da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[8], '9'); 84da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(buf[9], 0); 85da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 86da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 87da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanytemplate<typename T> 88da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void TestMinMax(const char *fmt, T min, T max) { 89da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf[1024]; 90da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany uptr len = Snprintf(buf, sizeof(buf), fmt, min, max); 91da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char buf2[1024]; 92da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany snprintf(buf2, sizeof(buf2), fmt, min, max); 93da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(len, strlen(buf)); 94da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany EXPECT_EQ(0, strcmp(buf, buf2)); 95da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 96da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 97da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Printf, MinMax) { 98da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<int>("%d-%d", INT_MIN, INT_MAX); // NOLINT 99da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<long>("%ld-%ld", LONG_MIN, LONG_MAX); // NOLINT 100da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<long long>("%lld-%lld", LLONG_MIN, LLONG_MAX); // NOLINT 101da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<unsigned>("%u-%u", 0, UINT_MAX); // NOLINT 102da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<unsigned long>("%lu-%lu", 0, ULONG_MAX); // NOLINT 103da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<unsigned long long>("%llu-%llu", 0, ULLONG_MAX); // NOLINT 104da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<unsigned>("%x-%x", 0, UINT_MAX); // NOLINT 105da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<unsigned long>("%lx-%lx", 0, ULONG_MAX); // NOLINT 106da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany TestMinMax<unsigned long long>("%llx-%llx", 0, ULLONG_MAX); // NOLINT 107da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 108da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 109da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} // namespace __tsan 110