From 4b873ed573ed935c6c8f57e974afbc776b4761c4 Mon Sep 17 00:00:00 2001 From: Swasti Shrivastava <37058682+swasti16@users.noreply.github.com> Date: Mon, 14 May 2018 16:39:38 +0530 Subject: [PATCH] Rule 5.3 modified along with test suite (#1227) * Added rule 5.2 * updated 5.2 request-checks: true * Added rule 5.3 * Changed rule 5.4, 5.5 * Updated test suite for Rule 5.2 * Changes in Rule 5.4 and 5.5 * Change in function name in test suite and removed type from class token in cppcheck * Changed the name of function in misra-test.c * Modified rule 5.3 * Modified misra-test.c for rule 5.3 --- addons/misra.py | 44 +++++++++++++++++++++++++++++----------- addons/test/misra-test.c | 31 +++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index 88714a11c..468f18b5f 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -467,36 +467,56 @@ def misra_5_2(data): reportError(scopename2.bodyStart, 5, 2) def misra_5_3(data): + enum = [] scopeVars = {} for var in data.variables: - if var.isArgument: - # TODO - continue if var.nameToken.scope not in scopeVars: scopeVars[var.nameToken.scope] = [] scopeVars[var.nameToken.scope].append(var) - for innerScope in data.scopes: - if innerScope.type == 'Global': + if innerScope.type == "Enum": + enum_token = innerScope.bodyStart.next + while enum_token != innerScope.bodyEnd: + if enum_token.values and enum_token.isName: + enum.append(enum_token.str) + enum_token = enum_token.next continue if innerScope not in scopeVars: continue + if innerScope.type == "Global": + continue for innerVar in scopeVars[innerScope]: outerScope = innerScope.nestedIn while outerScope: if outerScope not in scopeVars: outerScope = outerScope.nestedIn continue - found = False for outerVar in scopeVars[outerScope]: - if innerVar.nameToken.str == outerVar.nameToken.str: - found = True - break - if found: - reportError(innerVar.nameToken, 5, 3) - break + if innerVar.nameToken.str[:31] == outerVar.nameToken.str[:31]: + if outerVar.isArgument and outerScope.type == "Global" and not innerVar.isArgument: + continue + if int(innerVar.nameToken.linenr) > int(outerVar.nameToken.linenr): + reportError(innerVar.nameToken, 5, 3) + else: + reportError(outerVar.nameToken, 5, 3) outerScope = outerScope.nestedIn + for scope in data.scopes: + if (scope.className and innerVar.nameToken.str[:31] == scope.className[:31]): + if int(innerVar.nameToken.linenr) > int(scope.bodyStart.linenr): + reportError(innerVar.nameToken, 5, 3) + else: + reportError(scope.bodyStart, 5, 3) + for e in enum: + if scope.className and innerVar.nameToken.str[:31] == e[:31]: + if int(innerVar.nameToken.linenr) > int(innerScope.bodyStart.linenr): + reportError(innerVar.nameToken, 5, 3) + else: + reportError(innerScope.bodyStart, 5, 3) + for e in enum: + for scope in data.scopes: + if (scope.className and scope.className[:31] == e[:31]): + reportError(scope.bodyStart, 5, 3) def misra_5_4(data): macro = {} diff --git a/addons/test/misra-test.c b/addons/test/misra-test.c index ae26a6196..ddbbf34d5 100644 --- a/addons/test/misra-test.c +++ b/addons/test/misra-test.c @@ -58,12 +58,33 @@ void misra_5_1() { int a1234567890123456789012345678901; // 5.1 ,5.2 } -void misra_5_3() { - u8 x=1; - if (y!=0) { - u8 x=2; // 5.3 - } else {} +extern int misra_5_3_var_hides_var______31x; +void misra_5_3_var_hides_function_31x (void) {} +enum misra_5_3_Enum { +misra_5_3_var_hidesenumconst_31x = 2,misra_5_3_enum_hidesfunction_31x = 5 +}; +void misra_5_3_func1(void) +{ + int misra_5_3_var_hides_var______31y; //5.3 + int misra_5_3_var_hides_function_31y; //5.3 + int misra_5_3_var_hidesenumconst_31y; //5.3 + switch(misra_5_3_func2()) + { + case 1: + { + do + { + int misra_5_3_var_hides_var_1____31x; + if(misra_5_3_func3()) + { + int misra_5_3_var_hides_var_1____31y = 1; //5.3 + } + } while(misra_5_3_func2()); + } + } } +void misra_5_3_enum_hidesfunction_31y(void) {} //5.3 + #define misra_5_4_macro_hides_macro__31x 1 #define misra_5_4_param_hides_macro__31x 1