]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- sanitizer_printf_test.cc ------------------------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // Tests for sanitizer_printf.cc | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | #include "sanitizer_common/sanitizer_common.h" | |
14 | #include "sanitizer_common/sanitizer_libc.h" | |
15 | #include "gtest/gtest.h" | |
16 | ||
17 | #include <string.h> | |
18 | #include <limits.h> | |
19 | ||
20 | namespace __sanitizer { | |
21 | ||
22 | TEST(Printf, Basic) { | |
23 | char buf[1024]; | |
24 | uptr len = internal_snprintf(buf, sizeof(buf), | |
25 | "a%db%zdc%ue%zuf%xh%zxq%pe%sr", | |
5bcae85e SL |
26 | (int)-1, (uptr)-2, // NOLINT |
27 | (unsigned)-4, (uptr)5, // NOLINT | |
28 | (unsigned)10, (uptr)11, // NOLINT | |
1a4d82fc JJ |
29 | (void*)0x123, "_string_"); |
30 | EXPECT_EQ(len, strlen(buf)); | |
92a42be0 SL |
31 | |
32 | std::string expectedString = "a-1b-2c4294967292e5fahbq0x"; | |
33 | expectedString += std::string(SANITIZER_POINTER_FORMAT_LENGTH - 3, '0'); | |
34 | expectedString += "123e_string_r"; | |
35 | EXPECT_STREQ(expectedString.c_str(), buf); | |
1a4d82fc JJ |
36 | } |
37 | ||
38 | TEST(Printf, OverflowStr) { | |
39 | char buf[] = "123456789"; | |
40 | uptr len = internal_snprintf(buf, 4, "%s", "abcdef"); // NOLINT | |
41 | EXPECT_EQ(len, (uptr)6); | |
42 | EXPECT_STREQ("abc", buf); | |
43 | EXPECT_EQ(buf[3], 0); | |
44 | EXPECT_EQ(buf[4], '5'); | |
45 | EXPECT_EQ(buf[5], '6'); | |
46 | EXPECT_EQ(buf[6], '7'); | |
47 | EXPECT_EQ(buf[7], '8'); | |
48 | EXPECT_EQ(buf[8], '9'); | |
49 | EXPECT_EQ(buf[9], 0); | |
50 | } | |
51 | ||
52 | TEST(Printf, OverflowInt) { | |
53 | char buf[] = "123456789"; | |
54 | internal_snprintf(buf, 4, "%d", -123456789); // NOLINT | |
55 | EXPECT_STREQ("-12", buf); | |
56 | EXPECT_EQ(buf[3], 0); | |
57 | EXPECT_EQ(buf[4], '5'); | |
58 | EXPECT_EQ(buf[5], '6'); | |
59 | EXPECT_EQ(buf[6], '7'); | |
60 | EXPECT_EQ(buf[7], '8'); | |
61 | EXPECT_EQ(buf[8], '9'); | |
62 | EXPECT_EQ(buf[9], 0); | |
63 | } | |
64 | ||
65 | TEST(Printf, OverflowUint) { | |
66 | char buf[] = "123456789"; | |
67 | uptr val; | |
68 | if (sizeof(val) == 4) { | |
69 | val = (uptr)0x12345678; | |
70 | } else { | |
71 | val = (uptr)0x123456789ULL; | |
72 | } | |
73 | internal_snprintf(buf, 4, "a%zx", val); // NOLINT | |
74 | EXPECT_STREQ("a12", buf); | |
75 | EXPECT_EQ(buf[3], 0); | |
76 | EXPECT_EQ(buf[4], '5'); | |
77 | EXPECT_EQ(buf[5], '6'); | |
78 | EXPECT_EQ(buf[6], '7'); | |
79 | EXPECT_EQ(buf[7], '8'); | |
80 | EXPECT_EQ(buf[8], '9'); | |
81 | EXPECT_EQ(buf[9], 0); | |
82 | } | |
83 | ||
84 | TEST(Printf, OverflowPtr) { | |
85 | char buf[] = "123456789"; | |
86 | void *p; | |
87 | if (sizeof(p) == 4) { | |
88 | p = (void*)0x1234567; | |
89 | } else { | |
90 | p = (void*)0x123456789ULL; | |
91 | } | |
92 | internal_snprintf(buf, 4, "%p", p); // NOLINT | |
93 | EXPECT_STREQ("0x0", buf); | |
94 | EXPECT_EQ(buf[3], 0); | |
95 | EXPECT_EQ(buf[4], '5'); | |
96 | EXPECT_EQ(buf[5], '6'); | |
97 | EXPECT_EQ(buf[6], '7'); | |
98 | EXPECT_EQ(buf[7], '8'); | |
99 | EXPECT_EQ(buf[8], '9'); | |
100 | EXPECT_EQ(buf[9], 0); | |
101 | } | |
102 | ||
92a42be0 SL |
103 | #if defined(_WIN32) |
104 | // Oh well, MSVS headers don't define snprintf. | |
105 | # define snprintf _snprintf | |
106 | #endif | |
107 | ||
1a4d82fc JJ |
108 | template<typename T> |
109 | static void TestAgainstLibc(const char *fmt, T arg1, T arg2) { | |
110 | char buf[1024]; | |
111 | uptr len = internal_snprintf(buf, sizeof(buf), fmt, arg1, arg2); | |
112 | char buf2[1024]; | |
113 | snprintf(buf2, sizeof(buf2), fmt, arg1, arg2); | |
114 | EXPECT_EQ(len, strlen(buf)); | |
115 | EXPECT_STREQ(buf2, buf); | |
116 | } | |
117 | ||
118 | TEST(Printf, MinMax) { | |
119 | TestAgainstLibc<int>("%d-%d", INT_MIN, INT_MAX); // NOLINT | |
1a4d82fc | 120 | TestAgainstLibc<unsigned>("%u-%u", 0, UINT_MAX); // NOLINT |
1a4d82fc | 121 | TestAgainstLibc<unsigned>("%x-%x", 0, UINT_MAX); // NOLINT |
92a42be0 SL |
122 | #if !defined(_WIN32) |
123 | // %z* format doesn't seem to be supported by MSVS. | |
124 | TestAgainstLibc<long>("%zd-%zd", LONG_MIN, LONG_MAX); // NOLINT | |
125 | TestAgainstLibc<unsigned long>("%zu-%zu", 0, ULONG_MAX); // NOLINT | |
1a4d82fc | 126 | TestAgainstLibc<unsigned long>("%zx-%zx", 0, ULONG_MAX); // NOLINT |
92a42be0 | 127 | #endif |
1a4d82fc JJ |
128 | } |
129 | ||
130 | TEST(Printf, Padding) { | |
131 | TestAgainstLibc<int>("%3d - %3d", 1, 0); | |
132 | TestAgainstLibc<int>("%3d - %3d", -1, 123); | |
133 | TestAgainstLibc<int>("%3d - %3d", -1, -123); | |
134 | TestAgainstLibc<int>("%3d - %3d", 12, 1234); | |
135 | TestAgainstLibc<int>("%3d - %3d", -12, -1234); | |
136 | TestAgainstLibc<int>("%03d - %03d", 1, 0); | |
137 | TestAgainstLibc<int>("%03d - %03d", -1, 123); | |
138 | TestAgainstLibc<int>("%03d - %03d", -1, -123); | |
139 | TestAgainstLibc<int>("%03d - %03d", 12, 1234); | |
140 | TestAgainstLibc<int>("%03d - %03d", -12, -1234); | |
141 | } | |
142 | ||
143 | TEST(Printf, Precision) { | |
144 | char buf[1024]; | |
145 | uptr len = internal_snprintf(buf, sizeof(buf), "%.*s", 3, "12345"); | |
146 | EXPECT_EQ(3U, len); | |
147 | EXPECT_STREQ("123", buf); | |
148 | len = internal_snprintf(buf, sizeof(buf), "%.*s", 6, "12345"); | |
149 | EXPECT_EQ(5U, len); | |
150 | EXPECT_STREQ("12345", buf); | |
151 | } | |
152 | ||
153 | } // namespace __sanitizer |