From 880f496de29105614269ff032b62a040d0c8af34 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Fri, 21 Feb 2025 13:38:07 +0000 Subject: [PATCH 1/6] Fix #13648: False positive: Misra C 16.5: warn on default in macro --- addons/misra.py | 2 +- addons/test/misra/misra-test.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/misra.py b/addons/misra.py index bbf7e6c558e..2e160cd0bf5 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -3231,7 +3231,7 @@ def misra_16_5(self, data): for token in data.tokenlist: if token.str != 'default': continue - if token.previous and token.previous.str == '{': + if token.previous and (token.previous.str == '{' or token.previous.str == '='): continue tok2 = token while tok2: diff --git a/addons/test/misra/misra-test.c b/addons/test/misra/misra-test.c index 6e18e7610c5..b289b5c48de 100644 --- a/addons/test/misra/misra-test.c +++ b/addons/test/misra/misra-test.c @@ -2,6 +2,8 @@ // ~/cppcheck/cppcheck --dump misra/misra-test.h --std=c89 // ~/cppcheck/cppcheck --dump -DDUMMY --suppress=uninitvar --inline-suppr misra/misra-test.c --std=c89 --platform=unix64 && python3 ../misra.py -verify misra/misra-test.c.dump +#pragma ghs section rodata=default // no warning + #include "path\file.h" // 20.2 #include "file//.h" // 20.2 #include "file/*.h" // 20.2 From b8dc47a5252056f6f691033501f4ad9e7725ea17 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Fri, 21 Feb 2025 14:51:12 +0000 Subject: [PATCH 2/6] Fix CI --- addons/misra.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/misra.py b/addons/misra.py index 2e160cd0bf5..260874ab36d 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -3204,7 +3204,7 @@ def misra_16_3(self, rawTokens): if (prev is None) or (prev.str not in ':;{}'): state = STATE_NONE elif token.str == 'case' or token.str == 'default': - if state != STATE_OK: + if state != STATE_OK and state != STATE_NONE: self.reportError(token, 16, 3) state = STATE_OK From afa20fc131af0d162cac6996875a65134c6627fa Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Mon, 24 Feb 2025 15:25:03 +0000 Subject: [PATCH 3/6] Nits --- addons/misra.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index 260874ab36d..21231b42ff4 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -3203,8 +3203,8 @@ def misra_16_3(self, rawTokens): prev = prev.previous if (prev is None) or (prev.str not in ':;{}'): state = STATE_NONE - elif token.str == 'case' or token.str == 'default': - if state != STATE_OK and state != STATE_NONE: + elif token.str == 'case' or (token.str == 'default' and (tok.previous and tok.previous != '=')): + if state != STATE_OK: self.reportError(token, 16, 3) state = STATE_OK @@ -3231,7 +3231,7 @@ def misra_16_5(self, data): for token in data.tokenlist: if token.str != 'default': continue - if token.previous and (token.previous.str == '{' or token.previous.str == '='): + if token.previous and (token.previous.str == '{'): continue tok2 = token while tok2: From 3f2e9cbf161db0e5acd1015c58c3e617a2325082 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Mon, 24 Feb 2025 15:34:48 +0000 Subject: [PATCH 4/6] Nits --- addons/misra.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/misra.py b/addons/misra.py index 21231b42ff4..e715ae242fb 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -3203,7 +3203,7 @@ def misra_16_3(self, rawTokens): prev = prev.previous if (prev is None) or (prev.str not in ':;{}'): state = STATE_NONE - elif token.str == 'case' or (token.str == 'default' and (tok.previous and tok.previous != '=')): + elif token.str == 'case' or (token.str == 'default' and (token.previous and token.previous != '=')): if state != STATE_OK: self.reportError(token, 16, 3) state = STATE_OK From 4967004ac5baa1524b7288cf4279e5fc14de1f47 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Mon, 24 Feb 2025 16:30:04 +0000 Subject: [PATCH 5/6] Nits 3 --- addons/misra.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index e715ae242fb..4352421999e 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -3157,15 +3157,15 @@ def misra_16_3(self, rawTokens): STATE_OK = 2 # a case/default is allowed (we have seen 'break;'/'comment'/'{'/attribute) STATE_SWITCH = 3 # walking through switch statement scope - define = None + macro = None state = STATE_NONE end_switch_token = None # end '}' for the switch scope for token in rawTokens: - if simpleMatch(token, '# define'): - define = token - if define: - if token.linenr != define.linenr: - define = None + if simpleMatch(token, '# define') or simpleMatch(token, '# pragma'): + macro = token + if macro: + if token.linenr != macro.linenr: + macro = None else: continue @@ -3203,7 +3203,7 @@ def misra_16_3(self, rawTokens): prev = prev.previous if (prev is None) or (prev.str not in ':;{}'): state = STATE_NONE - elif token.str == 'case' or (token.str == 'default' and (token.previous and token.previous != '=')): + elif token.str == 'case' or token.str == 'default': if state != STATE_OK: self.reportError(token, 16, 3) state = STATE_OK From 61f7a6817211519851bf3213f0514e9d88e5b147 Mon Sep 17 00:00:00 2001 From: Oleksandr Labetskyi Date: Tue, 25 Feb 2025 10:24:20 +0000 Subject: [PATCH 6/6] Nits 4 --- addons/misra.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index 4352421999e..53e497dc2ad 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -3157,15 +3157,15 @@ def misra_16_3(self, rawTokens): STATE_OK = 2 # a case/default is allowed (we have seen 'break;'/'comment'/'{'/attribute) STATE_SWITCH = 3 # walking through switch statement scope - macro = None + directive = None state = STATE_NONE end_switch_token = None # end '}' for the switch scope for token in rawTokens: if simpleMatch(token, '# define') or simpleMatch(token, '# pragma'): - macro = token - if macro: - if token.linenr != macro.linenr: - macro = None + directive = token + if directive: + if token.linenr != directive.linenr: + directive = None else: continue