418 lines · cpp
1// DEFINE: %{analyzer} = %clang_analyze_cc1 -Wno-array-bounds %s \2// DEFINE: -analyzer-checker=core,cplusplus,unix,debug.ExprInspection3 4// RUN: %{analyzer} -verify=default5// RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=10 -verify=limit106// RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=0 -verify=unlimited7 8template <class T> void clang_analyzer_dump(T);9void clang_analyzer_eval(bool);10 11template <class... Ts> void escape(Ts...);12bool coin();13 14class Loc {15 int x;16};17class P1 {18public:19 Loc l;20 void setLoc(Loc L) {21 l = L;22 }23 24};25class P2 {26public:27 int m;28 int accessBase() {29 return m;30 }31};32class Derived: public P1, public P2 {33};34int radar13445834(Derived *Builder, Loc l) {35 Builder->setLoc(l);36 return Builder->accessBase();37 38}39 40void boundedNumberOfBindings() {41 int array[] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};42 clang_analyzer_dump(array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}43 clang_analyzer_dump(array[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}}44 clang_analyzer_dump(array[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}}45 clang_analyzer_dump(array[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}}46 clang_analyzer_dump(array[4]); // default-warning {{4 S32b}} unlimited-warning {{4 S32b}} limit10-warning {{4 S32b}}47 clang_analyzer_dump(array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}48 clang_analyzer_dump(array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}49 clang_analyzer_dump(array[7]); // default-warning {{7 S32b}} unlimited-warning {{7 S32b}} limit10-warning {{7 S32b}}50 clang_analyzer_dump(array[8]); // default-warning {{8 S32b}} unlimited-warning {{8 S32b}} limit10-warning {{8 S32b}}51 clang_analyzer_dump(array[9]); // default-warning {{9 S32b}} unlimited-warning {{9 S32b}} limit10-warning {{9 S32b}}52 clang_analyzer_dump(array[10]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{Unknown}}53 clang_analyzer_dump(array[11]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{Unknown}}54 clang_analyzer_dump(array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}55 clang_analyzer_dump(array[13]); // default-warning {{13 S32b}} unlimited-warning {{13 S32b}} limit10-warning {{Unknown}}56 clang_analyzer_dump(array[14]); // default-warning {{14 S32b}} unlimited-warning {{14 S32b}} limit10-warning {{Unknown}}57 clang_analyzer_dump(array[15]); // default-warning {{15 S32b}} unlimited-warning {{15 S32b}} limit10-warning {{Unknown}}58 clang_analyzer_dump(array[16]); // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{Unknown}}59 clang_analyzer_dump(array[17]); // default-warning {{17 S32b}} unlimited-warning {{17 S32b}} limit10-warning {{Unknown}}60 clang_analyzer_dump(array[18]); // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{Unknown}}61 clang_analyzer_dump(array[19]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}}62 clang_analyzer_dump(array[20]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}}63 clang_analyzer_dump(array[21]); // default-warning {{21 S32b}} unlimited-warning {{21 S32b}} limit10-warning {{Unknown}}64 clang_analyzer_dump(array[22]); // default-warning {{22 S32b}} unlimited-warning {{22 S32b}} limit10-warning {{Unknown}}65 clang_analyzer_dump(array[23]); // see below see below limit10-warning {{Unknown}}66 // default-warning@-1 {{1st function call argument is an uninitialized value}}67 // unlimited-warning@-2 {{1st function call argument is an uninitialized value}}68 // FIXME: The last dump at index 23 should be Undefined due to out of bounds access.69}70 71void incompleteInitList() {72 int array[23] {0,1,2,3,4,5,6,7,8,9,10,11 /*rest are zeroes*/ };73 clang_analyzer_dump(array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}74 clang_analyzer_dump(array[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}}75 clang_analyzer_dump(array[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}}76 clang_analyzer_dump(array[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}}77 clang_analyzer_dump(array[4]); // default-warning {{4 S32b}} unlimited-warning {{4 S32b}} limit10-warning {{4 S32b}}78 clang_analyzer_dump(array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}79 clang_analyzer_dump(array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}80 clang_analyzer_dump(array[7]); // default-warning {{7 S32b}} unlimited-warning {{7 S32b}} limit10-warning {{7 S32b}}81 clang_analyzer_dump(array[8]); // default-warning {{8 S32b}} unlimited-warning {{8 S32b}} limit10-warning {{8 S32b}}82 clang_analyzer_dump(array[9]); // default-warning {{9 S32b}} unlimited-warning {{9 S32b}} limit10-warning {{9 S32b}}83 clang_analyzer_dump(array[10]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{Unknown}}84 clang_analyzer_dump(array[11]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{Unknown}}85 clang_analyzer_dump(array[12]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}86 clang_analyzer_dump(array[13]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}87 clang_analyzer_dump(array[14]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}88 clang_analyzer_dump(array[15]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}89 clang_analyzer_dump(array[16]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}90 clang_analyzer_dump(array[17]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}91 clang_analyzer_dump(array[18]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}92 clang_analyzer_dump(array[19]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}93 clang_analyzer_dump(array[20]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}94 clang_analyzer_dump(array[21]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}95 clang_analyzer_dump(array[22]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}96 clang_analyzer_dump(array[23]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}97 // FIXME: The last dump at index 23 should be Undefined due to out of bounds access.98}99 100struct Inner {101 int first;102 int second;103};104struct Outer {105 Inner upper;106 Inner lower;107};108 109void nestedStructInitLists() {110 Outer array[]{ // 7*4: 28 values111 {{00, 01}, {02, 03}},112 {{10, 11}, {12, 13}},113 {{20, 21}, {22, 23}},114 {{30, 31}, {32, 33}},115 {{40, 41}, {42, 43}},116 {{50, 51}, {52, 53}},117 {{60, 61}, {62, 63}},118 };119 120 int *p = (int*)array;121 clang_analyzer_dump(p[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}122 clang_analyzer_dump(p[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}}123 clang_analyzer_dump(p[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}}124 clang_analyzer_dump(p[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}}125 clang_analyzer_dump(p[4]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}}126 clang_analyzer_dump(p[5]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{11 S32b}}127 clang_analyzer_dump(p[6]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{12 S32b}}128 clang_analyzer_dump(p[7]); // default-warning {{13 S32b}} unlimited-warning {{13 S32b}} limit10-warning {{13 S32b}}129 clang_analyzer_dump(p[8]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{20 S32b}}130 clang_analyzer_dump(p[9]); // default-warning {{21 S32b}} unlimited-warning {{21 S32b}} limit10-warning {{21 S32b}}131 clang_analyzer_dump(p[10]); // default-warning {{22 S32b}} unlimited-warning {{22 S32b}} limit10-warning {{Unknown}}132 clang_analyzer_dump(p[11]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}133 clang_analyzer_dump(p[12]); // default-warning {{30 S32b}} unlimited-warning {{30 S32b}} limit10-warning {{Unknown}}134 clang_analyzer_dump(p[13]); // default-warning {{31 S32b}} unlimited-warning {{31 S32b}} limit10-warning {{Unknown}}135 clang_analyzer_dump(p[14]); // default-warning {{32 S32b}} unlimited-warning {{32 S32b}} limit10-warning {{Unknown}}136 clang_analyzer_dump(p[15]); // default-warning {{33 S32b}} unlimited-warning {{33 S32b}} limit10-warning {{Unknown}}137 clang_analyzer_dump(p[16]); // default-warning {{40 S32b}} unlimited-warning {{40 S32b}} limit10-warning {{Unknown}}138 clang_analyzer_dump(p[17]); // default-warning {{41 S32b}} unlimited-warning {{41 S32b}} limit10-warning {{Unknown}}139 clang_analyzer_dump(p[18]); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{Unknown}}140 clang_analyzer_dump(p[19]); // default-warning {{43 S32b}} unlimited-warning {{43 S32b}} limit10-warning {{Unknown}}141 clang_analyzer_dump(p[20]); // default-warning {{50 S32b}} unlimited-warning {{50 S32b}} limit10-warning {{Unknown}}142 clang_analyzer_dump(p[21]); // default-warning {{51 S32b}} unlimited-warning {{51 S32b}} limit10-warning {{Unknown}}143 clang_analyzer_dump(p[22]); // default-warning {{52 S32b}} unlimited-warning {{52 S32b}} limit10-warning {{Unknown}}144 clang_analyzer_dump(p[23]); // default-warning {{53 S32b}} unlimited-warning {{53 S32b}} limit10-warning {{Unknown}}145 clang_analyzer_dump(p[24]); // default-warning {{60 S32b}} unlimited-warning {{60 S32b}} limit10-warning {{Unknown}}146 clang_analyzer_dump(p[25]); // default-warning {{61 S32b}} unlimited-warning {{61 S32b}} limit10-warning {{Unknown}}147 clang_analyzer_dump(p[26]); // default-warning {{62 S32b}} unlimited-warning {{62 S32b}} limit10-warning {{Unknown}}148 clang_analyzer_dump(p[27]); // default-warning {{63 S32b}} unlimited-warning {{63 S32b}} limit10-warning {{Unknown}}149 clang_analyzer_dump(p[28]); // see below see below limit10-warning {{Unknown}}150 // default-warning@-1 {{1st function call argument is an uninitialized value}}151 // unlimited-warning@-2 {{1st function call argument is an uninitialized value}}152 // FIXME: The last dump at index 28 should be Undefined due to out of bounds access.153}154 155void expectNoLeaksInWidenedInitLists() {156 int *p[] {157 new int(0),158 new int(1),159 new int(2),160 new int(3),161 new int(4),162 new int(5),163 new int(6),164 new int(7),165 new int(8),166 new int(9),167 new int(10),168 new int(11),169 new int(12),170 new int(13),171 new int(14),172 new int(15),173 new int(16),174 new int(17),175 new int(18),176 new int(19),177 new int(20),178 new int(21),179 new int(22),180 new int(23),181 new int(24),182 };183 clang_analyzer_dump(*p[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}184 clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}185 escape(p); // no-leaks186}187 188void rawArrayWithSelfReference() {189 // If a pointer to some object escapes, that pointed object should escape too.190 // Consequently, if the 22th initializer would escape, then the p[6] should also escape - clobbering any loads from that location later.191 int *p[25] = {192 new int(0),193 new int(1),194 new int(2),195 new int(3),196 new int(4),197 new int(5),198 new int(6),199 new int(7),200 p[5], // Should be a pointer to the 6th array element, but we get Undefined as the analyzer thinks that "p" is not yet initialized, thus loading from index 5 is UB. This is wrong.201 new int(9),202 new int(10),203 new int(11),204 new int(12),205 new int(13),206 new int(14),207 new int(15),208 new int(16),209 new int(17),210 new int(18),211 new int(19),212 new int(20),213 new int(21),214 p[6], // Should be a pointer to the 6th array element, but we get Undefined as the analyzer thinks that "p" is not yet initialized, thus loading from index 5 is UB. This is wrong.215 new int(23),216 new int(24),217 };218 clang_analyzer_dump(*p[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}219 clang_analyzer_dump(*p[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}220 221 if (coin()) {222 clang_analyzer_dump(*p[8]);223 // default-warning@-1 {{Dereference of undefined pointer value}}224 // unlimited-warning@-2 {{Dereference of undefined pointer value}}225 // limit10-warning@-3 {{Dereference of undefined pointer value}}226 }227 228 clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}229 230 if (coin()) {231 clang_analyzer_dump(*p[22]);232 // default-warning@-1 {{Dereference of undefined pointer value}}233 // unlimited-warning@-2 {{Dereference of undefined pointer value}}234 // limit10-warning@-3 {{Unknown}}235 }236 237 clang_analyzer_dump(*p[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}238 239 escape(p); // no-leaks240}241 242template <class T, unsigned Size> struct BigArray {243 T array[Size];244};245 246void fieldArrayWithSelfReference() {247 // Similar to "rawArrayWithSelfReference", but using an aggregate object and assignment operator to achieve the element-wise binds.248 BigArray<int *, 25> p;249 p = {250 new int(0),251 new int(1),252 new int(2),253 new int(3),254 new int(4),255 new int(5),256 new int(6),257 new int(7),258 p.array[5], // Pointer to the 6th array element.259 new int(9),260 new int(10),261 new int(11),262 new int(12),263 new int(13),264 new int(14),265 new int(15),266 new int(16),267 new int(17),268 new int(18),269 new int(19),270 new int(20),271 new int(21),272 p.array[6], // Pointer to the 7th array element.273 new int(23),274 new int(24),275 };276 clang_analyzer_dump(*p.array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}277 clang_analyzer_dump(*p.array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}278 279 if (coin()) {280 clang_analyzer_dump(*p.array[8]);281 // default-warning@-1 {{Unknown}}282 // unlimited-warning@-2 {{Unknown}}283 // limit10-warning@-3 {{Unknown}}284 }285 286 clang_analyzer_dump(*p.array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}287 288 if (coin()) {289 clang_analyzer_dump(*p.array[22]);290 // default-warning@-1 {{Unknown}}291 // unlimited-warning@-2 {{Unknown}}292 // limit10-warning@-3 {{Unknown}}293 }294 295 clang_analyzer_dump(*p.array[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}296 297 escape(p); // no-leaks298}299 300struct PtrHolderBase {301 int *ptr;302};303struct BigStruct : BigArray<int, 1000>, PtrHolderBase {};304void largeBaseClasses() {305 BigStruct D{{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, {new int(25)}};306 (void)D; // no-leak here, the PtrHolderBase subobject is properly escaped.307 308 clang_analyzer_dump(*D.ptr); // default-warning {{25 S32b}} unlimited-warning {{25 S32b}} limit10-warning {{Unknown}}309 escape(D);310}311 312struct List {313 int* ptr;314 BigArray<int, 30> head;315 List *tail;316};317void tempObjectMayEscapeArgumentsInAssignment() {318 // This will be leaked after the assignment. However, we should not diagnose319 // this because in the RHS of the assignment the temporary couldn't be really320 // materialized due to the number of bindings, thus the address of `l` will321 // escape there.322 List l{new int(404)};323 324 // ExprWithCleanups wraps the assignment operator call, which assigns a MaterializeTemporaryExpr.325 l = List{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};326 (void)l;327 // default-warning@-1 {{Potential memory leak}} We detect the leak with the default settings.328 // unlimited-warning@-2 {{Potential memory leak}} We detect the leak with the default settings.329 // limit10 is missing! It's because in that case we escape `&l`, thus we assume freed. This is good.330 331 clang_analyzer_dump(*l.ptr); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{42 S32b}}332 escape(l);333}334 335void tempObjNotMaterializedThusDoesntEscapeAnything() {336 List l{new int(404)};337 // We have no ExprWithCleanups or MaterializeTemporaryExpr here, so `&l` is never escaped. This is good.338 (void)List{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};339 (void)l;340 // default-warning@-1 {{Potential memory leak}} We detect the leak with the default settings.341 // limit10-warning@-2 {{Potential memory leak}} We detect the leak with the default settings.342 // unlimited-warning@-3 {{Potential memory leak}} We detect the leak with the default settings.343 344 clang_analyzer_dump(*l.ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{404 S32b}}345 escape(l);346}347 348void theValueOfTheEscapedRegionRemainsTheSame() {349 int *p = new int(404);350 List l{p};351 List l2{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};352 353 // The value of l.ptr shouldn't be clobbered after a failing to copy `&l`.354 clang_analyzer_eval(p == l.ptr); // default-warning {{TRUE}} unlimited-warning {{TRUE}} limit10-warning {{TRUE}}355 356 // If the bindings fit, we will know that it aliases with `p`. Otherwise, it's unknown. This is good.357 clang_analyzer_dump(*l2.tail->ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{Unknown}}358 359 escape(l, l2);360}361 362void calleeWithManyParms(BigArray<int, 7> arr7, BigArray<int, 100> arr100) {363 clang_analyzer_dump(arr7.array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}364 clang_analyzer_dump(arr7.array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}365 366 clang_analyzer_dump(arr100.array[0]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}}367 clang_analyzer_dump(arr100.array[6]); // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{16 S32b}}368 369 clang_analyzer_dump(arr100.array[8]); // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{18 S32b}}370 clang_analyzer_dump(arr100.array[9]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{19 S32b}}371 clang_analyzer_dump(arr100.array[10]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}}372 clang_analyzer_dump(arr100.array[99]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}}373}374 375void tooManyFnArgumentsWhenInlining() {376 calleeWithManyParms({0,1,2,3,4,5,6}, {377 10,11,12,13,14,15,16,17,18,19,378 20,21,22,23,24,25,26,27,28,29,379 30,31,32,33,34,35,36,37,38,39,380 40,41,42,43,44,45,46,47,48,49,381 50,51,52,53,54,55,56,57,58,59,382 60,61,62,63,64,65,66,67,68,69,383 70,71,72,73,74,75,76,77,78,79,384 80,81,82,83,84,85,86,87,88,89,385 90,91,92,93,94,95,96,97,98,99,386 10,11,12,13,14,15,16,17,18,19,387 });388}389 390void gh129211_assertion() {391 struct Clazz {392 int b;393 int : 0;394 };395 396 Clazz d[][5][5] = {397 {398 {{}, {}, {}, {}, {}},399 {{}, {}, {}, {}, {}},400 {{}, {}, {}, {}, {}},401 {{}, {}, {}, {}, {}},402 {{}, {}, {}, {}, {}}403 },404 {405 {{}, {}, {}, {}, {}},406 {{}, {}, {}, {}, {}},407 {{}, {}, {}, {}, {}},408 {{}, {}, {}, {}, {}},409 {{}, {}, {}, {}, {}},410 },411 {412 {{}, {}, {}, {}, {}},413 {{}, {}, {}, {}, {}},414 {{}, {}, {}, {}},415 }416 }; // no-crash417}418