CheckMemoryLeak: Move posix-opendir/closedir to library
This commit is contained in:
parent
87b67e9b77
commit
2b8cf462c9
|
@ -8,5 +8,11 @@
|
||||||
<dealloc>close</dealloc>
|
<dealloc>close</dealloc>
|
||||||
<alloc init="true">socket</alloc>
|
<alloc init="true">socket</alloc>
|
||||||
</resource>
|
</resource>
|
||||||
|
|
||||||
|
<resource>
|
||||||
|
<dealloc>closedir</dealloc>
|
||||||
|
<alloc init="true">opendir</alloc>
|
||||||
|
<alloc init="true">fdopendir</alloc>
|
||||||
|
</resource>
|
||||||
</def>
|
</def>
|
||||||
|
|
||||||
|
|
|
@ -179,11 +179,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2,
|
||||||
if (Token::simpleMatch(tok2, "popen ("))
|
if (Token::simpleMatch(tok2, "popen ("))
|
||||||
return Pipe;
|
return Pipe;
|
||||||
|
|
||||||
if (settings1->standards.posix) {
|
|
||||||
if (Token::Match(tok2, "opendir|fdopendir ("))
|
|
||||||
return Dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does tok2 point on "g_malloc", "g_strdup", ..
|
// Does tok2 point on "g_malloc", "g_strdup", ..
|
||||||
const int alloctype = settings1->library.alloc(tok2->str());
|
const int alloctype = settings1->library.alloc(tok2->str());
|
||||||
if (alloctype > 0)
|
if (alloctype > 0)
|
||||||
|
@ -267,9 +262,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok
|
||||||
|
|
||||||
if (Token::Match(tok, "pclose ( %varid% )", varid))
|
if (Token::Match(tok, "pclose ( %varid% )", varid))
|
||||||
return Pipe;
|
return Pipe;
|
||||||
|
|
||||||
if (Token::Match(tok, "closedir ( %varid% )", varid))
|
|
||||||
return Dir;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Does tok2 point on "g_free", etc ..
|
// Does tok2 point on "g_free", etc ..
|
||||||
|
@ -311,9 +303,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok
|
||||||
if (Token::simpleMatch(tok, std::string("pclose ( " + varname + " )").c_str()))
|
if (Token::simpleMatch(tok, std::string("pclose ( " + varname + " )").c_str()))
|
||||||
return Pipe;
|
return Pipe;
|
||||||
|
|
||||||
if (Token::simpleMatch(tok, std::string("closedir ( " + varname + " )").c_str()))
|
|
||||||
return Dir;
|
|
||||||
|
|
||||||
if (Token::Match(tok, ("%type% ( " + varname + " )").c_str())) {
|
if (Token::Match(tok, ("%type% ( " + varname + " )").c_str())) {
|
||||||
int type = settings1->library.dealloc(tok->str());
|
int type = settings1->library.dealloc(tok->str());
|
||||||
if (type > 0)
|
if (type > 0)
|
||||||
|
@ -333,7 +322,6 @@ void CheckMemoryLeak::memoryLeak(const Token *tok, const std::string &varname, A
|
||||||
if (alloctype == CheckMemoryLeak::File ||
|
if (alloctype == CheckMemoryLeak::File ||
|
||||||
alloctype == CheckMemoryLeak::Pipe ||
|
alloctype == CheckMemoryLeak::Pipe ||
|
||||||
alloctype == CheckMemoryLeak::Fd ||
|
alloctype == CheckMemoryLeak::Fd ||
|
||||||
alloctype == CheckMemoryLeak::Dir ||
|
|
||||||
alloctype == CheckMemoryLeak::OtherRes)
|
alloctype == CheckMemoryLeak::OtherRes)
|
||||||
resourceLeakError(tok, varname);
|
resourceLeakError(tok, varname);
|
||||||
else
|
else
|
||||||
|
|
|
@ -91,7 +91,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */
|
/** @brief What type of allocation are used.. the "Many" means that several types of allocation and deallocation are used */
|
||||||
enum AllocType { No, Malloc, New, NewArray, File, Fd, Pipe, Dir, OtherMem, OtherRes, Many };
|
enum AllocType { No, Malloc, New, NewArray, File, Fd, Pipe, OtherMem, OtherRes, Many };
|
||||||
|
|
||||||
void memoryLeak(const Token *tok, const std::string &varname, AllocType alloctype);
|
void memoryLeak(const Token *tok, const std::string &varname, AllocType alloctype);
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,6 @@ private:
|
||||||
TEST_CASE(mismatch4);
|
TEST_CASE(mismatch4);
|
||||||
TEST_CASE(mismatch5);
|
TEST_CASE(mismatch5);
|
||||||
TEST_CASE(mismatch6);
|
TEST_CASE(mismatch6);
|
||||||
TEST_CASE(mismatch7); // opendir()/closedir() on non-POSIX
|
|
||||||
|
|
||||||
TEST_CASE(mismatchSize);
|
TEST_CASE(mismatchSize);
|
||||||
|
|
||||||
|
@ -330,11 +329,6 @@ private:
|
||||||
TEST_CASE(close_function);
|
TEST_CASE(close_function);
|
||||||
TEST_CASE(fd_functions);
|
TEST_CASE(fd_functions);
|
||||||
|
|
||||||
TEST_CASE(opendir_function);
|
|
||||||
TEST_CASE(fdopendir_function);
|
|
||||||
TEST_CASE(closedir_function);
|
|
||||||
TEST_CASE(dir_functions);
|
|
||||||
|
|
||||||
TEST_CASE(pointer_to_pointer);
|
TEST_CASE(pointer_to_pointer);
|
||||||
TEST_CASE(dealloc_and_alloc_in_func);
|
TEST_CASE(dealloc_and_alloc_in_func);
|
||||||
|
|
||||||
|
@ -1495,33 +1489,6 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void mismatch7() {
|
|
||||||
Settings settings;
|
|
||||||
settings.standards.posix = false;
|
|
||||||
const char mycode1[]= "DIR *opendir(const char *name);\n"
|
|
||||||
"void closedir(DIR *dir) {\n"
|
|
||||||
" free(dir);\n"
|
|
||||||
"}\n"
|
|
||||||
"\n"
|
|
||||||
"void f(const char *dir) {\n"
|
|
||||||
" DIR *dirp;\n"
|
|
||||||
" if ((dirp = opendir(dir)) == NULL) return 0;\n"
|
|
||||||
" closedir(dirp);\n"
|
|
||||||
"}\n";
|
|
||||||
check(mycode1, &settings);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
settings.standards.posix = true;
|
|
||||||
check(mycode1, &settings);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
const char mycode2[]= "void f(const char *dir) {\n"
|
|
||||||
" DIR *dirp;\n"
|
|
||||||
" if ((dirp = opendir(dir)) == NULL) return 0;\n"
|
|
||||||
" free(dirp);\n"
|
|
||||||
"}\n";
|
|
||||||
check(mycode2, &settings);
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Mismatching allocation and deallocation: dirp\n", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void mismatchSize() {
|
void mismatchSize() {
|
||||||
check("void f(char *buf)\n"
|
check("void f(char *buf)\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
@ -3664,67 +3631,6 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:24]: (error) Resource leak: fd\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:24]: (error) Resource leak: fd\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void opendir_function() {
|
|
||||||
Settings settings;
|
|
||||||
settings.standards.posix = true;
|
|
||||||
check("void f()\n"
|
|
||||||
"{\n"
|
|
||||||
" DIR *f = opendir(\".\");\n"
|
|
||||||
"}", &settings);
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Resource leak: f\n", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void fdopendir_function() {
|
|
||||||
Settings settings;
|
|
||||||
settings.standards.posix = true;
|
|
||||||
check("void f(int fd)\n"
|
|
||||||
"{\n"
|
|
||||||
" DIR *f = fdopendir(fd);\n"
|
|
||||||
"}", &settings);
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Resource leak: f\n", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void closedir_function() {
|
|
||||||
Settings settings;
|
|
||||||
settings.standards.posix = true;
|
|
||||||
check("void f()\n"
|
|
||||||
"{\n"
|
|
||||||
" DIR *f = opendir(\".\");\n"
|
|
||||||
" closedir(f);\n"
|
|
||||||
"}", &settings);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
check("void f(int fd)\n"
|
|
||||||
"{\n"
|
|
||||||
" DIR *f = fdopendir(fd);\n"
|
|
||||||
" closedir(f);\n"
|
|
||||||
"}", &settings);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
check("void foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" DIR * f = opendir(dirname);\n"
|
|
||||||
" if (closedir(f));\n"
|
|
||||||
"}", &settings);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void dir_functions() {
|
|
||||||
Settings settings;
|
|
||||||
settings.standards.posix = true;
|
|
||||||
check("void f()\n"
|
|
||||||
"{\n"
|
|
||||||
" DIR *f = opendir(dir);\n"
|
|
||||||
" readdir(f);\n;"
|
|
||||||
" readdir_r(f, entry, res);\n;"
|
|
||||||
" rewinddir(f);\n;"
|
|
||||||
" telldir(f);\n;"
|
|
||||||
" seekdir(f, 2)\n;"
|
|
||||||
" scandir(f, namelist, filter, comp);\n;"
|
|
||||||
"}", &settings);
|
|
||||||
ASSERT_EQUALS("[test.cpp:10]: (error) Resource leak: f\n", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void file_functions() {
|
void file_functions() {
|
||||||
check("void f()\n"
|
check("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
Loading…
Reference in New Issue