Skip to content

Commit 388b7a0

Browse files
committed
misra; implemented rule 20.12
1 parent 6e3ce73 commit 388b7a0

3 files changed

Lines changed: 64 additions & 2 deletions

File tree

addons/cppcheckdata.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,21 @@ class MacroUsage:
8181
file = None
8282
linenr = None
8383
column = None
84+
usefile = None
85+
uselinenr = None
86+
usecolumn = None
8487

8588
def __init__(self, element):
8689
self.name = element.get('name')
8790
_load_location(self, element)
91+
self.usefile = element.get('usefile')
92+
self.useline = element.get('useline')
93+
self.usecolumn = element.get('usecolumn')
8894

8995
def __repr__(self):
90-
attrs = ["name", "file", "linenr", "column"]
96+
attrs = ["name", "file", "linenr", "column", "usefile", "useline", "usecolumn"]
9197
return "{}({})".format(
92-
"Directive",
98+
"MacroUsage",
9399
", ".join(("{}={}".format(a, repr(getattr(self, a))) for a in attrs))
94100
)
95101

addons/misra.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3239,6 +3239,57 @@ def misra_20_11(self, cfg):
32393239
if res:
32403240
self.reportError(directive, 20, 11)
32413241

3242+
def misra_20_12(self, cfg):
3243+
def _is_hash_hash_op(expansion_list, arg):
3244+
return re.search(r'##[ ]*%s[^a-zA-Z0-9_]' % arg, expansion_list) or \
3245+
re.search(r'[^a-zA-Z0-9_]%s[ ]*##' % arg, expansion_list)
3246+
3247+
def _is_other_op(expansion_list, arg):
3248+
pos = expansion_list.find(arg)
3249+
while pos >= 0:
3250+
pos1 = pos - 1
3251+
pos2 = pos + len(arg)
3252+
pos = expansion_list.find(arg, pos2)
3253+
if isalnum(expansion_list[pos1]) or expansion_list[pos1] == '_':
3254+
continue
3255+
if isalnum(expansion_list[pos2]) or expansion_list[pos2] == '_':
3256+
continue
3257+
while expansion_list[pos1] == ' ':
3258+
pos1 = pos1 - 1
3259+
if expansion_list[pos1] == '#':
3260+
continue
3261+
while expansion_list[pos2] == ' ':
3262+
pos2 = pos2 + 1
3263+
if expansion_list[pos2] == '#':
3264+
continue
3265+
return True
3266+
return False
3267+
3268+
def _is_arg_macro_usage(directive, arg):
3269+
for macro_usage in cfg.macro_usage:
3270+
if macro_usage.file == directive.file and macro_usage.linenr == directive.linenr:
3271+
for macro_usage_arg in cfg.macro_usage:
3272+
if macro_usage_arg == macro_usage:
3273+
continue
3274+
if (macro_usage.usefile == macro_usage_arg.usefile and
3275+
macro_usage.uselinenr == macro_usage_arg.uselinenr and
3276+
macro_usage.usecolumn == macro_usage_arg.usecolumn):
3277+
# TODO: check arg better
3278+
return True
3279+
return False
3280+
3281+
for directive in cfg.directives:
3282+
define = Define(directive)
3283+
expansion_list = '(%s)' % define.expansionList
3284+
for arg in define.args:
3285+
if not _is_hash_hash_op(expansion_list, arg):
3286+
continue
3287+
if not _is_other_op(expansion_list, arg):
3288+
continue
3289+
if _is_arg_macro_usage(directive, arg):
3290+
self.reportError(directive, 20, 12)
3291+
break
3292+
32423293
def misra_20_13(self, data):
32433294
dir_pattern = re.compile(r'#[ ]*([^ (<]*)')
32443295
for directive in data.directives:
@@ -3913,6 +3964,7 @@ def fillVerifyExpected(verify_expected, tok):
39133964
self.executeCheck(2009, self.misra_20_9, cfg)
39143965
self.executeCheck(2010, self.misra_20_10, cfg)
39153966
self.executeCheck(2011, self.misra_20_11, cfg)
3967+
self.executeCheck(2012, self.misra_20_12, cfg)
39163968
self.executeCheck(2013, self.misra_20_13, cfg)
39173969
self.executeCheck(2014, self.misra_20_14, cfg)
39183970
self.executeCheck(2101, self.misra_21_1, cfg)

addons/test/misra/misra-test.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,10 @@ struct { int a; } struct_20_7_s;
15711571

15721572
#define M_20_11(a) # a ## 1 // 20.11 20.10
15731573

1574+
#define M_20_12_AA 0xffff
1575+
#define M_20_12_BB(x) (x) + wow ## x // 20.12 20.10
1576+
misra_20_12 = M_20_12_BB(M_20_12_AA);
1577+
15741578
#else1 // 20.13
15751579

15761580
#ifdef A

0 commit comments

Comments
 (0)