From bdd57e69131598ea925d277decca152d25bdfa8b Mon Sep 17 00:00:00 2001 From: PKEuS Date: Sat, 14 Nov 2015 12:07:00 +0100 Subject: [PATCH] Revert "Fix multi-threading by converting static member variables to instance variables" This reverts commit 598809a8342fcd27ea043bd890b428f0999098e2. The problem does not exist in practice and the theoretical issue will be fixed as soon as the check is rewritten to make use of Libraries. --- lib/checkobsolescentfunctions.cpp | 64 ++---------------------------- lib/checkobsolescentfunctions.h | 66 ++++++++++++++++++++++++++++--- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/lib/checkobsolescentfunctions.cpp b/lib/checkobsolescentfunctions.cpp index 4c041af47..8fec2e61c 100644 --- a/lib/checkobsolescentfunctions.cpp +++ b/lib/checkobsolescentfunctions.cpp @@ -25,6 +25,10 @@ //--------------------------------------------------------------------------- +std::map CheckObsoleteFunctions::_obsoleteStandardFunctions; +std::map CheckObsoleteFunctions::_obsoletePosixFunctions; +std::map CheckObsoleteFunctions::_obsoleteC99Functions; + // Register this check class (by creating a static instance of it) namespace { @@ -69,64 +73,4 @@ void CheckObsoleteFunctions::obsoleteFunctions() } } } - -void CheckObsoleteFunctions::initObsoleteFunctions() -{ - // Obsolete posix functions, which messages suggest only one alternative and doesn't contain additional information. - const struct { - const char* bad; - const char* good; - } posix_stdmsgs[] = { - {"bsd_signal", "sigaction"}, - {"gethostbyaddr", "getnameinfo"}, - {"gethostbyname", "getaddrinfo"}, - {"bcmp", "memcmp"}, - {"bzero", "memset"}, - {"ecvt", "sprintf"}, - {"fcvt", "sprintf"}, - {"gcvt", "sprintf"}, - {"getwd", "getcwd"}, - {"index", "strchr"}, // See #2334 (using the Qt Model/View function 'index') - {"rindex", "strrchr"}, - {"pthread_attr_getstackaddr", "pthread_attr_getstack"}, - {"pthread_attr_setstackaddr", "pthread_attr_setstack"}, - {"vfork", "fork"}, - {"wcswcs", "wcsstr"}, - {"rand_r", "rand"}, - {"utime", "utimensat"}, - {"asctime_r", "strftime"}, - {"ctime_r", "strftime"} - }; - - for (std::size_t i = 0; i < (sizeof(posix_stdmsgs) / sizeof(*posix_stdmsgs)); ++i) { - _obsoletePosixFunctions[posix_stdmsgs[i].bad] = "Obsolete function '" + std::string(posix_stdmsgs[i].bad) + "' called. It is recommended to use the function '" + posix_stdmsgs[i].good + "' instead."; - } - - _obsoletePosixFunctions["usleep"] = "Obsolete function 'usleep' called. It is recommended to use the 'nanosleep' or 'setitimer' function instead.\n" - "The obsolete function 'usleep' is called. POSIX.1-2001 declares usleep() function obsolete and POSIX.1-2008 removes it. It is recommended that new applications use the 'nanosleep' or 'setitimer' function."; - - _obsoletePosixFunctions["bcopy"] = "Obsolete function 'bcopy' called. It is recommended to use the 'memmove' or 'memcpy' function instead."; - - _obsoletePosixFunctions["ftime"] = "Obsolete function 'ftime' called. It is recommended to use time(), gettimeofday() or clock_gettime() instead."; - - _obsoletePosixFunctions["getcontext"] = "Obsolete function 'getcontext' called. Due to portability issues, applications are recommended to be rewritten to use POSIX threads."; - _obsoletePosixFunctions["makecontext"] = "Obsolete function 'makecontext' called. Due to portability issues, applications are recommended to be rewritten to use POSIX threads."; - _obsoletePosixFunctions["swapcontext"] = "Obsolete function 'swapcontext' called. Due to portability issues, applications are recommended to be rewritten to use POSIX threads."; - - _obsoletePosixFunctions["scalbln"] = "Obsolete function 'scalb' called. It is recommended to use 'scalbln', 'scalblnf' or 'scalblnl' instead."; - - _obsoletePosixFunctions["ualarm"] = "Obsolete function 'ualarm' called. It is recommended to use 'timer_create', 'timer_delete', 'timer_getoverrun', 'timer_gettime' or 'timer_settime' instead."; - - _obsoletePosixFunctions["tmpnam"] = "Obsolete function 'tmpnam' called. It is recommended to use 'tmpfile', 'mkstemp' or 'mkdtemp' instead."; - - _obsoletePosixFunctions["tmpnam_r"] = "Obsolete function 'tmpnam_r' called. It is recommended to use 'tmpfile', 'mkstemp' or 'mkdtemp' instead."; - - _obsoleteStandardFunctions["gets"] = "Obsolete function 'gets' called. It is recommended to use the function 'fgets' instead.\n" - "The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun if the input data exceeds the size of the buffer. It is recommended to use the function 'fgets' instead."; - _obsoleteC99Functions["alloca"] = "Obsolete function 'alloca' called. In C99 and later it is recommended to use a variable length array instead.\n" - "The obsolete function 'alloca' is called. In C99 and later it is recommended to use a variable length array or a dynamically allocated array instead. The function 'alloca' is dangerous for many reasons (http://stackoverflow.com/questions/1018853/why-is-alloca-not-considered-good-practice and http://linux.die.net/man/3/alloca)."; - _obsoleteC99Functions["asctime"] = "Obsolete function 'asctime' called. It is recommended to use the function 'strftime' instead."; - // ctime is obsolete - it's not threadsafe. but there is no good replacement. - //_obsoleteC99Functions["ctime"] = "Obsolete function 'ctime' called. It is recommended to use the function 'strftime' instead."; -} //--------------------------------------------------------------------------- diff --git a/lib/checkobsolescentfunctions.h b/lib/checkobsolescentfunctions.h index 4716c2949..a46085334 100644 --- a/lib/checkobsolescentfunctions.h +++ b/lib/checkobsolescentfunctions.h @@ -45,7 +45,6 @@ public: /** This constructor is used when running checks. */ CheckObsoleteFunctions(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) : Check(myName(), tokenizer, settings, errorLogger) { - initObsoleteFunctions(); } void runSimplifiedChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) { @@ -58,12 +57,69 @@ public: private: /* function name / error message */ - std::map _obsoleteStandardFunctions; - std::map _obsoletePosixFunctions; - std::map _obsoleteC99Functions; + static std::map _obsoleteStandardFunctions; + static std::map _obsoletePosixFunctions; + static std::map _obsoleteC99Functions; /** init obsolete functions list ' */ - void initObsoleteFunctions(); + void initObsoleteFunctions() { + // Obsolete posix functions, which messages suggest only one alternative and doesn't contain additional information. + const struct { + const char* bad; + const char* good; + } posix_stdmsgs[] = { + {"bsd_signal", "sigaction"}, + {"gethostbyaddr", "getnameinfo"}, + {"gethostbyname", "getaddrinfo"}, + {"bcmp", "memcmp"}, + {"bzero", "memset"}, + {"ecvt", "sprintf"}, + {"fcvt", "sprintf"}, + {"gcvt", "sprintf"}, + {"getwd", "getcwd"}, + {"index", "strchr"}, // See #2334 (using the Qt Model/View function 'index') + {"rindex", "strrchr"}, + {"pthread_attr_getstackaddr", "pthread_attr_getstack"}, + {"pthread_attr_setstackaddr", "pthread_attr_setstack"}, + {"vfork", "fork"}, + {"wcswcs", "wcsstr"}, + {"rand_r", "rand"}, + {"utime", "utimensat"}, + {"asctime_r", "strftime"}, + {"ctime_r", "strftime"} + }; + + for (std::size_t i = 0; i < (sizeof(posix_stdmsgs) / sizeof(*posix_stdmsgs)); ++i) { + _obsoletePosixFunctions[posix_stdmsgs[i].bad] = "Obsolete function '" + std::string(posix_stdmsgs[i].bad) + "' called. It is recommended to use the function '" + posix_stdmsgs[i].good + "' instead."; + } + + _obsoletePosixFunctions["usleep"] = "Obsolete function 'usleep' called. It is recommended to use the 'nanosleep' or 'setitimer' function instead.\n" + "The obsolete function 'usleep' is called. POSIX.1-2001 declares usleep() function obsolete and POSIX.1-2008 removes it. It is recommended that new applications use the 'nanosleep' or 'setitimer' function."; + + _obsoletePosixFunctions["bcopy"] = "Obsolete function 'bcopy' called. It is recommended to use the 'memmove' or 'memcpy' function instead."; + + _obsoletePosixFunctions["ftime"] = "Obsolete function 'ftime' called. It is recommended to use time(), gettimeofday() or clock_gettime() instead."; + + _obsoletePosixFunctions["getcontext"] = "Obsolete function 'getcontext' called. Due to portability issues, applications are recommended to be rewritten to use POSIX threads."; + _obsoletePosixFunctions["makecontext"] = "Obsolete function 'makecontext' called. Due to portability issues, applications are recommended to be rewritten to use POSIX threads."; + _obsoletePosixFunctions["swapcontext"] = "Obsolete function 'swapcontext' called. Due to portability issues, applications are recommended to be rewritten to use POSIX threads."; + + _obsoletePosixFunctions["scalbln"] = "Obsolete function 'scalb' called. It is recommended to use 'scalbln', 'scalblnf' or 'scalblnl' instead."; + + _obsoletePosixFunctions["ualarm"] = "Obsolete function 'ualarm' called. It is recommended to use 'timer_create', 'timer_delete', 'timer_getoverrun', 'timer_gettime' or 'timer_settime' instead."; + + _obsoletePosixFunctions["tmpnam"] = "Obsolete function 'tmpnam' called. It is recommended to use 'tmpfile', 'mkstemp' or 'mkdtemp' instead."; + + _obsoletePosixFunctions["tmpnam_r"] = "Obsolete function 'tmpnam_r' called. It is recommended to use 'tmpfile', 'mkstemp' or 'mkdtemp' instead."; + + _obsoleteStandardFunctions["gets"] = "Obsolete function 'gets' called. It is recommended to use the function 'fgets' instead.\n" + "The obsolete function 'gets' is called. With 'gets' you'll get a buffer overrun if the input data exceeds the size of the buffer. It is recommended to use the function 'fgets' instead."; + _obsoleteC99Functions["alloca"] = "Obsolete function 'alloca' called. In C99 and later it is recommended to use a variable length array instead.\n" + "The obsolete function 'alloca' is called. In C99 and later it is recommended to use a variable length array or a dynamically allocated array instead. The function 'alloca' is dangerous for many reasons (http://stackoverflow.com/questions/1018853/why-is-alloca-not-considered-good-practice and http://linux.die.net/man/3/alloca)."; + _obsoleteC99Functions["asctime"] = "Obsolete function 'asctime' called. It is recommended to use the function 'strftime' instead."; + // ctime is obsolete - it's not threadsafe. but there is no good replacement. + //_obsoleteC99Functions["ctime"] = "Obsolete function 'ctime' called. It is recommended to use the function 'strftime' instead."; + } void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { CheckObsoleteFunctions c(0, settings, errorLogger);