From 598809a8342fcd27ea043bd890b428f0999098e2 Mon Sep 17 00:00:00 2001 From: Alexander Mai Date: Fri, 6 Nov 2015 22:49:02 +0100 Subject: [PATCH] Fix multi-threading by converting static member variables to instance variables --- 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 8fec2e61c..4c041af47 100644 --- a/lib/checkobsolescentfunctions.cpp +++ b/lib/checkobsolescentfunctions.cpp @@ -25,10 +25,6 @@ //--------------------------------------------------------------------------- -std::map CheckObsoleteFunctions::_obsoleteStandardFunctions; -std::map CheckObsoleteFunctions::_obsoletePosixFunctions; -std::map CheckObsoleteFunctions::_obsoleteC99Functions; - // Register this check class (by creating a static instance of it) namespace { @@ -73,4 +69,64 @@ 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 a46085334..4716c2949 100644 --- a/lib/checkobsolescentfunctions.h +++ b/lib/checkobsolescentfunctions.h @@ -45,6 +45,7 @@ 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) { @@ -57,69 +58,12 @@ public: private: /* function name / error message */ - static std::map _obsoleteStandardFunctions; - static std::map _obsoletePosixFunctions; - static std::map _obsoleteC99Functions; + std::map _obsoleteStandardFunctions; + std::map _obsoletePosixFunctions; + std::map _obsoleteC99Functions; /** init obsolete functions list ' */ - 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 initObsoleteFunctions(); void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const { CheckObsoleteFunctions c(0, settings, errorLogger);