sanitizer_printf_test.cc revision a517641e8f4365fbc5e3cddf614ebc27efd69c35
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
20namespace __sanitizer {
21
22TEST(Printf, Basic) {
23  char buf[1024];
24  uptr len = internal_snprintf(buf, sizeof(buf),
25      "a%db%zdc%ue%zuf%xh%zxq%pe%sr",
26      (int)-1, (long)-2, // NOLINT
27      (unsigned)-4, (unsigned long)5, // NOLINT
28      (unsigned)10, (unsigned long)11, // NOLINT
29      (void*)0x123, "_string_");
30  EXPECT_EQ(len, strlen(buf));
31  EXPECT_STREQ("a-1b-2c4294967292e5fahbq"
32               "0x000000000123e_string_r", buf);
33}
34
35TEST(Printf, OverflowStr) {
36  char buf[] = "123456789";
37  uptr len = internal_snprintf(buf, 4, "%s", "abcdef");  // NOLINT
38  EXPECT_EQ(len, (uptr)6);
39  EXPECT_STREQ("abc", buf);
40  EXPECT_EQ(buf[3], 0);
41  EXPECT_EQ(buf[4], '5');
42  EXPECT_EQ(buf[5], '6');
43  EXPECT_EQ(buf[6], '7');
44  EXPECT_EQ(buf[7], '8');
45  EXPECT_EQ(buf[8], '9');
46  EXPECT_EQ(buf[9], 0);
47}
48
49TEST(Printf, OverflowInt) {
50  char buf[] = "123456789";
51  internal_snprintf(buf, 4, "%d", -123456789);  // NOLINT
52  EXPECT_STREQ("-12", buf);
53  EXPECT_EQ(buf[3], 0);
54  EXPECT_EQ(buf[4], '5');
55  EXPECT_EQ(buf[5], '6');
56  EXPECT_EQ(buf[6], '7');
57  EXPECT_EQ(buf[7], '8');
58  EXPECT_EQ(buf[8], '9');
59  EXPECT_EQ(buf[9], 0);
60}
61
62TEST(Printf, OverflowUint) {
63  char buf[] = "123456789";
64  internal_snprintf(buf, 4, "a%zx", (unsigned long)0x123456789);  // NOLINT
65  EXPECT_STREQ("a12", buf);
66  EXPECT_EQ(buf[3], 0);
67  EXPECT_EQ(buf[4], '5');
68  EXPECT_EQ(buf[5], '6');
69  EXPECT_EQ(buf[6], '7');
70  EXPECT_EQ(buf[7], '8');
71  EXPECT_EQ(buf[8], '9');
72  EXPECT_EQ(buf[9], 0);
73}
74
75TEST(Printf, OverflowPtr) {
76  char buf[] = "123456789";
77  internal_snprintf(buf, 4, "%p", (void*)0x123456789);  // NOLINT
78  EXPECT_STREQ("0x0", buf);
79  EXPECT_EQ(buf[3], 0);
80  EXPECT_EQ(buf[4], '5');
81  EXPECT_EQ(buf[5], '6');
82  EXPECT_EQ(buf[6], '7');
83  EXPECT_EQ(buf[7], '8');
84  EXPECT_EQ(buf[8], '9');
85  EXPECT_EQ(buf[9], 0);
86}
87
88template<typename T>
89static void TestMinMax(const char *fmt, T min, T max) {
90  char buf[1024];
91  uptr len = internal_snprintf(buf, sizeof(buf), fmt, min, max);
92  char buf2[1024];
93  snprintf(buf2, sizeof(buf2), fmt, min, max);
94  EXPECT_EQ(len, strlen(buf));
95  EXPECT_STREQ(buf2, buf);
96}
97
98TEST(Printf, MinMax) {
99  TestMinMax<int>("%d-%d", INT_MIN, INT_MAX);  // NOLINT
100  TestMinMax<long>("%zd-%zd", LONG_MIN, LONG_MAX);  // NOLINT
101  TestMinMax<unsigned>("%u-%u", 0, UINT_MAX);  // NOLINT
102  TestMinMax<unsigned long>("%zu-%zu", 0, ULONG_MAX);  // NOLINT
103  TestMinMax<unsigned>("%x-%x", 0, UINT_MAX);  // NOLINT
104  TestMinMax<unsigned long>("%zx-%zx", 0, ULONG_MAX);  // NOLINT
105}
106
107}  // namespace __sanitizer
108