From 1eaa93de9f3068748f7a04b42ea28d13183735b5 Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Thu, 9 Mar 2017 09:57:56 +0300 Subject: [PATCH] Eliminate 'non-reentrant function strtok called' cppcheck warning (POSIX) * tests/test_cpp.cc [(MSWIN32 && !__MINGW32__ || MSWINCE) && !NO_WINMAIN_ENTRY] (WinMain): Manually inline strtok(); add comment. --- tests/test_cpp.cc | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/test_cpp.cc b/tests/test_cpp.cc index 3d6be9a..902a824 100644 --- a/tests/test_cpp.cc +++ b/tests/test_cpp.cc @@ -219,8 +219,34 @@ void* Undisguise( GC_word i ) { # endif if (cmd != 0) for (argc = 1; argc < (int)(sizeof(argv) / sizeof(argv[0])); argc++) { - argv[ argc ] = strtok( argc == 1 ? cmd : 0, " \t" ); - if (0 == argv[ argc ]) break;} + // Parse the command-line string. Non-reentrant strtok() is not used + // to avoid complains of static analysis tools. (And, strtok_r() is + // not available on some platforms.) The code is equivalent to: + // if (!(argv[argc] = strtok(argc == 1 ? cmd : 0, " \t"))) break; + if (NULL == cmd) { + argv[argc] = NULL; + break; + } + argv[argc] = cmd; + for (; *cmd != '\0'; cmd++) { + if (*cmd != ' ' && *cmd != '\t') + break; + } + if ('\0' == *cmd) { + argv[argc] = NULL; + break; + } + argv[argc] = cmd; + while (*(++cmd) != '\0') { + if (*cmd == ' ' || *cmd == '\t') + break; + } + if (*cmd != '\0') { + *(cmd++) = '\0'; + } else { + cmd = NULL; + } + } #elif defined(MACOS) int main() { char* argv_[] = {"test_cpp", "10"}; // MacOS doesn't have a commandline -- 2.7.4