Skip to content

Commit 6955e71

Browse files
committed
Collected garbage code tests and moved them to testgarbage.cpp
1 parent 9dd3bce commit 6955e71

File tree

10 files changed

+127
-122
lines changed

10 files changed

+127
-122
lines changed

lib/tokenize.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8398,7 +8398,8 @@ void Tokenizer::eraseDeadCode(Token *begin, const Token *end)
83988398
break;
83998399
}
84008400
tok->deleteNext();
8401-
} else { //no need to keep the other strings, remove them.
8401+
} else {
8402+
// no need to keep the other strings, remove them.
84028403
if (tok->strAt(1) == "while") {
84038404
if (tok->str() == "}" && tok->link()->strAt(-1) == "do")
84048405
tok->link()->previous()->deleteThis();

test/testbufferoverrun.cpp

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,8 @@ class TestBufferOverrun : public TestFixture {
288288
TEST_CASE(recursive_long_time);
289289

290290
TEST_CASE(crash1); // Ticket #1587 - crash
291-
TEST_CASE(crash2); // Ticket #2607 - crash
292-
TEST_CASE(crash3); // Ticket #3034 - crash
293-
TEST_CASE(crash4); // Ticket #5426 - crash
294-
TEST_CASE(crash5); // TIcket #5595 - crash
295-
296-
TEST_CASE(garbage1); // Ticket #5203
291+
TEST_CASE(crash2); // Ticket #3034 - crash
292+
TEST_CASE(crash3); // Ticket #5426 - crash
297293

298294
TEST_CASE(executionPaths1);
299295
TEST_CASE(executionPaths2);
@@ -3749,10 +3745,6 @@ class TestBufferOverrun : public TestFixture {
37493745
}
37503746

37513747
void crash2() {
3752-
check("struct C {} {} x");
3753-
}
3754-
3755-
void crash3() {
37563748
check("void a(char *p) {\n"
37573749
" f( { if(finally_arg); } );\n"
37583750
"}\n"
@@ -3763,19 +3755,11 @@ class TestBufferOverrun : public TestFixture {
37633755
"}");
37643756
}
37653757

3766-
void crash4() {
3758+
void crash3() {
37673759
check("struct b { unknown v[0]; };\n"
37683760
"void d() { struct b *f; f = malloc(108); }");
37693761
}
37703762

3771-
void crash5() {
3772-
check("static f() { int i; int source[1] = { 1 }; for (i = 0; i < 4; i++) (u, if (y u.x e)) }", true, "test.cpp", false); // Garbage code
3773-
}
3774-
3775-
void garbage1() { // Ticket #5203
3776-
check("int f ( int* r ) { { int s[2] ; f ( s ) ; if ( ) } }");
3777-
}
3778-
37793763
void epcheck(const char code[], const char filename[] = "test.cpp") {
37803764
// Clear the error buffer..
37813765
errout.str("");

test/testexceptionsafety.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ class TestExceptionSafety : public TestFixture {
4949
TEST_CASE(nothrowAttributeThrow);
5050
TEST_CASE(nothrowAttributeThrow2); // #5703
5151
TEST_CASE(nothrowDeclspecThrow);
52-
53-
TEST_CASE(garbage);
5452
}
5553

5654
void check(const char code[], bool inconclusive = false) {
@@ -413,10 +411,6 @@ class TestExceptionSafety : public TestFixture {
413411
check("const char *func() __attribute((nothrow)); void func1() { return 0; }\n");
414412
ASSERT_EQUALS("", errout.str());
415413
}
416-
417-
void garbage() {
418-
check("{ } A() { delete }"); // #6080
419-
}
420414
};
421415

422416
REGISTER_TEST(TestExceptionSafety)

test/testgarbage.cpp

Lines changed: 111 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,21 @@ class TestGarbage : public TestFixture {
5353
TEST_CASE(garbageCode10); // #6127
5454
TEST_CASE(garbageCode11);
5555
TEST_CASE(garbageCode12);
56-
57-
TEST_CASE(astGarbage);
56+
TEST_CASE(garbageCode13); // Ticket #2607 - crash
57+
TEST_CASE(garbageCode14); // TIcket #5595 - crash
58+
TEST_CASE(garbageCode15); // Ticket #5203
59+
TEST_CASE(garbageCode16);
60+
TEST_CASE(garbageCode17);
61+
TEST_CASE(garbageCode18);
62+
TEST_CASE(garbageCode19);
63+
TEST_CASE(garbageCode20);
64+
TEST_CASE(garbageCode21);
65+
TEST_CASE(garbageCode22);
66+
TEST_CASE(garbageCode23);
67+
68+
TEST_CASE(garbageValueFlow);
69+
TEST_CASE(garbageSymbolDatabase);
70+
TEST_CASE(garbageAST);
5871
}
5972

6073
std::string checkCode(const char code[], const char filename[] = "test.cpp") {
@@ -258,7 +271,102 @@ class TestGarbage : public TestFixture {
258271
checkCode("{ g; S (void) { struct } { } int &g; }");
259272
}
260273

261-
void astGarbage() {
274+
void garbageCode13() {
275+
checkCode("struct C {} {} x");
276+
}
277+
278+
void garbageCode14() {
279+
checkCode("static f() { int i; int source[1] = { 1 }; for (i = 0; i < 4; i++) (u, if (y u.x e)) }"); // Garbage code
280+
}
281+
282+
void garbageCode15() { // Ticket #5203
283+
checkCode("int f ( int* r ) { { int s[2] ; f ( s ) ; if ( ) } }");
284+
}
285+
286+
void garbageCode16() {
287+
checkCode("{ } A() { delete }"); // #6080
288+
}
289+
290+
void garbageCode17() {
291+
ASSERT_THROW(checkCode("void h(int l) {\n"
292+
" while\n" // Don't crash (#3870)
293+
"}"), InternalError);
294+
}
295+
296+
void garbageCode18() {
297+
ASSERT_THROW(checkCode("switch(){case}"), InternalError);
298+
}
299+
300+
void garbageCode19() {
301+
// ticket #3512 - Don't crash on garbage code
302+
ASSERT_EQUALS("p = const", checkCode("1 *p = const"));
303+
}
304+
305+
void garbageCode20() {
306+
// #3953 (valgrind errors on garbage code)
307+
ASSERT_EQUALS("void f ( 0 * ) ;", checkCode("void f ( 0 * ) ;"));
308+
}
309+
310+
void garbageCode21() {
311+
// Ticket #3486 - Don't crash garbage code
312+
checkCode("void f()\n"
313+
"{\n"
314+
" (\n"
315+
" x;\n"
316+
" int a, a2, a2*x; if () ;\n"
317+
" )\n"
318+
"}");
319+
}
320+
321+
void garbageCode22() {
322+
// Ticket #3480 - Don't crash garbage code
323+
ASSERT_THROW(checkCode("int f()\n"
324+
"{\n"
325+
" return if\n"
326+
"}"), InternalError);
327+
}
328+
329+
void garbageCode23() {
330+
//garbage code : don't crash (#3481)
331+
checkCode("{\n"
332+
" if (1) = x\n"
333+
" else abort s[2]\n"
334+
"}");
335+
ASSERT_EQUALS("", errout.str());
336+
}
337+
338+
void garbageValueFlow() {
339+
// #6089
340+
const char* code = "{} int foo(struct, x1, struct x2, x3, int, x5, x6, x7)\n"
341+
"{\n"
342+
" (foo(s, , 2, , , 5, , 7)) abort()\n"
343+
"}\n";
344+
ASSERT_THROW(checkCode(code), InternalError);
345+
346+
// #6106
347+
code = " f { int i ; b2 , [ ] ( for ( i = 0 ; ; ) ) }";
348+
checkCode(code);
349+
350+
// 6122 survive garbage code
351+
code = "; { int i ; for ( i = 0 ; = 123 ; ) - ; }";
352+
checkCode(code);
353+
}
354+
355+
void garbageSymbolDatabase() {
356+
checkCode("void f( { u = 1 ; } ) { }");
357+
358+
checkCode("{ }; void namespace A::f; { g() { int } }");
359+
360+
ASSERT_THROW(checkCode("class Foo {}; class Bar : public Foo"), InternalError);
361+
362+
ASSERT_THROW(checkCode("YY_DECL { switch (yy_act) {\n"
363+
" case 65: YY_BREAK\n"
364+
" case YY_STATE_EOF(block):\n"
365+
" yyterminate(); \n"
366+
"} }"), InternalError); // #5663
367+
}
368+
369+
void garbageAST() {
262370
checkCode("--"); // don't crash
263371

264372
checkCode("N 1024 float a[N], b[N + 3], c[N]; void N; (void) i;\n"

test/testmemleak.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -361,8 +361,6 @@ class TestMemleakInFunction : public TestFixture {
361361
// #1879 non regression test case
362362
TEST_CASE(trac1879);
363363

364-
TEST_CASE(garbageCode);
365-
366364
TEST_CASE(ptrptr);
367365

368366
// test that the cfg files are configured correctly
@@ -4213,12 +4211,6 @@ class TestMemleakInFunction : public TestFixture {
42134211
ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: a\n", errout.str());
42144212
}
42154213

4216-
void garbageCode() {
4217-
ASSERT_THROW(check("void h(int l) {\n"
4218-
" while\n" // Don't crash (#3870)
4219-
"}"), InternalError);
4220-
}
4221-
42224214
void ptrptr() {
42234215
check("void f() {\n"
42244216
" char *p;\n"

test/testsymboldatabase.cpp

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,6 @@ class TestSymbolDatabase: public TestFixture {
231231

232232
TEST_CASE(isImplicitlyVirtual);
233233

234-
TEST_CASE(garbage);
235-
236234
TEST_CASE(isFunction); // UNKNOWN_MACRO(a,b) { .. }
237235

238236
TEST_CASE(findFunction1);
@@ -2119,27 +2117,6 @@ class TestSymbolDatabase: public TestFixture {
21192117
}
21202118
}
21212119

2122-
void garbage() {
2123-
{
2124-
GET_SYMBOL_DB("void f( { u = 1 ; } ) { }");
2125-
(void)db;
2126-
}
2127-
{
2128-
GET_SYMBOL_DB("{ }; void namespace A::f; { g() { int } }");
2129-
(void)db;
2130-
}
2131-
{
2132-
ASSERT_THROW(createSymbolDatabase("class Foo {}; class Bar : public Foo"), InternalError);
2133-
}
2134-
{
2135-
ASSERT_THROW(createSymbolDatabase("YY_DECL { switch (yy_act) {\n"
2136-
" case 65: YY_BREAK\n"
2137-
" case YY_STATE_EOF(block):\n"
2138-
" yyterminate(); \n"
2139-
"} }"), InternalError); // #5663
2140-
}
2141-
}
2142-
21432120
void isFunction() { // #5602 - UNKNOWN_MACRO(a,b) { .. }
21442121
GET_SYMBOL_DB("TEST(a,b) {\n"
21452122
" std::vector<int> messages;\n"

test/testtokenize.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5203,8 +5203,6 @@ class TestTokenizer : public TestFixture {
52035203
//with unhandled MACRO() code
52045204
ASSERT_EQUALS("void f(){ MACRO( ab: b=0;, foo)}", labels_("void f() { MACRO(ab: b=0;, foo)}"));
52055205
ASSERT_EQUALS("void f(){ MACRO( bar, ab:{&(* b. x)=0;})}", labels_("void f() { MACRO(bar, ab: {&(*b.x)=0;})}"));
5206-
//don't crash with garbage code
5207-
ASSERT_THROW(labels_("switch(){case}"), InternalError);
52085206
}
52095207

52105208
void simplifyInitVar() {
@@ -5946,8 +5944,6 @@ class TestTokenizer : public TestFixture {
59465944
tokenizeAndStringify("int f(int a) { return 0 * a; }", true));
59475945
ASSERT_EQUALS("bool f ( int i ) { switch ( i ) { case 15 : ; return true ; } }",
59485946
tokenizeAndStringify("bool f(int i) { switch (i) { case 10 + 5: return true; } }", true));
5949-
// ticket #3512 - Don't crash on garbage code
5950-
ASSERT_EQUALS("p = const", tokenizeAndStringify("1 *p = const", true));
59515947

59525948
// ticket #3576 - False positives in boolean expressions
59535949
ASSERT_EQUALS("int foo ( ) { return 1 ; }",
@@ -5962,9 +5958,6 @@ class TestTokenizer : public TestFixture {
59625958

59635959
// ticket #3964 - simplify numeric calculations in tokenization
59645960
ASSERT_EQUALS("char a [ 10 ] ;", tokenizeAndStringify("char a[9+1];"));
5965-
5966-
// #3953 (valgrind errors on garbage code)
5967-
ASSERT_EQUALS("void f ( 0 * ) ;", tokenizeAndStringify("void f ( 0 * ) ;"));
59685961
}
59695962

59705963
void simplifyCompoundAssignment() {

test/testuninitvar.cpp

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -585,12 +585,6 @@ class TestUninitVar : public TestFixture {
585585
"}");
586586
ASSERT_EQUALS("", errout.str());
587587

588-
// Ticket #3480 - Don't crash garbage code
589-
ASSERT_THROW(checkUninitVar("int f()\n"
590-
"{\n"
591-
" return if\n"
592-
"}"), InternalError);
593-
594588
// Ticket #3873 (false positive)
595589
checkUninitVar("MachineLoopRange *MachineLoopRanges::getLoopRange(const MachineLoop *Loop) {\n"
596590
" MachineLoopRange *&Range = Cache[Loop];\n"
@@ -2536,15 +2530,6 @@ class TestUninitVar : public TestFixture {
25362530
"}");
25372531
ASSERT_EQUALS("", errout.str());
25382532

2539-
// Ticket #3486 - Don't crash garbage code
2540-
checkUninitVar2("void f()\n"
2541-
"{\n"
2542-
" (\n"
2543-
" x;\n"
2544-
" int a, a2, a2*x; if () ;\n"
2545-
" )\n"
2546-
"}");
2547-
25482533
// Ticket #3890 - False positive for std::map
25492534
checkUninitVar2("void f() {\n"
25502535
" std::map<int,bool> x;\n"

0 commit comments

Comments
 (0)