Fixed #11181 (cppcheckdata.py: handle exception when ctu-info file is missing)

This commit is contained in:
Daniel Marjamäki 2022-08-25 11:09:43 +02:00
parent 0d9bf03b5c
commit 514278e02b
1 changed files with 81 additions and 77 deletions

View File

@ -4443,92 +4443,96 @@ class MisraChecker:
def is_different_location(loc1, loc2): def is_different_location(loc1, loc2):
return loc1['file'] != loc2['file'] or loc1['line'] != loc2['line'] return loc1['file'] != loc2['file'] or loc1['line'] != loc2['line']
for filename in ctu_info_files: try:
for line in open(filename, 'rt'): for filename in ctu_info_files:
if not line.startswith('{'): for line in open(filename, 'rt'):
continue if not line.startswith('{'):
continue
s = json.loads(line) s = json.loads(line)
summary_type = s['summary'] summary_type = s['summary']
summary_data = s['data'] summary_data = s['data']
if summary_type == 'MisraTypedefInfo': if summary_type == 'MisraTypedefInfo':
for new_typedef_info in summary_data: for new_typedef_info in summary_data:
found = False found = False
for old_typedef_info in all_typedef_info: for old_typedef_info in all_typedef_info:
if old_typedef_info['name'] == new_typedef_info['name']: if old_typedef_info['name'] == new_typedef_info['name']:
found = True found = True
if is_different_location(old_typedef_info, new_typedef_info): if is_different_location(old_typedef_info, new_typedef_info):
self.reportError(Location(old_typedef_info), 5, 6) self.reportError(Location(old_typedef_info), 5, 6)
self.reportError(Location(new_typedef_info), 5, 6) self.reportError(Location(new_typedef_info), 5, 6)
else: else:
if new_typedef_info['used']: if new_typedef_info['used']:
old_typedef_info['used'] = True old_typedef_info['used'] = True
break break
if not found: if not found:
all_typedef_info.append(new_typedef_info) all_typedef_info.append(new_typedef_info)
if summary_type == 'MisraTagName': if summary_type == 'MisraTagName':
for new_tagname_info in summary_data: for new_tagname_info in summary_data:
found = False found = False
for old_tagname_info in all_tagname_info: for old_tagname_info in all_tagname_info:
if old_tagname_info['name'] == new_tagname_info['name']: if old_tagname_info['name'] == new_tagname_info['name']:
found = True found = True
if is_different_location(old_tagname_info, new_tagname_info): if is_different_location(old_tagname_info, new_tagname_info):
self.reportError(Location(old_tagname_info), 5, 7) self.reportError(Location(old_tagname_info), 5, 7)
self.reportError(Location(new_tagname_info), 5, 7) self.reportError(Location(new_tagname_info), 5, 7)
else: else:
if new_tagname_info['used']: if new_tagname_info['used']:
old_tagname_info['used'] = True old_tagname_info['used'] = True
break break
if not found: if not found:
all_tagname_info.append(new_tagname_info) all_tagname_info.append(new_tagname_info)
if summary_type == 'MisraMacro': if summary_type == 'MisraMacro':
for new_macro in summary_data: for new_macro in summary_data:
found = False found = False
for old_macro in all_macro_info: for old_macro in all_macro_info:
if old_macro['name'] == new_macro['name']: if old_macro['name'] == new_macro['name']:
found = True found = True
if new_macro['used']: if new_macro['used']:
old_macro['used'] = True old_macro['used'] = True
break break
if not found: if not found:
all_macro_info.append(new_macro) all_macro_info.append(new_macro)
if summary_type == 'MisraExternalIdentifiers': if summary_type == 'MisraExternalIdentifiers':
for s in summary_data: for s in summary_data:
is_declaration = s['decl'] is_declaration = s['decl']
if is_declaration: if is_declaration:
all_external_identifiers = all_external_identifiers_decl all_external_identifiers = all_external_identifiers_decl
else: else:
all_external_identifiers = all_external_identifiers_def all_external_identifiers = all_external_identifiers_def
name = s['name'] name = s['name']
if name in all_external_identifiers and is_different_location(s, all_external_identifiers[name]): if name in all_external_identifiers and is_different_location(s, all_external_identifiers[name]):
num = 5 if is_declaration else 6 num = 5 if is_declaration else 6
self.reportError(Location(s), 8, num) self.reportError(Location(s), 8, num)
self.reportError(Location(all_external_identifiers[name]), 8, num) self.reportError(Location(all_external_identifiers[name]), 8, num)
all_external_identifiers[name] = s all_external_identifiers[name] = s
if summary_type == 'MisraInternalIdentifiers': if summary_type == 'MisraInternalIdentifiers':
for s in summary_data: for s in summary_data:
if s['name'] in all_internal_identifiers: if s['name'] in all_internal_identifiers:
if not s['inlinefunc'] or s['file'] != all_internal_identifiers[s['name']]['file']: if not s['inlinefunc'] or s['file'] != all_internal_identifiers[s['name']]['file']:
self.reportError(Location(s), 5, 9) self.reportError(Location(s), 5, 9)
self.reportError(Location(all_internal_identifiers[s['name']]), 5, 9) self.reportError(Location(all_internal_identifiers[s['name']]), 5, 9)
all_internal_identifiers[s['name']] = s all_internal_identifiers[s['name']] = s
if summary_type == 'MisraLocalIdentifiers': if summary_type == 'MisraLocalIdentifiers':
for s in summary_data: for s in summary_data:
all_local_identifiers[s['name']] = s all_local_identifiers[s['name']] = s
if summary_type == 'MisraUsage': if summary_type == 'MisraUsage':
for s in summary_data: for s in summary_data:
if s['name'] in all_usage_files: if s['name'] in all_usage_files:
all_usage_files[s['name']].append(s['file']) all_usage_files[s['name']].append(s['file'])
else: else:
all_usage_files[s['name']] = [s['file']] all_usage_files[s['name']] = [s['file']]
except FileNotFoundError:
return
for ti in all_typedef_info: for ti in all_typedef_info:
if not ti['used']: if not ti['used']: