Collected some more garbage code tests in testgarbage.cpp; Avoid std::string creation in testgarbage.cpp

This commit is contained in:
PKEuS 2015-08-16 19:11:56 +02:00
parent aab4ecc726
commit 128a926d9d
5 changed files with 66 additions and 68 deletions

View File

@ -234,8 +234,6 @@ private:
TEST_CASE(negativeMemoryAllocationSizeError) // #389 TEST_CASE(negativeMemoryAllocationSizeError) // #389
TEST_CASE(negativeArraySize); TEST_CASE(negativeArraySize);
TEST_CASE(garbage1) // #6303
} }
@ -3806,14 +3804,6 @@ private:
"int c[x?y:-1];\n"); "int c[x?y:-1];\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void garbage1() {
check("void foo() {\n"
"char *a = malloc(10);\n"
"a[0]\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
}; };
REGISTER_TEST(TestBufferOverrun) REGISTER_TEST(TestBufferOverrun)

View File

@ -158,6 +158,11 @@ private:
TEST_CASE(garbageCode116); // #5356 TEST_CASE(garbageCode116); // #5356
TEST_CASE(garbageCode117); // #6121 TEST_CASE(garbageCode117); // #6121
TEST_CASE(garbageCode118); // #5600 TEST_CASE(garbageCode118); // #5600
TEST_CASE(garbageCode119); // #5598
TEST_CASE(garbageCode120); // #4927
TEST_CASE(garbageCode121); // #2585
TEST_CASE(garbageCode122); // #6303
TEST_CASE(garbageCode123);
TEST_CASE(garbageValueFlow); TEST_CASE(garbageValueFlow);
TEST_CASE(garbageSymbolDatabase); TEST_CASE(garbageSymbolDatabase);
@ -165,9 +170,11 @@ private:
TEST_CASE(templateSimplifierCrashes); TEST_CASE(templateSimplifierCrashes);
} }
std::string checkCode(const char code[], const std::string& filename = "test.cpp") { std::string checkCode(const char code[], bool cpp = true) {
// double the tests - run each example as C as well as C++ // double the tests - run each example as C as well as C++
const std::string alternatefilename = (filename=="test.c") ? "test.cpp" : "test.c"; const char* filename = cpp ? "test.cpp" : "test.c";
const char* alternatefilename = cpp ? "test.c" : "test.cpp";
// run alternate check first. It should only ensure stability // run alternate check first. It should only ensure stability
try { try {
checkCodeInternal(code, alternatefilename); checkCodeInternal(code, alternatefilename);
@ -177,7 +184,7 @@ private:
return checkCodeInternal(code, filename); return checkCodeInternal(code, filename);
} }
std::string checkCodeInternal(const char code[], const std::string& filename) { std::string checkCodeInternal(const char code[], const char* filename) {
errout.str(""); errout.str("");
Settings settings; Settings settings;
@ -192,7 +199,7 @@ private:
// tokenize.. // tokenize..
Tokenizer tokenizer(&settings, this); Tokenizer tokenizer(&settings, this);
std::istringstream istr(code); std::istringstream istr(code);
tokenizer.tokenize(istr, filename.c_str()); tokenizer.tokenize(istr, filename);
// call all "runChecks" in all registered Check classes // call all "runChecks" in all registered Check classes
for (std::list<Check *>::const_iterator it = Check::instances().begin(); it != Check::instances().end(); ++it) { for (std::list<Check *>::const_iterator it = Check::instances().begin(); it != Check::instances().end(); ++it) {
@ -281,10 +288,11 @@ private:
// #3585 // #3585
const char code[] = "class x y { };"; const char code[] = "class x y { };";
{
errout.str("");
Settings settings; Settings settings;
settings.addEnabled("information"); settings.addEnabled("information");
{
errout.str("");
Tokenizer tokenizer(&settings, this); Tokenizer tokenizer(&settings, this);
std::istringstream istr(code); std::istringstream istr(code);
tokenizer.tokenize(istr, "test.c"); tokenizer.tokenize(istr, "test.c");
@ -293,8 +301,6 @@ private:
} }
{ {
errout.str(""); errout.str("");
Settings settings;
settings.addEnabled("information");
Tokenizer tokenizer(&settings, this); Tokenizer tokenizer(&settings, this);
std::istringstream istr(code); std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp"); tokenizer.tokenize(istr, "test.cpp");
@ -668,7 +674,7 @@ private:
} }
void garbageCode67() { // #6744 void garbageCode67() { // #6744
checkCode("&g[0]; { (g[0] 0) } =", "test.c"); checkCode("&g[0]; { (g[0] 0) } =", false);
} }
void garbageCode68() { // #6745 void garbageCode68() { // #6745
@ -700,7 +706,7 @@ private:
} }
void garbageCode75() { // #6753 void garbageCode75() { // #6753
checkCode("{ { void foo() { struct }; { }; } }; struct S { } f =", "test.c"); checkCode("{ { void foo() { struct }; { }; } }; struct S { } f =", false);
} }
void garbageCode76() { // #6754 void garbageCode76() { // #6754
@ -772,7 +778,7 @@ private:
} }
void garbageCode93() { // #6800 void garbageCode93() { // #6800
checkCode(" namespace A { } class A{ { }} class A : T ;", "test.c"); // do not crash checkCode(" namespace A { } class A{ { }} class A : T ;", false); // do not crash
} }
void garbageCode94() { // #6803 void garbageCode94() { // #6803
@ -894,6 +900,39 @@ private:
"}"), InternalError); "}"), InternalError);
} }
void garbageCode119() { // #5598
checkCode("{ { void foo() { struct }; template <typename> struct S { Used x; void bar() } auto f = [this] { }; } };");
}
void garbageCode120() { // #4927
checkCode("int main() {\n"
" return 0\n"
"}");
ASSERT_EQUALS("", errout.str());
}
void garbageCode121() { // #2585
checkCode("abcdef?""?<"
"123456?""?>"
"+?""?=");
ASSERT_EQUALS("", errout.str());
}
void garbageCode122() { // #6303
checkCode("void foo() {\n"
"char *a = malloc(10);\n"
"a[0]\n"
"}");
}
void garbageCode123() {
checkCode("namespace pr16989 {\n"
" class C {\n"
" C tpl_mem(T *) { return }\n"
" };\n"
"}");
}
void garbageValueFlow() { void garbageValueFlow() {
// #6089 // #6089
const char* code = "{} int foo(struct, x1, struct x2, x3, int, x5, x6, x7)\n" const char* code = "{} int foo(struct, x1, struct x2, x3, int, x5, x6, x7)\n"
@ -939,7 +978,7 @@ private:
} }
void templateSimplifierCrashes() { void templateSimplifierCrashes() {
checkCode( //5950 checkCode( // #5950
"struct A { \n" "struct A { \n"
" template <class T> operator T*();\n" " template <class T> operator T*();\n"
"}; \n" "}; \n"
@ -961,7 +1000,7 @@ private:
" }\n" " }\n"
"}\n"); "}\n");
checkCode( // 6034 checkCode( // #6034
"template<template<typename...> class T, typename... Args>\n" "template<template<typename...> class T, typename... Args>\n"
"struct foo<T<Args...> > {\n" "struct foo<T<Args...> > {\n"
" const bool value = true;\n" " const bool value = true;\n"
@ -976,9 +1015,9 @@ private:
"}\n" "}\n"
); );
checkCode(" > template < . > struct Y < T > { = } ;\n"); //6108 checkCode(" > template < . > struct Y < T > { = } ;\n"); // #6108
checkCode( // 6117 checkCode( // #6117
"template <typename ...> struct something_like_tuple\n" "template <typename ...> struct something_like_tuple\n"
"{};\n" "{};\n"
"template <typename, typename> struct is_last {\n" "template <typename, typename> struct is_last {\n"
@ -997,7 +1036,7 @@ private:
"SA ((is_last<int, something_like_tuple_t>::value == false));\n" "SA ((is_last<int, something_like_tuple_t>::value == false));\n"
); );
checkCode( //6225 checkCode( // #6225
"template <typename...>\n" "template <typename...>\n"
"void templ_fun_with_ty_pack() {}\n" "void templ_fun_with_ty_pack() {}\n"
" \n" " \n"
@ -1007,6 +1046,17 @@ private:
" using AliasA = A<T>;\n" " using AliasA = A<T>;\n"
"}\n" "}\n"
); );
// #3449
ASSERT_EQUALS("template < typename T > struct A ;\n"
"struct B { template < typename T > struct C } ;\n"
"{ } ;",
checkCode("template<typename T> struct A;\n"
"struct B { template<typename T> struct C };\n"
"{};"));
// #4169
checkCode("volatile true , test < test < #ifdef __ppc__ true ,");
} }
}; };

View File

@ -3186,13 +3186,6 @@ private:
" per_state_info() : enter(0), exit(0), events(0) {}\n" " per_state_info() : enter(0), exit(0), events(0) {}\n"
"};", nullptr, false, false, false); "};", nullptr, false, false, false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// Garbage code - don't crash
check("namespace pr16989 {\n"
" class C {\n"
" C tpl_mem(T *) { return }\n"
" };\n"
"}");
} }
@ -3815,12 +3808,6 @@ private:
"}"); "}");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// Ticket #2585 - segmentation fault for invalid code
check("abcdef?""?<"
"123456?""?>"
"+?""?=");
ASSERT_EQUALS("", errout.str());
check("void f(char c) {\n" check("void f(char c) {\n"
" printf(\"%i\", 1 + 1 ? 1 : 2);\n" // "1+1" is simplified away " printf(\"%i\", 1 + 1 ? 1 : 2);\n" // "1+1" is simplified away
"}",0,false,false,false); "}",0,false,false,false);
@ -6054,12 +6041,6 @@ private:
"}", nullptr, true, false, false); "}", nullptr, true, false, false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// ticket #4927 Segfault in CheckOther::checkCommaSeparatedReturn() on invalid code
check("int main() {\n"
" return 0\n"
"}", nullptr, true, false, false);
ASSERT_EQUALS("", errout.str());
// #4943 take care of C++11 initializer lists // #4943 take care of C++11 initializer lists
check("std::vector<Foo> Bar() {\n" check("std::vector<Foo> Bar() {\n"
" return\n" " return\n"

View File

@ -59,7 +59,6 @@ private:
TEST_CASE(template26); // #2721 - passing 'char[2]' as template parameter TEST_CASE(template26); // #2721 - passing 'char[2]' as template parameter
TEST_CASE(template27); // #3350 - removing unused template in macro call TEST_CASE(template27); // #3350 - removing unused template in macro call
TEST_CASE(template28); TEST_CASE(template28);
TEST_CASE(template29); // #3449 - don't crash for garbage code
TEST_CASE(template30); // #3529 - template < template < .. TEST_CASE(template30); // #3529 - template < template < ..
TEST_CASE(template31); // #4010 - reference type TEST_CASE(template31); // #4010 - reference type
TEST_CASE(template32); // #3818 - mismatching template not handled well TEST_CASE(template32); // #3818 - mismatching template not handled well
@ -95,7 +94,6 @@ private:
// Test TemplateSimplifier::templateParameters // Test TemplateSimplifier::templateParameters
TEST_CASE(templateParameters); TEST_CASE(templateParameters);
TEST_CASE(templateParameters1); // #4169 - segmentation fault
TEST_CASE(templateNamePosition); TEST_CASE(templateNamePosition);
} }
@ -659,14 +657,6 @@ private:
ASSERT_EQUALS("Fred<int,Fred<int,int>> x ; class Fred<int,int> { } ; class Fred<int,Fred<int,int>> { } ;", tok(code)); ASSERT_EQUALS("Fred<int,Fred<int,int>> x ; class Fred<int,int> { } ; class Fred<int,Fred<int,int>> { } ;", tok(code));
} }
void template29() {
// #3449 - garbage code (don't segfault)
const char code[] = "template<typename T> struct A;\n"
"struct B { template<typename T> struct C };\n"
"{};";
ASSERT_EQUALS("template < typename T > struct A ; struct B { template < typename T > struct C } ; { } ;", tok(code));
}
void template30() { void template30() {
// #3529 - template < template < .. // #3529 - template < template < ..
const char code[] = "template<template<class> class A, class B> void f(){}"; const char code[] = "template<template<class> class A, class B> void f(){}";
@ -1216,13 +1206,6 @@ private:
TODO_ASSERT_EQUALS(2U, 0U, templateParameters("<class, typename...> x;")); // Mishandled valid syntax TODO_ASSERT_EQUALS(2U, 0U, templateParameters("<class, typename...> x;")); // Mishandled valid syntax
} }
void templateParameters1() {
// #4169 - segmentation fault (invalid code)
const char code[] = "volatile true , test < test < #ifdef __ppc__ true ,";
// do not crash on invalid code
ASSERT_EQUALS(0, templateParameters(code));
}
// Helper function to unit test TemplateSimplifier::getTemplateNamePosition // Helper function to unit test TemplateSimplifier::getTemplateNamePosition
int templateNamePositionHelper(const char code[], unsigned offset = 0) { int templateNamePositionHelper(const char code[], unsigned offset = 0) {
Settings settings; Settings settings;

View File

@ -45,7 +45,6 @@ private:
TEST_CASE(iterator11); TEST_CASE(iterator11);
TEST_CASE(iterator12); TEST_CASE(iterator12);
TEST_CASE(iterator13); TEST_CASE(iterator13);
TEST_CASE(iterator14); // #5598 invalid code causing a crash
TEST_CASE(dereference); TEST_CASE(dereference);
TEST_CASE(dereference_break); // #3644 - handle "break" TEST_CASE(dereference_break); // #3644 - handle "break"
@ -454,11 +453,6 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void iterator14() {
check(" { { void foo() { struct }; template <typename> struct S { Used x; void bar() } auto f = [this] { }; } };");
ASSERT_EQUALS("", errout.str());
}
// Dereferencing invalid pointer // Dereferencing invalid pointer
void dereference() { void dereference() {
check("void f()\n" check("void f()\n"