annotate clang-tools-extra/clangd/unittests/SerializationTests.cpp @ 221:79ff65ed7e25

LLVM12 Original
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 15 Jun 2021 19:15:29 +0900
parents 0572611fdcc8
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- SerializationTests.cpp - Binary and YAML serialization unit tests -===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "Headers.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
10 #include "RIFF.h"
150
anatofuz
parents:
diff changeset
11 #include "index/Index.h"
anatofuz
parents:
diff changeset
12 #include "index/Serialization.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
13 #include "support/Logger.h"
150
anatofuz
parents:
diff changeset
14 #include "clang/Tooling/CompilationDatabase.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
15 #include "llvm/ADT/ScopeExit.h"
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
16 #include "llvm/ADT/StringExtras.h"
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
17 #include "llvm/Support/Compression.h"
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
18 #include "llvm/Support/Error.h"
150
anatofuz
parents:
diff changeset
19 #include "llvm/Support/ScopedPrinter.h"
anatofuz
parents:
diff changeset
20 #include "gmock/gmock.h"
anatofuz
parents:
diff changeset
21 #include "gtest/gtest.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
22 #ifdef LLVM_ON_UNIX
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
23 #include <sys/resource.h>
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
24 #endif
150
anatofuz
parents:
diff changeset
25
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
26 using ::testing::ElementsAre;
150
anatofuz
parents:
diff changeset
27 using ::testing::Pair;
anatofuz
parents:
diff changeset
28 using ::testing::UnorderedElementsAre;
anatofuz
parents:
diff changeset
29 using ::testing::UnorderedElementsAreArray;
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 namespace clang {
anatofuz
parents:
diff changeset
32 namespace clangd {
anatofuz
parents:
diff changeset
33 namespace {
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 const char *YAML = R"(
anatofuz
parents:
diff changeset
36 ---
anatofuz
parents:
diff changeset
37 !Symbol
anatofuz
parents:
diff changeset
38 ID: 057557CEBF6E6B2D
anatofuz
parents:
diff changeset
39 Name: 'Foo1'
anatofuz
parents:
diff changeset
40 Scope: 'clang::'
anatofuz
parents:
diff changeset
41 SymInfo:
anatofuz
parents:
diff changeset
42 Kind: Function
anatofuz
parents:
diff changeset
43 Lang: Cpp
anatofuz
parents:
diff changeset
44 CanonicalDeclaration:
anatofuz
parents:
diff changeset
45 FileURI: file:///path/foo.h
anatofuz
parents:
diff changeset
46 Start:
anatofuz
parents:
diff changeset
47 Line: 1
anatofuz
parents:
diff changeset
48 Column: 0
anatofuz
parents:
diff changeset
49 End:
anatofuz
parents:
diff changeset
50 Line: 1
anatofuz
parents:
diff changeset
51 Column: 1
anatofuz
parents:
diff changeset
52 Origin: 128
anatofuz
parents:
diff changeset
53 Flags: 129
anatofuz
parents:
diff changeset
54 Documentation: 'Foo doc'
anatofuz
parents:
diff changeset
55 ReturnType: 'int'
anatofuz
parents:
diff changeset
56 IncludeHeaders:
anatofuz
parents:
diff changeset
57 - Header: 'include1'
anatofuz
parents:
diff changeset
58 References: 7
anatofuz
parents:
diff changeset
59 - Header: 'include2'
anatofuz
parents:
diff changeset
60 References: 3
anatofuz
parents:
diff changeset
61 ...
anatofuz
parents:
diff changeset
62 ---
anatofuz
parents:
diff changeset
63 !Symbol
anatofuz
parents:
diff changeset
64 ID: 057557CEBF6E6B2E
anatofuz
parents:
diff changeset
65 Name: 'Foo2'
anatofuz
parents:
diff changeset
66 Scope: 'clang::'
anatofuz
parents:
diff changeset
67 SymInfo:
anatofuz
parents:
diff changeset
68 Kind: Function
anatofuz
parents:
diff changeset
69 Lang: Cpp
anatofuz
parents:
diff changeset
70 CanonicalDeclaration:
anatofuz
parents:
diff changeset
71 FileURI: file:///path/bar.h
anatofuz
parents:
diff changeset
72 Start:
anatofuz
parents:
diff changeset
73 Line: 1
anatofuz
parents:
diff changeset
74 Column: 0
anatofuz
parents:
diff changeset
75 End:
anatofuz
parents:
diff changeset
76 Line: 1
anatofuz
parents:
diff changeset
77 Column: 1
anatofuz
parents:
diff changeset
78 Flags: 2
anatofuz
parents:
diff changeset
79 Signature: '-sig'
anatofuz
parents:
diff changeset
80 CompletionSnippetSuffix: '-snippet'
anatofuz
parents:
diff changeset
81 ...
anatofuz
parents:
diff changeset
82 !Refs
anatofuz
parents:
diff changeset
83 ID: 057557CEBF6E6B2D
anatofuz
parents:
diff changeset
84 References:
anatofuz
parents:
diff changeset
85 - Kind: 4
anatofuz
parents:
diff changeset
86 Location:
anatofuz
parents:
diff changeset
87 FileURI: file:///path/foo.cc
anatofuz
parents:
diff changeset
88 Start:
anatofuz
parents:
diff changeset
89 Line: 5
anatofuz
parents:
diff changeset
90 Column: 3
anatofuz
parents:
diff changeset
91 End:
anatofuz
parents:
diff changeset
92 Line: 5
anatofuz
parents:
diff changeset
93 Column: 8
anatofuz
parents:
diff changeset
94 ...
anatofuz
parents:
diff changeset
95 --- !Relations
anatofuz
parents:
diff changeset
96 Subject:
anatofuz
parents:
diff changeset
97 ID: 6481EE7AF2841756
anatofuz
parents:
diff changeset
98 Predicate: 0
anatofuz
parents:
diff changeset
99 Object:
anatofuz
parents:
diff changeset
100 ID: 6512AEC512EA3A2D
anatofuz
parents:
diff changeset
101 ...
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
102 --- !Cmd
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
103 Directory: 'testdir'
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
104 CommandLine:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
105 - 'cmd1'
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
106 - 'cmd2'
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
107 ...
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
108 --- !Source
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
109 URI: 'file:///path/source1.cpp'
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
110 Flags: 1
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
111 Digest: EED8F5EAF25C453C
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
112 DirectIncludes:
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
113 - 'file:///path/inc1.h'
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
114 - 'file:///path/inc2.h'
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
115 ...
150
anatofuz
parents:
diff changeset
116 )";
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 MATCHER_P(ID, I, "") { return arg.ID == cantFail(SymbolID::fromStr(I)); }
anatofuz
parents:
diff changeset
119 MATCHER_P(QName, Name, "") { return (arg.Scope + arg.Name).str() == Name; }
anatofuz
parents:
diff changeset
120 MATCHER_P2(IncludeHeaderWithRef, IncludeHeader, References, "") {
anatofuz
parents:
diff changeset
121 return (arg.IncludeHeader == IncludeHeader) && (arg.References == References);
anatofuz
parents:
diff changeset
122 }
anatofuz
parents:
diff changeset
123
anatofuz
parents:
diff changeset
124 TEST(SerializationTest, NoCrashOnEmptyYAML) {
anatofuz
parents:
diff changeset
125 EXPECT_TRUE(bool(readIndexFile("")));
anatofuz
parents:
diff changeset
126 }
anatofuz
parents:
diff changeset
127
anatofuz
parents:
diff changeset
128 TEST(SerializationTest, YAMLConversions) {
anatofuz
parents:
diff changeset
129 auto ParsedYAML = readIndexFile(YAML);
anatofuz
parents:
diff changeset
130 ASSERT_TRUE(bool(ParsedYAML)) << ParsedYAML.takeError();
anatofuz
parents:
diff changeset
131 ASSERT_TRUE(bool(ParsedYAML->Symbols));
anatofuz
parents:
diff changeset
132 EXPECT_THAT(
anatofuz
parents:
diff changeset
133 *ParsedYAML->Symbols,
anatofuz
parents:
diff changeset
134 UnorderedElementsAre(ID("057557CEBF6E6B2D"), ID("057557CEBF6E6B2E")));
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 auto Sym1 = *ParsedYAML->Symbols->find(
anatofuz
parents:
diff changeset
137 cantFail(SymbolID::fromStr("057557CEBF6E6B2D")));
anatofuz
parents:
diff changeset
138 auto Sym2 = *ParsedYAML->Symbols->find(
anatofuz
parents:
diff changeset
139 cantFail(SymbolID::fromStr("057557CEBF6E6B2E")));
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 EXPECT_THAT(Sym1, QName("clang::Foo1"));
anatofuz
parents:
diff changeset
142 EXPECT_EQ(Sym1.Signature, "");
anatofuz
parents:
diff changeset
143 EXPECT_EQ(Sym1.Documentation, "Foo doc");
anatofuz
parents:
diff changeset
144 EXPECT_EQ(Sym1.ReturnType, "int");
anatofuz
parents:
diff changeset
145 EXPECT_EQ(StringRef(Sym1.CanonicalDeclaration.FileURI), "file:///path/foo.h");
anatofuz
parents:
diff changeset
146 EXPECT_EQ(Sym1.Origin, static_cast<SymbolOrigin>(1 << 7));
anatofuz
parents:
diff changeset
147 EXPECT_EQ(static_cast<uint8_t>(Sym1.Flags), 129);
anatofuz
parents:
diff changeset
148 EXPECT_TRUE(Sym1.Flags & Symbol::IndexedForCodeCompletion);
anatofuz
parents:
diff changeset
149 EXPECT_FALSE(Sym1.Flags & Symbol::Deprecated);
anatofuz
parents:
diff changeset
150 EXPECT_THAT(Sym1.IncludeHeaders,
anatofuz
parents:
diff changeset
151 UnorderedElementsAre(IncludeHeaderWithRef("include1", 7u),
anatofuz
parents:
diff changeset
152 IncludeHeaderWithRef("include2", 3u)));
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 EXPECT_THAT(Sym2, QName("clang::Foo2"));
anatofuz
parents:
diff changeset
155 EXPECT_EQ(Sym2.Signature, "-sig");
anatofuz
parents:
diff changeset
156 EXPECT_EQ(Sym2.ReturnType, "");
anatofuz
parents:
diff changeset
157 EXPECT_EQ(llvm::StringRef(Sym2.CanonicalDeclaration.FileURI),
anatofuz
parents:
diff changeset
158 "file:///path/bar.h");
anatofuz
parents:
diff changeset
159 EXPECT_FALSE(Sym2.Flags & Symbol::IndexedForCodeCompletion);
anatofuz
parents:
diff changeset
160 EXPECT_TRUE(Sym2.Flags & Symbol::Deprecated);
anatofuz
parents:
diff changeset
161
anatofuz
parents:
diff changeset
162 ASSERT_TRUE(bool(ParsedYAML->Refs));
anatofuz
parents:
diff changeset
163 EXPECT_THAT(
anatofuz
parents:
diff changeset
164 *ParsedYAML->Refs,
anatofuz
parents:
diff changeset
165 UnorderedElementsAre(Pair(cantFail(SymbolID::fromStr("057557CEBF6E6B2D")),
anatofuz
parents:
diff changeset
166 ::testing::SizeIs(1))));
anatofuz
parents:
diff changeset
167 auto Ref1 = ParsedYAML->Refs->begin()->second.front();
anatofuz
parents:
diff changeset
168 EXPECT_EQ(Ref1.Kind, RefKind::Reference);
anatofuz
parents:
diff changeset
169 EXPECT_EQ(StringRef(Ref1.Location.FileURI), "file:///path/foo.cc");
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 SymbolID Base = cantFail(SymbolID::fromStr("6481EE7AF2841756"));
anatofuz
parents:
diff changeset
172 SymbolID Derived = cantFail(SymbolID::fromStr("6512AEC512EA3A2D"));
anatofuz
parents:
diff changeset
173 ASSERT_TRUE(bool(ParsedYAML->Relations));
anatofuz
parents:
diff changeset
174 EXPECT_THAT(
anatofuz
parents:
diff changeset
175 *ParsedYAML->Relations,
anatofuz
parents:
diff changeset
176 UnorderedElementsAre(Relation{Base, RelationKind::BaseOf, Derived}));
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
177
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
178 ASSERT_TRUE(bool(ParsedYAML->Cmd));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
179 auto &Cmd = *ParsedYAML->Cmd;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
180 ASSERT_EQ(Cmd.Directory, "testdir");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
181 EXPECT_THAT(Cmd.CommandLine, ElementsAre("cmd1", "cmd2"));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
182
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
183 ASSERT_TRUE(bool(ParsedYAML->Sources));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
184 const auto *URI = "file:///path/source1.cpp";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
185 ASSERT_TRUE(ParsedYAML->Sources->count(URI));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
186 auto IGNDeserialized = ParsedYAML->Sources->lookup(URI);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
187 EXPECT_EQ(llvm::toHex(IGNDeserialized.Digest), "EED8F5EAF25C453C");
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
188 EXPECT_THAT(IGNDeserialized.DirectIncludes,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
189 ElementsAre("file:///path/inc1.h", "file:///path/inc2.h"));
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
190 EXPECT_EQ(IGNDeserialized.URI, URI);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
191 EXPECT_EQ(IGNDeserialized.Flags, IncludeGraphNode::SourceFlag(1));
150
anatofuz
parents:
diff changeset
192 }
anatofuz
parents:
diff changeset
193
anatofuz
parents:
diff changeset
194 std::vector<std::string> YAMLFromSymbols(const SymbolSlab &Slab) {
anatofuz
parents:
diff changeset
195 std::vector<std::string> Result;
anatofuz
parents:
diff changeset
196 for (const auto &Sym : Slab)
anatofuz
parents:
diff changeset
197 Result.push_back(toYAML(Sym));
anatofuz
parents:
diff changeset
198 return Result;
anatofuz
parents:
diff changeset
199 }
anatofuz
parents:
diff changeset
200 std::vector<std::string> YAMLFromRefs(const RefSlab &Slab) {
anatofuz
parents:
diff changeset
201 std::vector<std::string> Result;
anatofuz
parents:
diff changeset
202 for (const auto &Refs : Slab)
anatofuz
parents:
diff changeset
203 Result.push_back(toYAML(Refs));
anatofuz
parents:
diff changeset
204 return Result;
anatofuz
parents:
diff changeset
205 }
anatofuz
parents:
diff changeset
206
anatofuz
parents:
diff changeset
207 std::vector<std::string> YAMLFromRelations(const RelationSlab &Slab) {
anatofuz
parents:
diff changeset
208 std::vector<std::string> Result;
anatofuz
parents:
diff changeset
209 for (const auto &Rel : Slab)
anatofuz
parents:
diff changeset
210 Result.push_back(toYAML(Rel));
anatofuz
parents:
diff changeset
211 return Result;
anatofuz
parents:
diff changeset
212 }
anatofuz
parents:
diff changeset
213
anatofuz
parents:
diff changeset
214 TEST(SerializationTest, BinaryConversions) {
anatofuz
parents:
diff changeset
215 auto In = readIndexFile(YAML);
anatofuz
parents:
diff changeset
216 EXPECT_TRUE(bool(In)) << In.takeError();
anatofuz
parents:
diff changeset
217
anatofuz
parents:
diff changeset
218 // Write to binary format, and parse again.
anatofuz
parents:
diff changeset
219 IndexFileOut Out(*In);
anatofuz
parents:
diff changeset
220 Out.Format = IndexFileFormat::RIFF;
anatofuz
parents:
diff changeset
221 std::string Serialized = llvm::to_string(Out);
anatofuz
parents:
diff changeset
222
anatofuz
parents:
diff changeset
223 auto In2 = readIndexFile(Serialized);
anatofuz
parents:
diff changeset
224 ASSERT_TRUE(bool(In2)) << In.takeError();
anatofuz
parents:
diff changeset
225 ASSERT_TRUE(In2->Symbols);
anatofuz
parents:
diff changeset
226 ASSERT_TRUE(In2->Refs);
anatofuz
parents:
diff changeset
227 ASSERT_TRUE(In2->Relations);
anatofuz
parents:
diff changeset
228
anatofuz
parents:
diff changeset
229 // Assert the YAML serializations match, for nice comparisons and diffs.
anatofuz
parents:
diff changeset
230 EXPECT_THAT(YAMLFromSymbols(*In2->Symbols),
anatofuz
parents:
diff changeset
231 UnorderedElementsAreArray(YAMLFromSymbols(*In->Symbols)));
anatofuz
parents:
diff changeset
232 EXPECT_THAT(YAMLFromRefs(*In2->Refs),
anatofuz
parents:
diff changeset
233 UnorderedElementsAreArray(YAMLFromRefs(*In->Refs)));
anatofuz
parents:
diff changeset
234 EXPECT_THAT(YAMLFromRelations(*In2->Relations),
anatofuz
parents:
diff changeset
235 UnorderedElementsAreArray(YAMLFromRelations(*In->Relations)));
anatofuz
parents:
diff changeset
236 }
anatofuz
parents:
diff changeset
237
anatofuz
parents:
diff changeset
238 TEST(SerializationTest, SrcsTest) {
anatofuz
parents:
diff changeset
239 auto In = readIndexFile(YAML);
anatofuz
parents:
diff changeset
240 EXPECT_TRUE(bool(In)) << In.takeError();
anatofuz
parents:
diff changeset
241
anatofuz
parents:
diff changeset
242 std::string TestContent("TestContent");
anatofuz
parents:
diff changeset
243 IncludeGraphNode IGN;
anatofuz
parents:
diff changeset
244 IGN.Digest = digest(TestContent);
anatofuz
parents:
diff changeset
245 IGN.DirectIncludes = {"inc1", "inc2"};
anatofuz
parents:
diff changeset
246 IGN.URI = "URI";
anatofuz
parents:
diff changeset
247 IGN.Flags |= IncludeGraphNode::SourceFlag::IsTU;
anatofuz
parents:
diff changeset
248 IGN.Flags |= IncludeGraphNode::SourceFlag::HadErrors;
anatofuz
parents:
diff changeset
249 IncludeGraph Sources;
anatofuz
parents:
diff changeset
250 Sources[IGN.URI] = IGN;
anatofuz
parents:
diff changeset
251 // Write to binary format, and parse again.
anatofuz
parents:
diff changeset
252 IndexFileOut Out(*In);
anatofuz
parents:
diff changeset
253 Out.Format = IndexFileFormat::RIFF;
anatofuz
parents:
diff changeset
254 Out.Sources = &Sources;
anatofuz
parents:
diff changeset
255 {
anatofuz
parents:
diff changeset
256 std::string Serialized = llvm::to_string(Out);
anatofuz
parents:
diff changeset
257
anatofuz
parents:
diff changeset
258 auto In = readIndexFile(Serialized);
anatofuz
parents:
diff changeset
259 ASSERT_TRUE(bool(In)) << In.takeError();
anatofuz
parents:
diff changeset
260 ASSERT_TRUE(In->Symbols);
anatofuz
parents:
diff changeset
261 ASSERT_TRUE(In->Refs);
anatofuz
parents:
diff changeset
262 ASSERT_TRUE(In->Sources);
anatofuz
parents:
diff changeset
263 ASSERT_TRUE(In->Sources->count(IGN.URI));
anatofuz
parents:
diff changeset
264 // Assert the YAML serializations match, for nice comparisons and diffs.
anatofuz
parents:
diff changeset
265 EXPECT_THAT(YAMLFromSymbols(*In->Symbols),
anatofuz
parents:
diff changeset
266 UnorderedElementsAreArray(YAMLFromSymbols(*In->Symbols)));
anatofuz
parents:
diff changeset
267 EXPECT_THAT(YAMLFromRefs(*In->Refs),
anatofuz
parents:
diff changeset
268 UnorderedElementsAreArray(YAMLFromRefs(*In->Refs)));
anatofuz
parents:
diff changeset
269 auto IGNDeserialized = In->Sources->lookup(IGN.URI);
anatofuz
parents:
diff changeset
270 EXPECT_EQ(IGNDeserialized.Digest, IGN.Digest);
anatofuz
parents:
diff changeset
271 EXPECT_EQ(IGNDeserialized.DirectIncludes, IGN.DirectIncludes);
anatofuz
parents:
diff changeset
272 EXPECT_EQ(IGNDeserialized.URI, IGN.URI);
anatofuz
parents:
diff changeset
273 EXPECT_EQ(IGNDeserialized.Flags, IGN.Flags);
anatofuz
parents:
diff changeset
274 }
anatofuz
parents:
diff changeset
275 }
anatofuz
parents:
diff changeset
276
anatofuz
parents:
diff changeset
277 TEST(SerializationTest, CmdlTest) {
anatofuz
parents:
diff changeset
278 auto In = readIndexFile(YAML);
anatofuz
parents:
diff changeset
279 EXPECT_TRUE(bool(In)) << In.takeError();
anatofuz
parents:
diff changeset
280
anatofuz
parents:
diff changeset
281 tooling::CompileCommand Cmd;
anatofuz
parents:
diff changeset
282 Cmd.Directory = "testdir";
anatofuz
parents:
diff changeset
283 Cmd.CommandLine.push_back("cmd1");
anatofuz
parents:
diff changeset
284 Cmd.CommandLine.push_back("cmd2");
anatofuz
parents:
diff changeset
285 Cmd.Filename = "ignored";
anatofuz
parents:
diff changeset
286 Cmd.Heuristic = "ignored";
anatofuz
parents:
diff changeset
287 Cmd.Output = "ignored";
anatofuz
parents:
diff changeset
288
anatofuz
parents:
diff changeset
289 IndexFileOut Out(*In);
anatofuz
parents:
diff changeset
290 Out.Format = IndexFileFormat::RIFF;
anatofuz
parents:
diff changeset
291 Out.Cmd = &Cmd;
anatofuz
parents:
diff changeset
292 {
anatofuz
parents:
diff changeset
293 std::string Serialized = llvm::to_string(Out);
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 auto In = readIndexFile(Serialized);
anatofuz
parents:
diff changeset
296 ASSERT_TRUE(bool(In)) << In.takeError();
anatofuz
parents:
diff changeset
297 ASSERT_TRUE(In->Cmd);
anatofuz
parents:
diff changeset
298
anatofuz
parents:
diff changeset
299 const tooling::CompileCommand &SerializedCmd = In->Cmd.getValue();
anatofuz
parents:
diff changeset
300 EXPECT_EQ(SerializedCmd.CommandLine, Cmd.CommandLine);
anatofuz
parents:
diff changeset
301 EXPECT_EQ(SerializedCmd.Directory, Cmd.Directory);
anatofuz
parents:
diff changeset
302 EXPECT_NE(SerializedCmd.Filename, Cmd.Filename);
anatofuz
parents:
diff changeset
303 EXPECT_NE(SerializedCmd.Heuristic, Cmd.Heuristic);
anatofuz
parents:
diff changeset
304 EXPECT_NE(SerializedCmd.Output, Cmd.Output);
anatofuz
parents:
diff changeset
305 }
anatofuz
parents:
diff changeset
306 }
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
307
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
308 // rlimit is part of POSIX.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
309 // ASan uses a lot of address space, so we can't apply strict limits.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
310 #if LLVM_ON_UNIX && !LLVM_ADDRESS_SANITIZER_BUILD
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
311 class ScopedMemoryLimit {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
312 struct rlimit OriginalLimit;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
313 bool Succeeded = false;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
314
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
315 public:
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
316 ScopedMemoryLimit(rlim_t Bytes) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
317 if (!getrlimit(RLIMIT_AS, &OriginalLimit)) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
318 struct rlimit NewLimit = OriginalLimit;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
319 NewLimit.rlim_cur = Bytes;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
320 Succeeded = !setrlimit(RLIMIT_AS, &NewLimit);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
321 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
322 if (!Succeeded)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
323 log("Failed to set rlimit");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
324 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
325
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
326 ~ScopedMemoryLimit() {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
327 if (Succeeded)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
328 setrlimit(RLIMIT_AS, &OriginalLimit);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
329 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
330 };
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
331 #else
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
332 class ScopedMemoryLimit {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
333 public:
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
334 ScopedMemoryLimit(unsigned Bytes) { log("rlimit unsupported"); }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
335 };
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
336 #endif
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
337
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
338 // Test that our deserialization detects invalid array sizes without allocating.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
339 // If this detection fails, the test should allocate a huge array and crash.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
340 TEST(SerializationTest, NoCrashOnBadArraySize) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
341 // This test is tricky because we need to construct a subtly invalid file.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
342 // First, create a valid serialized file.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
343 auto In = readIndexFile(YAML);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
344 ASSERT_FALSE(!In) << In.takeError();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
345 IndexFileOut Out(*In);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
346 Out.Format = IndexFileFormat::RIFF;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
347 std::string Serialized = llvm::to_string(Out);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
348
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
349 // Low-level parse it again and find the `srcs` chunk we're going to corrupt.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
350 auto Parsed = riff::readFile(Serialized);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
351 ASSERT_FALSE(!Parsed) << Parsed.takeError();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
352 auto Srcs = llvm::find_if(Parsed->Chunks, [](riff::Chunk C) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
353 return C.ID == riff::fourCC("srcs");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
354 });
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
355 ASSERT_NE(Srcs, Parsed->Chunks.end());
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
356
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
357 // Srcs consists of a sequence of IncludeGraphNodes. In our case, just one.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
358 // The node has:
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
359 // - 1 byte: flags (1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
360 // - varint(stringID): URI
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
361 // - 8 byte: file digest
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
362 // - varint: DirectIncludes.length
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
363 // - repeated varint(stringID): DirectIncludes
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
364 // We want to set DirectIncludes.length to a huge number.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
365 // The offset isn't trivial to find, so we use the file digest.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
366 std::string FileDigest = llvm::fromHex("EED8F5EAF25C453C");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
367 unsigned Pos = Srcs->Data.find_first_of(FileDigest);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
368 ASSERT_NE(Pos, StringRef::npos) << "Couldn't locate file digest";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
369 Pos += FileDigest.size();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
370
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
371 // Varints are little-endian base-128 numbers, where the top-bit of each byte
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
372 // indicates whether there are more. ffffffff0f -> 0xffffffff.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
373 std::string CorruptSrcs =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
374 (Srcs->Data.take_front(Pos) + llvm::fromHex("ffffffff0f") +
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
375 "some_random_garbage")
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
376 .str();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
377 Srcs->Data = CorruptSrcs;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
378
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
379 // Try to crash rather than hang on large allocation.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
380 ScopedMemoryLimit MemLimit(1000 * 1024 * 1024); // 1GB
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
381
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
382 std::string CorruptFile = llvm::to_string(*Parsed);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
383 auto CorruptParsed = readIndexFile(CorruptFile);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
384 ASSERT_TRUE(!CorruptParsed);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
385 EXPECT_EQ(llvm::toString(CorruptParsed.takeError()),
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
386 "malformed or truncated include uri");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
387 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
388
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
389 // Check we detect invalid string table size size without allocating it first.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
390 // If this detection fails, the test should allocate a huge array and crash.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
391 TEST(SerializationTest, NoCrashOnBadStringTableSize) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
392 if (!llvm::zlib::isAvailable()) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
393 log("skipping test, no zlib");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
394 return;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
395 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
396
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
397 // First, create a valid serialized file.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
398 auto In = readIndexFile(YAML);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
399 ASSERT_FALSE(!In) << In.takeError();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
400 IndexFileOut Out(*In);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
401 Out.Format = IndexFileFormat::RIFF;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
402 std::string Serialized = llvm::to_string(Out);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
403
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
404 // Low-level parse it again, we're going to replace the `stri` chunk.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
405 auto Parsed = riff::readFile(Serialized);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
406 ASSERT_FALSE(!Parsed) << Parsed.takeError();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
407 auto Stri = llvm::find_if(Parsed->Chunks, [](riff::Chunk C) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
408 return C.ID == riff::fourCC("stri");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
409 });
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
410 ASSERT_NE(Stri, Parsed->Chunks.end());
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
411
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
412 // stri consists of an 8 byte uncompressed-size, and then compressed data.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
413 // We'll claim our small amount of data expands to 4GB
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
414 std::string CorruptStri =
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
415 (llvm::fromHex("ffffffff") + Stri->Data.drop_front(4)).str();
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
416 Stri->Data = CorruptStri;
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
417 std::string FileDigest = llvm::fromHex("EED8F5EAF25C453C");
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
418
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
419 // Try to crash rather than hang on large allocation.
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
420 ScopedMemoryLimit MemLimit(1000 * 1024 * 1024); // 1GB
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
421
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
422 std::string CorruptFile = llvm::to_string(*Parsed);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
423 auto CorruptParsed = readIndexFile(CorruptFile);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
424 ASSERT_TRUE(!CorruptParsed);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
425 EXPECT_THAT(llvm::toString(CorruptParsed.takeError()),
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
426 testing::HasSubstr("bytes is implausible"));
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
427 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
428
150
anatofuz
parents:
diff changeset
429 } // namespace
anatofuz
parents:
diff changeset
430 } // namespace clangd
anatofuz
parents:
diff changeset
431 } // namespace clang