Simplified remaining TestBufferOverrun test cases

This commit is contained in:
Daniel Marjamäki 2013-04-13 15:49:15 +02:00
parent cbe2cdafcf
commit 393c75af70
3 changed files with 49 additions and 33 deletions

View File

@ -33,7 +33,7 @@ public:
private: private:
void check(const char code[], bool experimental = true, const char filename[] = "test.cpp") { void check(const char code[], bool experimental = true, const char filename[] = "test.cpp", bool verify = true) {
// Clear the error buffer.. // Clear the error buffer..
errout.str(""); errout.str("");
@ -50,9 +50,18 @@ private:
std::istringstream istr(code); std::istringstream istr(code);
tokenizer.tokenize(istr, filename); tokenizer.tokenize(istr, filename);
const std::string str1(tokenizer.tokens()->stringifyList(0,true));
// Assign variable ids // Assign variable ids
tokenizer.simplifyTokenList(); tokenizer.simplifyTokenList();
const std::string str2(tokenizer.tokens()->stringifyList(0,true));
// Ensure that the test case is not bad.
if (verify && str1 != str2) {
warn("Unsimplified code in test case");
}
// Check for buffer overruns.. // Check for buffer overruns..
CheckBufferOverrun checkBufferOverrun(&tokenizer, &settings, this); CheckBufferOverrun checkBufferOverrun(&tokenizer, &settings, this);
checkBufferOverrun.bufferOverrun(); checkBufferOverrun.bufferOverrun();
@ -1060,8 +1069,8 @@ private:
check("void f()\n" check("void f()\n"
"{\n" "{\n"
" int iBuf[10];" " int iBuf[10];"
" int *i = &iBuf[9];" " int *i = iBuf + 9;"
" int *ii = &i[-5];" " int *ii = i + -5;"
" ii[10] = 0;" " ii[10] = 0;"
"}"); "}");
TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Array ii[10] out of bounds.\n", "", errout.str()); TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Array ii[10] out of bounds.\n", "", errout.str());
@ -1570,14 +1579,11 @@ private:
"}"); "}");
ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[1][1][1]' index a[2][2][2] out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[1][1][1]' index a[2][2][2] out of bounds.\n", errout.str());
check("void f()\n" check("void f() {\n"
"{\n" " char a[6][6][6];\n"
" int i=2;\n" " a[6][6][2] = 'a';\n"
" int ii=i*3;\n"
" char a[ii][ii][ii];\n"
" a[i*3][i*3][i] = 'a';\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:6]: (error) Array 'a[6][6][6]' index a[6][6][2] out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[6][6][6]' index a[6][6][2] out of bounds.\n", errout.str());
// unknown dim.. // unknown dim..
check("void f()\n" check("void f()\n"
@ -2023,7 +2029,7 @@ private:
"{\n" "{\n"
" long bb[2];\n" " long bb[2];\n"
" write(stdin, bb, sizeof(bb));\n" " write(stdin, bb, sizeof(bb));\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
check("void f()\n" check("void f()\n"
@ -2541,16 +2547,14 @@ private:
" double dest = 23.0;\n" " double dest = 23.0;\n"
" char* const source = (char*) malloc(sizeof(dest));\n" " char* const source = (char*) malloc(sizeof(dest));\n"
" memcpy(&dest, source + sizeof(double), sizeof(dest));\n" " memcpy(&dest, source + sizeof(double), sizeof(dest));\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds.\n", errout.str());
check("void foo() {\n" check("void foo() {\n"
" double dest = 23.0;\n" " double dest = 23.0;\n"
" char* const source = (char*) malloc(2 * sizeof(dest));\n" " char* const source = (char*) malloc(2 * sizeof(dest));\n"
" memcpy(&dest, source + sizeof(double), sizeof(dest));\n" " memcpy(&dest, source + sizeof(double), sizeof(dest));\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
@ -3108,16 +3112,16 @@ private:
check("void f() { \n" check("void f() { \n"
"char str1[]=\"Sample string\";\n" "char str1[]=\"Sample string\";\n"
"char str2;\n" "char str2;\n"
"memcpy (&str2,str1,strlen(str1)+1);\n" "memcpy (&str2,str1,13);\n" // <-- strlen(str1)+1 = 13
"}"); "}");
TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: str1\n","", errout.str()); TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: str1\n","", errout.str());
check("void f() {\n" check("void f() {\n"
" char a[10];\n" " char a[10];\n"
" char str1[] = \"abcdef\";\n" " char str1[] = \"abcdef\";\n"
" memset(a, 0, strlen(str1)+5);\n" " memset(a, 0, 11);\n" // <-- strlen(str1) + 5 = 11
"}"); "}");
TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: str1\n","", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: a\n", errout.str());
check("void f() { \n" check("void f() { \n"
"char str1[]=\"Sample string\";\n" "char str1[]=\"Sample string\";\n"
@ -3167,7 +3171,7 @@ private:
void alloc1() { void alloc1() {
check("void foo()\n" check("void foo()\n"
"{\n" "{\n"
" char *s = new char[10];\n" " char *s; s = new char[10];\n"
" s[10] = 0;\n" " s[10] = 0;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str());
@ -3175,7 +3179,7 @@ private:
// ticket #1670 - false negative when using return // ticket #1670 - false negative when using return
check("char f()\n" check("char f()\n"
"{\n" "{\n"
" char *s = new int[10];\n" " char *s; s = new int[10];\n"
" return s[10];\n" " return s[10];\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str());
@ -3183,14 +3187,14 @@ private:
check("struct Fred { char c[10]; };\n" check("struct Fred { char c[10]; };\n"
"char f()\n" "char f()\n"
"{\n" "{\n"
" Fred *f = new Fred;\n" " Fred *f; f = new Fred;\n"
" return f->c[10];\n" " return f->c[10];\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:5]: (error) Array 'f.c[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:5]: (error) Array 'f.c[10]' accessed at index 10, which is out of bounds.\n", errout.str());
check("void foo()\n" check("void foo()\n"
"{\n" "{\n"
"char * buf = new char[8];\n" "char * buf; buf = new char[8];\n"
"buf[7] = 0;\n" "buf[7] = 0;\n"
"delete [] buf;\n" "delete [] buf;\n"
"buf = new char[9];\n" "buf = new char[9];\n"
@ -3201,7 +3205,7 @@ private:
check("void foo()\n" check("void foo()\n"
"{\n" "{\n"
"char * buf = new char[8];\n" "char * buf; buf = new char[8];\n"
"buf[7] = 0;\n" "buf[7] = 0;\n"
"delete [] buf;\n" "delete [] buf;\n"
"buf = new char[9];\n" "buf = new char[9];\n"
@ -3211,13 +3215,13 @@ private:
ASSERT_EQUALS("[test.cpp:7]: (error) Array 'buf[9]' accessed at index 9, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:7]: (error) Array 'buf[9]' accessed at index 9, which is out of bounds.\n", errout.str());
check("void f() {\n" check("void f() {\n"
" int *tab4 = malloc(20 * sizeof(int));\n" " int *tab4; tab4 = malloc(20 * sizeof(int));\n"
" tab4[19] = 0;\n" " tab4[19] = 0;\n"
" free(tab4);\n" " free(tab4);\n"
" tab4 = malloc(21 * sizeof(int));\n" " tab4 = malloc(21 * sizeof(int));\n"
" tab4[20] = 0;\n" " tab4[20] = 0;\n"
" free(tab4);\n" " free(tab4);\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
check("void f() {\n" check("void f() {\n"
@ -3226,7 +3230,7 @@ private:
" tab4 = realloc(tab4,21 * sizeof(int));\n" " tab4 = realloc(tab4,21 * sizeof(int));\n"
" tab4[20] = 0;\n" " tab4[20] = 0;\n"
" free(tab4);\n" " free(tab4);\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
@ -3234,7 +3238,7 @@ private:
void alloc2() { void alloc2() {
check("void foo()\n" check("void foo()\n"
"{\n" "{\n"
" char *s = (char *)malloc(10);\n" " char *s; s = malloc(10);\n"
" s[10] = 0;\n" " s[10] = 0;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str());
@ -3243,7 +3247,7 @@ private:
check("void f() {\n" check("void f() {\n"
" int *tab4 = malloc(20 * sizeof(int));\n" " int *tab4 = malloc(20 * sizeof(int));\n"
" tab4[20] = 0;\n" " tab4[20] = 0;\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("[test.cpp:3]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout.str());
// ticket #1134 // ticket #1134
@ -3251,7 +3255,7 @@ private:
" int *x, i;\n" " int *x, i;\n"
" x = malloc(10 * sizeof(int));\n" " x = malloc(10 * sizeof(int));\n"
" x[10] = 0;\n" " x[10] = 0;\n"
"}"); "}", false, "test.cpp", false);
ASSERT_EQUALS("[test.cpp:4]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", errout.str());
} }
@ -3283,7 +3287,7 @@ private:
void alloc4() { void alloc4() {
check("void foo()\n" check("void foo()\n"
"{\n" "{\n"
" char *s = (char *)alloca(10);\n" " char *s = alloca(10);\n"
" s[10] = 0;\n" " s[10] = 0;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str());
@ -3309,7 +3313,7 @@ private:
"{\n" "{\n"
" int* x[5];\n" " int* x[5];\n"
" memset(x, 0, sizeof(x));\n" " memset(x, 0, sizeof(x));\n"
"}"); "}",false,"test.cpp",false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
@ -3320,7 +3324,7 @@ private:
"};\n" "};\n"
"X::X() {\n" "X::X() {\n"
" memset(array, 0, sizeof(array));\n" " memset(array, 0, sizeof(array));\n"
"}"); "}",false,"test.cpp",false);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }

View File

@ -24,6 +24,7 @@
std::ostringstream errout; std::ostringstream errout;
std::ostringstream output; std::ostringstream output;
std::ostringstream warnings;
/** /**
* TestRegistry * TestRegistry
@ -223,6 +224,11 @@ void TestFixture::run(const std::string &str)
run(); run();
} }
void TestFixture::warn(const char msg[])
{
warnings << "Warning: " << currentTest << " " << msg << std::endl;
}
void TestFixture::processOptions(const options& args) void TestFixture::processOptions(const options& args)
{ {
quiet_tests = args.quiet(); quiet_tests = args.quiet();
@ -250,6 +256,10 @@ std::size_t TestFixture::runTests(const options& args)
} }
} }
const std::string &w(warnings.str());
if (!w.empty()) {
std::cout << "\n\n" << w;
}
std::cout << "\n\nTesting Complete\nNumber of tests: " << countTests << std::endl; std::cout << "\n\nTesting Complete\nNumber of tests: " << countTests << std::endl;
std::cout << "Number of todos: " << todos_counter; std::cout << "Number of todos: " << todos_counter;
if (succeeded_todos_counter > 0) if (succeeded_todos_counter > 0)

View File

@ -39,6 +39,7 @@ protected:
std::string testToRun; std::string testToRun;
bool gcc_style_errors; bool gcc_style_errors;
bool quiet_tests; bool quiet_tests;
std::string currentTest;
virtual void run() = 0; virtual void run() = 0;
@ -60,6 +61,7 @@ public:
virtual void reportOut(const std::string &outmsg); virtual void reportOut(const std::string &outmsg);
virtual void reportErr(const ErrorLogger::ErrorMessage &msg); virtual void reportErr(const ErrorLogger::ErrorMessage &msg);
void run(const std::string &str); void run(const std::string &str);
void warn(const char msg[]);
TestFixture(const std::string &_name); TestFixture(const std::string &_name);
virtual ~TestFixture() { } virtual ~TestFixture() { }
@ -68,7 +70,7 @@ public:
static std::size_t runTests(const options& args); static std::size_t runTests(const options& args);
}; };
#define TEST_CASE( NAME ) if ( runTest(#NAME) ) { if (quiet_tests) { REDIRECT; NAME(); } else { NAME ();} } #define TEST_CASE( NAME ) if ( runTest(#NAME) ) { currentTest = classname + "::" + #NAME; if (quiet_tests) { REDIRECT; NAME(); } else { NAME ();} }
#define ASSERT( CONDITION ) assert_(__FILE__, __LINE__, CONDITION) #define ASSERT( CONDITION ) assert_(__FILE__, __LINE__, CONDITION)
#define ASSERT_EQUALS( EXPECTED , ACTUAL ) assertEquals(__FILE__, __LINE__, EXPECTED, ACTUAL) #define ASSERT_EQUALS( EXPECTED , ACTUAL ) assertEquals(__FILE__, __LINE__, EXPECTED, ACTUAL)
#define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL) #define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL)