diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index b5558233206..0f5d4cec960 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -274,6 +274,8 @@ static bool isBasicForLoop(const Token* tok) void programMemoryParseCondition(ProgramMemory& pm, const Token* tok, const Token* endTok, const Settings* settings, bool then) { auto eval = [&](const Token* t) -> std::vector { + if (!t) + return std::vector{}; if (t->hasKnownIntValue()) return {t->values().front().intvalue}; MathLib::bigint result = 0; diff --git a/test/cli/fuzz-crash/crash-15d71125ba17344f02417a9d46443cdaa30aa17f b/test/cli/fuzz-crash/crash-15d71125ba17344f02417a9d46443cdaa30aa17f index a876152477b..5d268fdf158 100644 Binary files a/test/cli/fuzz-crash/crash-15d71125ba17344f02417a9d46443cdaa30aa17f and b/test/cli/fuzz-crash/crash-15d71125ba17344f02417a9d46443cdaa30aa17f differ diff --git a/test/cli/fuzz-crash/crash-26edfe9761d3b681c841dfe80398847dee332f83 b/test/cli/fuzz-crash/crash-26edfe9761d3b681c841dfe80398847dee332f83 index 37965deed0b..ca4faea1d2e 100644 Binary files a/test/cli/fuzz-crash/crash-26edfe9761d3b681c841dfe80398847dee332f83 and b/test/cli/fuzz-crash/crash-26edfe9761d3b681c841dfe80398847dee332f83 differ diff --git a/test/cli/fuzz-crash/crash-3ea64296c8518edb538e0047c3eba0792d5deeba b/test/cli/fuzz-crash/crash-3ea64296c8518edb538e0047c3eba0792d5deeba index f096de3bf78..a12e6966bd5 100644 Binary files a/test/cli/fuzz-crash/crash-3ea64296c8518edb538e0047c3eba0792d5deeba and b/test/cli/fuzz-crash/crash-3ea64296c8518edb538e0047c3eba0792d5deeba differ diff --git a/test/cli/fuzz-crash/crash-7ead2ccf9be8b03b2d9c8c82891f58081390a560 b/test/cli/fuzz-crash/crash-7ead2ccf9be8b03b2d9c8c82891f58081390a560 index 80a938891ac..0de3f6a49b3 100644 Binary files a/test/cli/fuzz-crash/crash-7ead2ccf9be8b03b2d9c8c82891f58081390a560 and b/test/cli/fuzz-crash/crash-7ead2ccf9be8b03b2d9c8c82891f58081390a560 differ diff --git a/test/cli/fuzz-crash/crash-8a24e81ac1d7627233a227e6cc156dd20d57b058 b/test/cli/fuzz-crash/crash-8a24e81ac1d7627233a227e6cc156dd20d57b058 index cfb3a566403..8810b86ac93 100644 --- a/test/cli/fuzz-crash/crash-8a24e81ac1d7627233a227e6cc156dd20d57b058 +++ b/test/cli/fuzz-crash/crash-8a24e81ac1d7627233a227e6cc156dd20d57b058 @@ -1,2 +1 @@ -#i~clude -sho main() -{ - std::veCtor items(2); - stdtryector::iterator iter; - for (iter -= items.begin(); i&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ter != items.end();) { - if (*iter == 2) { - iter = items.erase//(iter); - } else { - } - } -} +o n(){r<>items;t iter;for(&&){iter=items.g}} \ No newline at end of file diff --git a/test/cli/fuzz-crash/crash-e4a26f2d7d0a73836bf086f54e48204d8914b95a b/test/cli/fuzz-crash/crash-e4a26f2d7d0a73836bf086f54e48204d8914b95a index 89b9bf0f48b..ba39dbb8588 100644 Binary files a/test/cli/fuzz-crash/crash-e4a26f2d7d0a73836bf086f54e48204d8914b95a and b/test/cli/fuzz-crash/crash-e4a26f2d7d0a73836bf086f54e48204d8914b95a differ diff --git a/test/cli/fuzz_test.py b/test/cli/fuzz_test.py index 67a1e237fec..fe9b65d5278 100644 --- a/test/cli/fuzz_test.py +++ b/test/cli/fuzz_test.py @@ -11,7 +11,7 @@ def test_fuzz_crash(): fuzz_crash_dir = os.path.join(__script_dir, 'fuzz-crash') for f in os.listdir(fuzz_crash_dir): - ret, stdout, _ = cppcheck(['-q', '--enable=all', '--inconclusive', f], cwd=fuzz_crash_dir) + ret, stdout, _ = cppcheck(['-q', '--language=c++', '--enable=all', '--inconclusive', f], cwd=fuzz_crash_dir) if ret != 0: failures[f] = stdout @@ -27,7 +27,7 @@ def test_fuzz_timeout(): return for f in os.listdir(fuzz_timeout_dir): try: - ret, stdout, _ = cppcheck(['-q', '--enable=all', '--inconclusive', f], cwd=fuzz_timeout_dir, timeout=5) + ret, stdout, _ = cppcheck(['-q', '--language=c++', '--enable=all', '--inconclusive', f], cwd=fuzz_timeout_dir, timeout=5) except subprocess.TimeoutExpired: failures.append(f) diff --git a/test/cli/testutils.py b/test/cli/testutils.py index cef43267cae..22a646a224c 100644 --- a/test/cli/testutils.py +++ b/test/cli/testutils.py @@ -1,5 +1,6 @@ import logging import os +import signal import subprocess # Create Cppcheck project file @@ -78,7 +79,30 @@ def cppcheck(args, env=None, remove_checkers_report=True, cwd=None, cppcheck_exe logging.info(exe + ' ' + ' '.join(args)) p = subprocess.Popen([exe] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, cwd=cwd) - comm = p.communicate(timeout=timeout) + try: + comm = p.communicate(timeout=timeout) + return_code = p.returncode + p = None + except subprocess.TimeoutExpired: + import psutil + # terminate all the child processes + child_procs = psutil.Process(p.pid).children(recursive=True) + if len(child_procs) > 0: + for child in child_procs: + child.terminate() + try: + # call with timeout since it might be stuck + p.communicate(timeout=5) + p = None + except subprocess.TimeoutExpired: + pass + raise + finally: + if p: + # sending the signal to the process groups causes the parent Python process to terminate as well + #os.killpg(os.getpgid(p.pid), signal.SIGTERM) # Send the signal to all the process groups + p.terminate() + comm = p.communicate() stdout = comm[0].decode(encoding='utf-8', errors='ignore').replace('\r\n', '\n') stderr = comm[1].decode(encoding='utf-8', errors='ignore').replace('\r\n', '\n') if remove_checkers_report: @@ -95,7 +119,7 @@ def cppcheck(args, env=None, remove_checkers_report=True, cwd=None, cppcheck_exe stderr = '' elif stderr[pos - 1] == '\n': stderr = stderr[:pos] - return p.returncode, stdout, stderr + return return_code, stdout, stderr def assert_cppcheck(args, ec_exp=None, out_exp=None, err_exp=None, env=None):