donate-cpu-server.py: added `pkgs` query parameter to `check_library-*`, `incomplete_var-*` and `unknown_macro-*` reports (#5471)

This also fixes the missing results for `;` and filters out outdated
results.
This commit is contained in:
Oliver Stöneberg 2023-09-21 15:25:18 +02:00 committed by GitHub
parent dc59543348
commit 6fcf11b831
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 32 additions and 17 deletions

View File

@ -26,7 +26,7 @@ from urllib.parse import urlparse
# Version scheme (MAJOR.MINOR.PATCH) should orientate on "Semantic Versioning" https://semver.org/ # Version scheme (MAJOR.MINOR.PATCH) should orientate on "Semantic Versioning" https://semver.org/
# Every change in this script should result in increasing the version number accordingly (exceptions may be cosmetic # Every change in this script should result in increasing the version number accordingly (exceptions may be cosmetic
# changes) # changes)
SERVER_VERSION = "1.3.43" SERVER_VERSION = "1.3.44"
OLD_VERSION = '2.12.0' OLD_VERSION = '2.12.0'
@ -985,11 +985,12 @@ def check_library_report(result_path: str, message_id: str) -> str:
# Lists all checkLibrary* messages regarding the given function name # Lists all checkLibrary* messages regarding the given function name
def check_library_function_name(result_path: str, function_name: str, nonfunc_id: str='') -> str: def check_library_function_name(result_path: str, function_name: str, query_params: dict, nonfunc_id: str='') -> str:
pkgs = '' if query_params.get('pkgs') == '1' else None
function_name = urllib.parse.unquote_plus(function_name)
if nonfunc_id: if nonfunc_id:
id = '[' + nonfunc_id id = '[' + nonfunc_id
else: else:
function_name = urllib.parse.unquote_plus(function_name)
if function_name.endswith('()'): if function_name.endswith('()'):
id = '[checkLibrary' id = '[checkLibrary'
else: else:
@ -999,11 +1000,18 @@ def check_library_function_name(result_path: str, function_name: str, nonfunc_id
if not os.path.isfile(filename) or filename.endswith('.diff'): if not os.path.isfile(filename) or filename.endswith('.diff'):
continue continue
info_messages = False info_messages = False
url = None package_url = None
cppcheck_options = None cppcheck_options = None
for line in open(filename, 'rt'): for line in open(filename, 'rt'):
if line.startswith('cppcheck: '):
if OLD_VERSION not in line:
# Package results seem to be too old, skip
break
else:
# Current package, parse on
continue
if line.startswith('ftp://'): if line.startswith('ftp://'):
url = line package_url = line
continue continue
if line.startswith('cppcheck-options:'): if line.startswith('cppcheck-options:'):
cppcheck_options = line cppcheck_options = line
@ -1014,16 +1022,23 @@ def check_library_function_name(result_path: str, function_name: str, nonfunc_id
continue continue
if not info_messages: if not info_messages:
continue continue
if id in line: if id not in line:
if (' ' + function_name + ' ') in line: continue
if url: if not (' ' + function_name + ' ') in line:
output_lines_list.append(url) continue
url = None if pkgs is not None and package_url is not None:
if cppcheck_options: pkgs += '{}\n'.format(package_url.strip())
output_lines_list.append(cppcheck_options) break
cppcheck_options = None if package_url:
output_lines_list.append(line) output_lines_list.append(package_url)
package_url = None
if cppcheck_options:
output_lines_list.append(cppcheck_options)
cppcheck_options = None
output_lines_list.append(line)
if pkgs is not None:
return pkgs
return ''.join(output_lines_list) return ''.join(output_lines_list)
@ -1144,7 +1159,7 @@ class HttpClientThread(Thread):
httpGetResponse(self.connection, text, 'text/html') httpGetResponse(self.connection, text, 'text/html')
elif url.startswith('/check_library-'): elif url.startswith('/check_library-'):
function_name = url[len('/check_library-'):] function_name = url[len('/check_library-'):]
text = check_library_function_name(self.infoPath, function_name) text = check_library_function_name(self.infoPath, function_name, queryParams)
httpGetResponse(self.connection, text, 'text/plain') httpGetResponse(self.connection, text, 'text/plain')
elif url == '/value_flow_bailout_incomplete_var.html': elif url == '/value_flow_bailout_incomplete_var.html':
text = check_library_report(self.resultPath, message_id='valueFlowBailoutIncompleteVar') text = check_library_report(self.resultPath, message_id='valueFlowBailoutIncompleteVar')
@ -1154,11 +1169,11 @@ class HttpClientThread(Thread):
httpGetResponse(self.connection, text, 'text/html') httpGetResponse(self.connection, text, 'text/html')
elif url.startswith('/incomplete_var-'): elif url.startswith('/incomplete_var-'):
var_name = url[len('/incomplete_var-'):] var_name = url[len('/incomplete_var-'):]
text = check_library_function_name(self.resultPath, var_name, nonfunc_id='valueFlowBailoutIncompleteVar') text = check_library_function_name(self.resultPath, var_name, queryParams, nonfunc_id='valueFlowBailoutIncompleteVar')
httpGetResponse(self.connection, text, 'text/plain') httpGetResponse(self.connection, text, 'text/plain')
elif url.startswith('/unknown_macro-'): elif url.startswith('/unknown_macro-'):
var_name = url[len('/unknown_macro-'):] var_name = url[len('/unknown_macro-'):]
text = check_library_function_name(self.resultPath, var_name, nonfunc_id='unknownMacro') text = check_library_function_name(self.resultPath, var_name, queryParams, nonfunc_id='unknownMacro')
httpGetResponse(self.connection, text, 'text/plain') httpGetResponse(self.connection, text, 'text/plain')
else: else:
filename = resultPath + url filename = resultPath + url