(self, cfg)
| 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'#[ ]*([^ (<]*)') |
nothing calls this directly
no test coverage detected