From 77d8b714eadbf6b9752838d95a7dc21a83c3a7ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 17 Jul 2021 21:24:53 +0200 Subject: [PATCH] misra; implement rule 8.6 --- addons/misra.py | 29 +++++++++++++++++++++------- addons/test/misra/misra-ctu-1-test.c | 4 ++++ addons/test/misra/misra-ctu-2-test.c | 4 ++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index f3125bf3e..9efd6ab41 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -1240,7 +1240,9 @@ class MisraChecker: internal_identifiers.append(identifier(var.nameToken)) else: names.append(var.nameToken.str) - external_identifiers.append(identifier(var.nameToken)) + i = identifier(var.nameToken) + i['decl'] = var.isExtern + external_identifiers.append(i) for func in cfg.functions: if func.tokenDef is None: @@ -1248,7 +1250,9 @@ class MisraChecker: if func.isStatic: internal_identifiers.append(identifier(func.tokenDef)) else: - external_identifiers.append(identifier(func.tokenDef)) + i = identifier(func.tokenDef) + i['decl'] = func.token is None + external_identifiers.append(i) cppcheckdata.reportSummary(dumpfile, 'MisraExternalIdentifiers', external_identifiers) cppcheckdata.reportSummary(dumpfile, 'MisraInternalIdentifiers', internal_identifiers) @@ -3605,7 +3609,8 @@ class MisraChecker: all_typedef_info = [] all_tagname_info = [] all_macro_info = [] - all_external_identifiers = {} + all_external_identifiers_decl = {} + all_external_identifiers_def = {} all_internal_identifiers = {} all_local_identifiers = {} @@ -3669,10 +3674,18 @@ class MisraChecker: if summary_type == 'MisraExternalIdentifiers': for s in summary_data: - if s['name'] in all_external_identifiers and is_different_location(s, all_external_identifiers[s['name']]): - self.reportError(Location(s), 8, 5) - self.reportError(Location(all_external_identifiers[s['name']]), 8, 5) - all_external_identifiers[s['name']] = s + is_declaration = s['decl'] + if is_declaration: + all_external_identifiers = all_external_identifiers_decl + else: + all_external_identifiers = all_external_identifiers_def + + name = s['name'] + if name in all_external_identifiers and is_different_location(s, all_external_identifiers[name]): + num = 5 if is_declaration else 6 + self.reportError(Location(s), 8, num) + self.reportError(Location(all_external_identifiers[name]), 8, num) + all_external_identifiers[name] = s if summary_type == 'MisraInternalIdentifiers': for s in summary_data: @@ -3697,6 +3710,8 @@ class MisraChecker: if not m['used']: self.reportError(Location(m), 2, 5) + all_external_identifiers = all_external_identifiers_decl + all_external_identifiers.update(all_external_identifiers_def) for name, external_identifier in all_external_identifiers.items(): internal_identifier = all_internal_identifiers.get(name) if internal_identifier: diff --git a/addons/test/misra/misra-ctu-1-test.c b/addons/test/misra/misra-ctu-1-test.c index 0e583ab68..9e539f8c3 100644 --- a/addons/test/misra/misra-ctu-1-test.c +++ b/addons/test/misra/misra-ctu-1-test.c @@ -33,3 +33,7 @@ static void misra_5_8_foo(void) {} // cppcheck-suppress misra-c2012-8.4 // cppcheck-suppress misra-c2012-8.5 extern int misra_8_5; + +// cppcheck-suppress misra-c2012-8.6 +int32_t misra_8_6 = 1; + diff --git a/addons/test/misra/misra-ctu-2-test.c b/addons/test/misra/misra-ctu-2-test.c index d98b07124..68d5c00c2 100644 --- a/addons/test/misra/misra-ctu-2-test.c +++ b/addons/test/misra/misra-ctu-2-test.c @@ -34,3 +34,7 @@ static void misra_5_8_foo(void) {} // cppcheck-suppress misra-c2012-8.4 // cppcheck-suppress misra-c2012-8.5 extern int misra_8_5; + +// cppcheck-suppress misra-c2012-8.6 +int32_t misra_8_6 = 2; +