]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/sanitizer_common/tests/sanitizer_suppressions_test.cc
Merge the following revisions from ^/projects/release-vmimage:
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / sanitizer_common / tests / sanitizer_suppressions_test.cc
1 //===-- sanitizer_suppressions_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 // This file is a part of ThreadSanitizer/AddressSanitizer runtime.
11 //
12 //===----------------------------------------------------------------------===//
13 #include "sanitizer_common/sanitizer_suppressions.h"
14 #include "gtest/gtest.h"
15
16 #include <string.h>
17
18 namespace __sanitizer {
19
20 static bool MyMatch(const char *templ, const char *func) {
21   char tmp[1024];
22   strcpy(tmp, templ);  // NOLINT
23   return TemplateMatch(tmp, func);
24 }
25
26 TEST(Suppressions, Match) {
27   EXPECT_TRUE(MyMatch("foobar$", "foobar"));
28
29   EXPECT_TRUE(MyMatch("foobar", "foobar"));
30   EXPECT_TRUE(MyMatch("*foobar*", "foobar"));
31   EXPECT_TRUE(MyMatch("foobar", "prefix_foobar_postfix"));
32   EXPECT_TRUE(MyMatch("*foobar*", "prefix_foobar_postfix"));
33   EXPECT_TRUE(MyMatch("foo*bar", "foo_middle_bar"));
34   EXPECT_TRUE(MyMatch("foo*bar", "foobar"));
35   EXPECT_TRUE(MyMatch("foo*bar*baz", "foo_middle_bar_another_baz"));
36   EXPECT_TRUE(MyMatch("foo*bar*baz", "foo_middle_barbaz"));
37   EXPECT_TRUE(MyMatch("^foobar", "foobar"));
38   EXPECT_TRUE(MyMatch("^foobar", "foobar_postfix"));
39   EXPECT_TRUE(MyMatch("^*foobar", "foobar"));
40   EXPECT_TRUE(MyMatch("^*foobar", "prefix_foobar"));
41   EXPECT_TRUE(MyMatch("foobar$", "foobar"));
42   EXPECT_TRUE(MyMatch("foobar$", "prefix_foobar"));
43   EXPECT_TRUE(MyMatch("*foobar*$", "foobar"));
44   EXPECT_TRUE(MyMatch("*foobar*$", "foobar_postfix"));
45   EXPECT_TRUE(MyMatch("^foobar$", "foobar"));
46
47   EXPECT_FALSE(MyMatch("foo", "baz"));
48   EXPECT_FALSE(MyMatch("foobarbaz", "foobar"));
49   EXPECT_FALSE(MyMatch("foobarbaz", "barbaz"));
50   EXPECT_FALSE(MyMatch("foo*bar", "foobaz"));
51   EXPECT_FALSE(MyMatch("foo*bar", "foo_baz"));
52   EXPECT_FALSE(MyMatch("^foobar", "prefix_foobar"));
53   EXPECT_FALSE(MyMatch("foobar$", "foobar_postfix"));
54   EXPECT_FALSE(MyMatch("^foobar$", "prefix_foobar"));
55   EXPECT_FALSE(MyMatch("^foobar$", "foobar_postfix"));
56   EXPECT_FALSE(MyMatch("foo^bar", "foobar"));
57   EXPECT_FALSE(MyMatch("foo$bar", "foobar"));
58   EXPECT_FALSE(MyMatch("foo$^bar", "foobar"));
59 }
60
61 TEST(Suppressions, TypeStrings) {
62   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionNone), "none"));
63   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionRace), "race"));
64   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionMutex), "mutex"));
65   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionThread), "thread"));
66   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionSignal), "signal"));
67   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionLeak), "leak"));
68   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionLib),
69                          "called_from_lib"));
70   CHECK(
71       !internal_strcmp(SuppressionTypeString(SuppressionDeadlock), "deadlock"));
72   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionVptrCheck),
73                          "vptr_check"));
74   CHECK(!internal_strcmp(SuppressionTypeString(SuppressionInterceptorName),
75                          "interceptor_name"));
76   CHECK(
77       !internal_strcmp(SuppressionTypeString(SuppressionInterceptorViaFunction),
78                        "interceptor_via_fun"));
79   CHECK(
80       !internal_strcmp(SuppressionTypeString(SuppressionInterceptorViaLibrary),
81                        "interceptor_via_lib"));
82   // Ensure this test is up-to-date when suppression types are added.
83   CHECK_EQ(12, SuppressionTypeCount);
84 }
85
86 class SuppressionContextTest : public ::testing::Test {
87  public:
88   virtual void SetUp() { ctx_ = new(placeholder_) SuppressionContext; }
89   virtual void TearDown() { ctx_->~SuppressionContext(); }
90
91  protected:
92   InternalMmapVector<Suppression> *Suppressions() {
93     return &ctx_->suppressions_;
94   }
95   SuppressionContext *ctx_;
96   ALIGNED(64) char placeholder_[sizeof(SuppressionContext)];
97 };
98
99 TEST_F(SuppressionContextTest, Parse) {
100   ctx_->Parse(
101     "race:foo\n"
102     "   race:bar\n"  // NOLINT
103     "race:baz    \n"  // NOLINT
104     "# a comment\n"
105     "race:quz\n"
106   );  // NOLINT
107   EXPECT_EQ((unsigned)4, ctx_->SuppressionCount());
108   EXPECT_EQ((*Suppressions())[3].type, SuppressionRace);
109   EXPECT_EQ(0, strcmp((*Suppressions())[3].templ, "quz"));
110   EXPECT_EQ((*Suppressions())[2].type, SuppressionRace);
111   EXPECT_EQ(0, strcmp((*Suppressions())[2].templ, "baz"));
112   EXPECT_EQ((*Suppressions())[1].type, SuppressionRace);
113   EXPECT_EQ(0, strcmp((*Suppressions())[1].templ, "bar"));
114   EXPECT_EQ((*Suppressions())[0].type, SuppressionRace);
115   EXPECT_EQ(0, strcmp((*Suppressions())[0].templ, "foo"));
116 }
117
118 TEST_F(SuppressionContextTest, Parse2) {
119   ctx_->Parse(
120     "   # first line comment\n"  // NOLINT
121     "   race:bar        \n"  // NOLINT
122     "race:baz* *baz\n"
123     "# a comment\n"
124     "# last line comment\n"
125   );  // NOLINT
126   EXPECT_EQ((unsigned)2, ctx_->SuppressionCount());
127   EXPECT_EQ((*Suppressions())[1].type, SuppressionRace);
128   EXPECT_EQ(0, strcmp((*Suppressions())[1].templ, "baz* *baz"));
129   EXPECT_EQ((*Suppressions())[0].type, SuppressionRace);
130   EXPECT_EQ(0, strcmp((*Suppressions())[0].templ, "bar"));
131 }
132
133 TEST_F(SuppressionContextTest, Parse3) {
134   ctx_->Parse(
135     "# last suppression w/o line-feed\n"
136     "race:foo\n"
137     "race:bar"
138   );  // NOLINT
139   EXPECT_EQ((unsigned)2, ctx_->SuppressionCount());
140   EXPECT_EQ((*Suppressions())[1].type, SuppressionRace);
141   EXPECT_EQ(0, strcmp((*Suppressions())[1].templ, "bar"));
142   EXPECT_EQ((*Suppressions())[0].type, SuppressionRace);
143   EXPECT_EQ(0, strcmp((*Suppressions())[0].templ, "foo"));
144 }
145
146 TEST_F(SuppressionContextTest, ParseType) {
147   ctx_->Parse(
148     "race:foo\n"
149     "thread:bar\n"
150     "mutex:baz\n"
151     "signal:quz\n"
152   );  // NOLINT
153   EXPECT_EQ((unsigned)4, ctx_->SuppressionCount());
154   EXPECT_EQ((*Suppressions())[3].type, SuppressionSignal);
155   EXPECT_EQ(0, strcmp((*Suppressions())[3].templ, "quz"));
156   EXPECT_EQ((*Suppressions())[2].type, SuppressionMutex);
157   EXPECT_EQ(0, strcmp((*Suppressions())[2].templ, "baz"));
158   EXPECT_EQ((*Suppressions())[1].type, SuppressionThread);
159   EXPECT_EQ(0, strcmp((*Suppressions())[1].templ, "bar"));
160   EXPECT_EQ((*Suppressions())[0].type, SuppressionRace);
161   EXPECT_EQ(0, strcmp((*Suppressions())[0].templ, "foo"));
162 }
163
164 TEST_F(SuppressionContextTest, HasSuppressionType) {
165   ctx_->Parse(
166     "race:foo\n"
167     "thread:bar\n");
168   EXPECT_TRUE(ctx_->HasSuppressionType(SuppressionRace));
169   EXPECT_TRUE(ctx_->HasSuppressionType(SuppressionThread));
170   EXPECT_FALSE(ctx_->HasSuppressionType(SuppressionMutex));
171   EXPECT_FALSE(ctx_->HasSuppressionType(SuppressionSignal));
172 }
173
174 }  // namespace __sanitizer