diff --git a/addons/misra.py b/addons/misra.py index 1fdc1f98f..66cf2a507 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -1835,6 +1835,29 @@ class MisraChecker: def misra_8_7(self, dumpfile, cfg): self._save_ctu_summary_usage(dumpfile, cfg) + def misra_8_8(self, cfg): + vars = {} + for var in cfg.variables: + if var.access != 'Global': + continue + if var.nameToken is None: + continue + varname = var.nameToken.str + if varname in vars: + vars[varname].append(var) + else: + vars[varname] = [var] + for varname, varlist in vars.items(): + static_var = None + extern_var = None + for var in varlist: + if var.isStatic: + static_var = var + elif var.isExtern: + extern_var = var + if static_var and extern_var: + self.reportError(extern_var.nameToken, 8, 8) + 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': @@ -3555,6 +3578,7 @@ class MisraChecker: self.executeCheck(805, self.misra_8_5, dumpfile, cfg) 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(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 b0875eebb..874cfbbf7 100644 --- a/addons/test/misra/misra-test.c +++ b/addons/test/misra/misra-test.c @@ -373,6 +373,9 @@ void misra_8_4_foo(void) {} // 8.4 static void misra_8_4_bar(void) {} // Declared in header 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 + 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