misra; implemented rule 20.12
This commit is contained in:
parent
6e3ce737ba
commit
388b7a0fae
|
@ -81,15 +81,21 @@ class MacroUsage:
|
||||||
file = None
|
file = None
|
||||||
linenr = None
|
linenr = None
|
||||||
column = None
|
column = None
|
||||||
|
usefile = None
|
||||||
|
uselinenr = None
|
||||||
|
usecolumn = None
|
||||||
|
|
||||||
def __init__(self, element):
|
def __init__(self, element):
|
||||||
self.name = element.get('name')
|
self.name = element.get('name')
|
||||||
_load_location(self, element)
|
_load_location(self, element)
|
||||||
|
self.usefile = element.get('usefile')
|
||||||
|
self.useline = element.get('useline')
|
||||||
|
self.usecolumn = element.get('usecolumn')
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
attrs = ["name", "file", "linenr", "column"]
|
attrs = ["name", "file", "linenr", "column", "usefile", "useline", "usecolumn"]
|
||||||
return "{}({})".format(
|
return "{}({})".format(
|
||||||
"Directive",
|
"MacroUsage",
|
||||||
", ".join(("{}={}".format(a, repr(getattr(self, a))) for a in attrs))
|
", ".join(("{}={}".format(a, repr(getattr(self, a))) for a in attrs))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3239,6 +3239,57 @@ class MisraChecker:
|
||||||
if res:
|
if res:
|
||||||
self.reportError(directive, 20, 11)
|
self.reportError(directive, 20, 11)
|
||||||
|
|
||||||
|
def misra_20_12(self, cfg):
|
||||||
|
def _is_hash_hash_op(expansion_list, arg):
|
||||||
|
return re.search(r'##[ ]*%s[^a-zA-Z0-9_]' % arg, expansion_list) or \
|
||||||
|
re.search(r'[^a-zA-Z0-9_]%s[ ]*##' % arg, expansion_list)
|
||||||
|
|
||||||
|
def _is_other_op(expansion_list, arg):
|
||||||
|
pos = expansion_list.find(arg)
|
||||||
|
while pos >= 0:
|
||||||
|
pos1 = pos - 1
|
||||||
|
pos2 = pos + len(arg)
|
||||||
|
pos = expansion_list.find(arg, pos2)
|
||||||
|
if isalnum(expansion_list[pos1]) or expansion_list[pos1] == '_':
|
||||||
|
continue
|
||||||
|
if isalnum(expansion_list[pos2]) or expansion_list[pos2] == '_':
|
||||||
|
continue
|
||||||
|
while expansion_list[pos1] == ' ':
|
||||||
|
pos1 = pos1 - 1
|
||||||
|
if expansion_list[pos1] == '#':
|
||||||
|
continue
|
||||||
|
while expansion_list[pos2] == ' ':
|
||||||
|
pos2 = pos2 + 1
|
||||||
|
if expansion_list[pos2] == '#':
|
||||||
|
continue
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _is_arg_macro_usage(directive, arg):
|
||||||
|
for macro_usage in cfg.macro_usage:
|
||||||
|
if macro_usage.file == directive.file and macro_usage.linenr == directive.linenr:
|
||||||
|
for macro_usage_arg in cfg.macro_usage:
|
||||||
|
if macro_usage_arg == macro_usage:
|
||||||
|
continue
|
||||||
|
if (macro_usage.usefile == macro_usage_arg.usefile and
|
||||||
|
macro_usage.uselinenr == macro_usage_arg.uselinenr and
|
||||||
|
macro_usage.usecolumn == macro_usage_arg.usecolumn):
|
||||||
|
# TODO: check arg better
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
for directive in cfg.directives:
|
||||||
|
define = Define(directive)
|
||||||
|
expansion_list = '(%s)' % define.expansionList
|
||||||
|
for arg in define.args:
|
||||||
|
if not _is_hash_hash_op(expansion_list, arg):
|
||||||
|
continue
|
||||||
|
if not _is_other_op(expansion_list, arg):
|
||||||
|
continue
|
||||||
|
if _is_arg_macro_usage(directive, arg):
|
||||||
|
self.reportError(directive, 20, 12)
|
||||||
|
break
|
||||||
|
|
||||||
def misra_20_13(self, data):
|
def misra_20_13(self, data):
|
||||||
dir_pattern = re.compile(r'#[ ]*([^ (<]*)')
|
dir_pattern = re.compile(r'#[ ]*([^ (<]*)')
|
||||||
for directive in data.directives:
|
for directive in data.directives:
|
||||||
|
@ -3913,6 +3964,7 @@ class MisraChecker:
|
||||||
self.executeCheck(2009, self.misra_20_9, cfg)
|
self.executeCheck(2009, self.misra_20_9, cfg)
|
||||||
self.executeCheck(2010, self.misra_20_10, cfg)
|
self.executeCheck(2010, self.misra_20_10, cfg)
|
||||||
self.executeCheck(2011, self.misra_20_11, cfg)
|
self.executeCheck(2011, self.misra_20_11, cfg)
|
||||||
|
self.executeCheck(2012, self.misra_20_12, cfg)
|
||||||
self.executeCheck(2013, self.misra_20_13, cfg)
|
self.executeCheck(2013, self.misra_20_13, cfg)
|
||||||
self.executeCheck(2014, self.misra_20_14, cfg)
|
self.executeCheck(2014, self.misra_20_14, cfg)
|
||||||
self.executeCheck(2101, self.misra_21_1, cfg)
|
self.executeCheck(2101, self.misra_21_1, cfg)
|
||||||
|
|
|
@ -1571,6 +1571,10 @@ struct { int a; } struct_20_7_s;
|
||||||
|
|
||||||
#define M_20_11(a) # a ## 1 // 20.11 20.10
|
#define M_20_11(a) # a ## 1 // 20.11 20.10
|
||||||
|
|
||||||
|
#define M_20_12_AA 0xffff
|
||||||
|
#define M_20_12_BB(x) (x) + wow ## x // 20.12 20.10
|
||||||
|
misra_20_12 = M_20_12_BB(M_20_12_AA);
|
||||||
|
|
||||||
#else1 // 20.13
|
#else1 // 20.13
|
||||||
|
|
||||||
#ifdef A
|
#ifdef A
|
||||||
|
|
Loading…
Reference in New Issue