diff --git a/cfg/posix.cfg b/cfg/posix.cfg index 682967fc2..6738096de 100644 --- a/cfg/posix.cfg +++ b/cfg/posix.cfg @@ -8,5 +8,11 @@ close socket + + + closedir + opendir + fdopendir + diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 940a576d9..6447fa832 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -179,11 +179,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getAllocationType(const Token *tok2, if (Token::simpleMatch(tok2, "popen (")) return Pipe; - if (settings1->standards.posix) { - if (Token::Match(tok2, "opendir|fdopendir (")) - return Dir; - } - // Does tok2 point on "g_malloc", "g_strdup", .. const int alloctype = settings1->library.alloc(tok2->str()); if (alloctype > 0) @@ -267,9 +262,6 @@ CheckMemoryLeak::AllocType CheckMemoryLeak::getDeallocationType(const Token *tok if (Token::Match(tok, "pclose ( %varid% )", varid)) return Pipe; - - if (Token::Match(tok, "closedir ( %varid% )", varid)) - return Dir; } // 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())) return Pipe; - if (Token::simpleMatch(tok, std::string("closedir ( " + varname + " )").c_str())) - return Dir; - if (Token::Match(tok, ("%type% ( " + varname + " )").c_str())) { int type = settings1->library.dealloc(tok->str()); if (type > 0) @@ -333,7 +322,6 @@ void CheckMemoryLeak::memoryLeak(const Token *tok, const std::string &varname, A if (alloctype == CheckMemoryLeak::File || alloctype == CheckMemoryLeak::Pipe || alloctype == CheckMemoryLeak::Fd || - alloctype == CheckMemoryLeak::Dir || alloctype == CheckMemoryLeak::OtherRes) resourceLeakError(tok, varname); else diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index 061798286..2c43ecc3c 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -91,7 +91,7 @@ public: } /** @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); diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 52b2dc3b3..46e517232 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -204,7 +204,6 @@ private: TEST_CASE(mismatch4); TEST_CASE(mismatch5); TEST_CASE(mismatch6); - TEST_CASE(mismatch7); // opendir()/closedir() on non-POSIX TEST_CASE(mismatchSize); @@ -330,11 +329,6 @@ private: TEST_CASE(close_function); 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(dealloc_and_alloc_in_func); @@ -1495,33 +1489,6 @@ private: 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() { check("void f(char *buf)\n" "{\n" @@ -3664,67 +3631,6 @@ private: 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() { check("void f()\n" "{\n"