MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / misra_20_12

Method misra_20_12

addons/misra.py:3844–3893  ·  view source on GitHub ↗
(self, cfg)

Source from the content-addressed store, hash-verified

3842 self.reportError(directive, 20, 11)
3843
3844 def misra_20_12(self, cfg):
3845 def _is_hash_hash_op(expansion_list, arg):
3846 return re.search(r'##[ ]*%s[^a-zA-Z0-9_]' % arg, expansion_list) or \
3847 re.search(r'[^a-zA-Z0-9_]%s[ ]*##' % arg, expansion_list)
3848
3849 def _is_other_op(expansion_list, arg):
3850 pos = expansion_list.find(arg)
3851 while pos >= 0:
3852 pos1 = pos - 1
3853 pos2 = pos + len(arg)
3854 pos = expansion_list.find(arg, pos2)
3855 if isalnum(expansion_list[pos1]) or expansion_list[pos1] == '_':
3856 continue
3857 if isalnum(expansion_list[pos2]) or expansion_list[pos2] == '_':
3858 continue
3859 while expansion_list[pos1] == ' ':
3860 pos1 = pos1 - 1
3861 if expansion_list[pos1] == '#':
3862 continue
3863 while expansion_list[pos2] == ' ':
3864 pos2 = pos2 + 1
3865 if expansion_list[pos2] == '#':
3866 continue
3867 return True
3868 return False
3869
3870 def _is_arg_macro_usage(directive, arg):
3871 for macro_usage in cfg.macro_usage:
3872 if macro_usage.file == directive.file and macro_usage.linenr == directive.linenr:
3873 for macro_usage_arg in cfg.macro_usage:
3874 if macro_usage_arg == macro_usage:
3875 continue
3876 if (macro_usage.usefile == macro_usage_arg.usefile and
3877 macro_usage.uselinenr == macro_usage_arg.uselinenr and
3878 macro_usage.usecolumn == macro_usage_arg.usecolumn):
3879 # TODO: check arg better
3880 return True
3881 return False
3882
3883 for directive in cfg.directives:
3884 define = Define(directive)
3885 expansion_list = '(%s)' % define.expansionList
3886 for arg in define.args:
3887 if not _is_hash_hash_op(expansion_list, arg):
3888 continue
3889 if not _is_other_op(expansion_list, arg):
3890 continue
3891 if _is_arg_macro_usage(directive, arg):
3892 self.reportError(directive, 20, 12)
3893 break
3894
3895 def misra_20_13(self, data):
3896 dir_pattern = re.compile(r'#[ ]*([^ (<]*)')

Callers

nothing calls this directly

Calls 2

reportErrorMethod · 0.95
DefineClass · 0.70

Tested by

no test coverage detected