From 5f548a4b6ccc51f613883e8fbb214295f1b8b719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 18 Jul 2021 10:31:52 +0200 Subject: [PATCH] misra; implement rule 8.9 --- addons/misra.py | 23 +++++++++++++++++++++++ addons/test/misra/misra-test.c | 3 +++ 2 files changed, 26 insertions(+) diff --git a/addons/misra.py b/addons/misra.py index 66cf2a507..764c2e8ef 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -1858,6 +1858,28 @@ class MisraChecker: if static_var and extern_var: self.reportError(extern_var.nameToken, 8, 8) + def misra_8_9(self, cfg): + variables = {} + for scope in cfg.scopes: + if scope.type != 'Function': + continue + variables_used_in_scope = [] + tok = scope.bodyStart + while tok != scope.bodyEnd: + if tok.variable and tok.variable.access == 'Global' and tok.variable.isStatic: + if tok.variable not in variables_used_in_scope: + variables_used_in_scope.append(tok.variable) + tok = tok.next + for var in variables_used_in_scope: + if var in variables: + variables[var] += 1 + else: + variables[var] = 1 + for var, count in variables.items(): + if count == 1: + self.reportError(var.nameToken, 8, 9) + + def misra_8_11(self, data): for var in data.variables: if var.isExtern and simpleMatch(var.nameToken.next, '[ ]') and var.nameToken.scope.type == 'Global': @@ -3579,6 +3601,7 @@ class MisraChecker: self.executeCheck(806, self.misra_8_6, dumpfile, cfg) self.executeCheck(807, self.misra_8_7, dumpfile, cfg) self.executeCheck(808, self.misra_8_8, cfg) + self.executeCheck(809, self.misra_8_9, cfg) self.executeCheck(811, self.misra_8_11, cfg) self.executeCheck(812, self.misra_8_12, cfg) if cfgNumber == 0: diff --git a/addons/test/misra/misra-test.c b/addons/test/misra/misra-test.c index 874cfbbf7..646f88b81 100644 --- a/addons/test/misra/misra-test.c +++ b/addons/test/misra/misra-test.c @@ -376,6 +376,9 @@ extern int16_t misra_8_4_count; // 8.4 static int32_t misra_8_8 = 123; extern int32_t misra_8_8; // 8.8 8.4 +static int32_t misra_8_9_i; // 8.9 +static int32_t misra_8_9_foo(void) { return misra_8_9_i++; } + extern int a811[]; // 8.11 8.4 enum misra_8_12_a { misra_a1 = 1, misra_a2 = 2, misra_a3, misra_a4 = 3 }; //8.12