Simplified remaining TestBufferOverrun test cases
This commit is contained in:
parent
cbe2cdafcf
commit
393c75af70
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue