Skip to content

Commit ea65c09

Browse files
authored
false positive: misra-c2012-8.4 (#6059)
1 parent 7efe35a commit ea65c09

3 files changed

Lines changed: 34 additions & 13 deletions

File tree

addons/misra.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,7 +2072,10 @@ def checkDefinitionArgumentsViolations(func, startCall, endCall):
20722072
rawTokensFollowingPtr[2].str == ')'):
20732073
self.reportError(var.nameToken, 8, 2)
20742074

2075-
2075+
def insert_in_dict(self, dict_name,key, value):
2076+
if key not in dict_name:
2077+
dict_name[key] = []
2078+
dict_name[key].append(value)
20762079
def misra_8_4(self, cfg):
20772080
for func in cfg.functions:
20782081
if func.isStatic:
@@ -2086,24 +2089,39 @@ def misra_8_4(self, cfg):
20862089
if func.tokenDef.str == 'main':
20872090
continue
20882091
self.reportError(func.tokenDef, 8, 4)
2089-
2090-
extern_vars = []
2091-
var_defs = []
2092-
2092+
extern_var_with_def = {}
2093+
extern_var_without_def = {}
20932094
for var in cfg.variables:
20942095
if not var.isGlobal:
20952096
continue
20962097
if var.isStatic:
20972098
continue
20982099
if var.nameToken is None:
20992100
continue
2100-
if var.isExtern:
2101-
extern_vars.append(var.nameToken.str)
2101+
tok = var.nameToken
2102+
if tok.next.str == ";":
2103+
if tok.next.isSplittedVarDeclEq or (tok.valueType and tok.valueType.type == "record"):
2104+
self.insert_in_dict(extern_var_with_def, tok.str, tok)
2105+
else:
2106+
self.insert_in_dict(extern_var_without_def, tok.str, tok)
21022107
else:
2103-
var_defs.append(var.nameToken)
2104-
for vartok in var_defs:
2105-
if vartok.str not in extern_vars:
2106-
self.reportError(vartok, 8, 4)
2108+
self.insert_in_dict(extern_var_without_def, var.nameToken.str, var.nameToken)
2109+
2110+
for var in extern_var_with_def:
2111+
if var not in extern_var_without_def:
2112+
for t in extern_var_with_def[var]:
2113+
self.reportError(t, 8, 4)
2114+
2115+
for var_str, var_tok in extern_var_without_def.items():
2116+
warn = True
2117+
if var_str not in extern_var_with_def:
2118+
for t in var_tok:
2119+
if t.variable.isExtern:
2120+
warn = False
2121+
break
2122+
if warn:
2123+
for t in var_tok:
2124+
self.reportError(t, 8, 4)
21072125

21082126
def misra_8_5(self, dumpfile, cfg):
21092127
self._save_ctu_summary_identifiers(dumpfile, cfg)

addons/test/misra/misra-ctu-2-test.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,8 @@ extern int misra_8_5;
4343
// cppcheck-suppress misra-c2012-8.4
4444
// cppcheck-suppress misra-c2012-8.6
4545
int32_t misra_8_6 = 2;
46-
// cppcheck-suppress misra-c2012-8.4
4746
int32_t misra_8_6_1;
4847
// cppcheck-suppress misra-c2012-8.7
49-
// cppcheck-suppress misra-c2012-8.4
5048
int32_t misra_8_6_1 = 2;
5149
// cppcheck-suppress misra-c2012-8.4
5250
// cppcheck-suppress misra-c2012-8.7

addons/test/misra/misra-test.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ uint8_t misra_8_4_buf2[24]; // 8.4
395395
typedef struct { uint16_t a; uint16_t b; } misra_8_4_struct;
396396
extern misra_8_4_struct bar[42];
397397
misra_8_4_struct bar[42]; // compliant
398+
extern uint16_t misra_8_4_speed = 6000u; //8.4
399+
uint8_t misra_8_4_pressure = 101u; //8.4
400+
int32_t misra_8_4_ext_val2;
401+
int32_t misra_8_4_ext_val2 = 3; // compliant
402+
int32_t misra_8_4_ext_val4; //8.4
398403

399404
static int32_t misra_8_8 = 123;
400405
extern int32_t misra_8_8; // 8.8

0 commit comments

Comments
 (0)