From 3e038370792204272cb40d0f98cb3a6a58140d7b Mon Sep 17 00:00:00 2001 From: Swasti Shrivastava Date: Tue, 8 May 2018 16:09:28 +0530 Subject: [PATCH 1/3] Added rule 5.2 --- addons/misra.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/addons/misra.py b/addons/misra.py index 27ebe659bb3..8693809cd25 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -424,6 +424,46 @@ def misra_5_1(data): if token.isName and len(token.str) > 31: reportError(token, 5, 1) +def misra_5_2(data): + scopeVars = {} + for var in data.variables: + if var.nameToken.scope not in scopeVars: + scopeVars.setdefault(var.nameToken.scope, {})["varlist"] = [] + scopeVars.setdefault(var.nameToken.scope, {})["scopelist"] = [] + scopeVars[var.nameToken.scope]["varlist"].append(var) + for scope in data.scopes: + if scope.nestedIn and scope.className: + if scope.nestedIn not in scopeVars: + print "in loop" + scopeVars.setdefault(scope.nestedIn, {})["varlist"] = [] + scopeVars.setdefault(scope.nestedIn, {})["scopelist"] = [] + scopeVars[scope.nestedIn]["scopelist"].append(scope) + for scope in scopeVars: + if len(scopeVars[scope]["varlist"]) <= 1: + continue + for i, variable1 in enumerate(scopeVars[scope]["varlist"]): + for j, variable2 in enumerate(scopeVars[scope]["varlist"][i + 1:]): + if (variable1.nameToken.str[:31] == variable2.nameToken.str[:31] and + variable1.Id != variable2.Id): + if int(variable1.nameToken.linenr) > int(variable2.nameToken.linenr): + reportError(variable1.nameToken, 5, 2) + else: + reportError(variable2.nameToken, 5, 2) + for innerscope in scopeVars[scope]["scopelist"]: + if (variable1.nameToken.str[:31] == innerscope.className[:31]): + if int(variable1.nameToken.linenr) > int(innerscope.bodyStart.linenr): + reportError(variable1.nameToken, 5, 2) + else: + reportError(innerscope.bodyStart, 5, 2) + if len(scopeVars[scope]["scopelist"]) <= 1: + continue + for i, scopename1 in enumerate(scopeVars[scope]["scopelist"]): + for j, scopename2 in enumerate(scopeVars[scope]["scopelist"][i + 1:]): + if (scopename1.className[:31] == scopename2.className[:31]): + if int(scopename1.bodyStart.linenr) > int(scopename2.bodyStart.linenr): + reportError(scopename1.bodyStart, 5, 2) + else: + reportError(scopename2.bodyStart, 5, 2) def misra_5_3(data): scopeVars = {} @@ -1420,6 +1460,7 @@ def generateTable(): misra_3_1(data.rawTokens) misra_4_1(data.rawTokens) misra_5_1(cfg) + misra_5_2(cfg) misra_5_3(cfg) misra_5_4(cfg) misra_5_5(cfg) From 43789bc12883172a12a804b8269ce1be1494fffe Mon Sep 17 00:00:00 2001 From: Swasti Shrivastava Date: Tue, 8 May 2018 16:41:35 +0530 Subject: [PATCH 2/3] updated 5.2 request-checks: true --- addons/misra.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index 8693809cd25..13d8ba262ae 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -442,7 +442,7 @@ def misra_5_2(data): if len(scopeVars[scope]["varlist"]) <= 1: continue for i, variable1 in enumerate(scopeVars[scope]["varlist"]): - for j, variable2 in enumerate(scopeVars[scope]["varlist"][i + 1:]): + for variable2 in scopeVars[scope]["varlist"][i + 1:]: if (variable1.nameToken.str[:31] == variable2.nameToken.str[:31] and variable1.Id != variable2.Id): if int(variable1.nameToken.linenr) > int(variable2.nameToken.linenr): @@ -458,7 +458,7 @@ def misra_5_2(data): if len(scopeVars[scope]["scopelist"]) <= 1: continue for i, scopename1 in enumerate(scopeVars[scope]["scopelist"]): - for j, scopename2 in enumerate(scopeVars[scope]["scopelist"][i + 1:]): + for scopename2 in scopeVars[scope]["scopelist"][i + 1:]: if (scopename1.className[:31] == scopename2.className[:31]): if int(scopename1.bodyStart.linenr) > int(scopename2.bodyStart.linenr): reportError(scopename1.bodyStart, 5, 2) From d0cf2c2de78b10015070d563530c2ec51e519348 Mon Sep 17 00:00:00 2001 From: Swasti Shrivastava Date: Tue, 8 May 2018 19:33:40 +0530 Subject: [PATCH 3/3] Updated test suite for Rule 5.2 --- addons/misra.py | 3 ++- addons/test/misra-test.c | 40 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/addons/misra.py b/addons/misra.py index 13d8ba262ae..c9d4fc4bdf4 100755 --- a/addons/misra.py +++ b/addons/misra.py @@ -434,7 +434,6 @@ def misra_5_2(data): for scope in data.scopes: if scope.nestedIn and scope.className: if scope.nestedIn not in scopeVars: - print "in loop" scopeVars.setdefault(scope.nestedIn, {})["varlist"] = [] scopeVars.setdefault(scope.nestedIn, {})["scopelist"] = [] scopeVars[scope.nestedIn]["scopelist"].append(scope) @@ -443,6 +442,8 @@ def misra_5_2(data): continue for i, variable1 in enumerate(scopeVars[scope]["varlist"]): for variable2 in scopeVars[scope]["varlist"][i + 1:]: + if variable1.isArgument and variable2.isArgument: + continue if (variable1.nameToken.str[:31] == variable2.nameToken.str[:31] and variable1.Id != variable2.Id): if int(variable1.nameToken.linenr) > int(variable2.nameToken.linenr): diff --git a/addons/test/misra-test.c b/addons/test/misra-test.c index 8dce8f32249..e962de6b74b 100644 --- a/addons/test/misra-test.c +++ b/addons/test/misra-test.c @@ -14,12 +14,48 @@ typedef unsigned long long u64; //// 3.1 +extern int n01_var_hides_var____________________________________________63x; +static int n01_var_hides_var____________________________________________63y;//5.2 +static int n02_function_hides_var_______________________________________63x; +void n02_function_hides_var_______________________________________63y(void) {}//5.2 +void foo(void) +{ + int i; + switch(f1()) + { + case 1: + { + do + { + for(i = 0; i < 10; i++) + { + if(f3()) + { + int + n03_var_hides_var____________________________________________63x; + int + n03_var_hides_var____________________________________________63y;//5.2 + } + } + } while(f2()); + } + } +} + +union n06_field_hides_field________________________________________63x { +int n04_field_hides_field________________________________________63x; +int n04_field_hides_field________________________________________63y;//5.2 +}; +struct n06_field_hides_field________________________________________63y { //5.2 +int n05_field_hides_field________________________________________63x; +int n05_field_hides_field________________________________________63y;//5.2 +}; const char *s41_1 = "\x41g"; // 4.1 const char *s41_2 = "\x41\x42"; void misra_5_1() { int a123456789012345678901234567890; // no-warning - int a1234567890123456789012345678901; // 5.1 + int a1234567890123456789012345678901; // 5.1 ,5.2 } void misra_5_3() { @@ -41,7 +77,7 @@ void misra_7_1() { void misra_7_3() { int x = 12l; // 7.3 - int x = 12lu; // 7.3 + int x = 12lu; // 7.3, 5.2 } extern int a811[]; // 8.11