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