@@ -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 )
0 commit comments