def get_errors_in_all_analyzers(comparison): if not comparison.check_both_FileInfo_format(): return -1 result_analyzer_info = AnalyzerInfo(info_type="COMBINED") # FileInfo actions BEGIN for file_info_an1 in comparison.analyzer1_info.info: for error_info_an1 in file_info_an1: for binding in error_info_an1.bindings: filename_to_search = file_info_an1.file if binding.file: filename_to_search = binding.file file_info_an2 = comparison.analyzer2_info.search_by_file( filename_to_search) error_info_an2 = file_info_an2[binding.ind] error_info_to_add_an1 = copy.deepcopy(error_info_an1) error_info_to_add_an1.file = file_info_an1.file error_info_to_add_an2 = copy.deepcopy(error_info_an2) error_info_to_add_an2.file = file_info_an2.file result_analyzer_info.append( [error_info_to_add_an1, error_info_to_add_an2]) # FileInfo actions END return result_analyzer_info
def __init__(self, analyzer1_info: AnalyzerInfo = AnalyzerInfo(), analyzer2_info: AnalyzerInfo = AnalyzerInfo()): self.name_catalog_an1 = [] self.name_catalog_an2 = [] self.stat_matrix = None self.analyzer1_info = copy.deepcopy(analyzer1_info) self.analyzer2_info = copy.deepcopy(analyzer2_info)
def __lines(self, analyzer1_info: AnalyzerInfo, analyzer2_info: AnalyzerInfo, used_comparison=None): result_comparison = Comparison() self.__subproc_comparison_init(result_comparison, analyzer1_info, analyzer2_info) if not result_comparison.check_both_FileInfo_format(): return -1 # FileInfo actions BEGIN for file_info_an1 in analyzer1_info.info: file_info_an2 = analyzer2_info.search_by_file(file_info_an1.file) if isinstance(file_info_an2, int) and file_info_an2 == -1: continue for error_info_an1_ind in range(len(file_info_an1.errors)): for error_info_an2_ind in range(len(file_info_an2.errors)): if self.__subproc_lines_check_intersect( file_info_an1[error_info_an1_ind].lines, file_info_an2[error_info_an2_ind].lines, self.heuristic_params["distance"]): self.__subproc_result_comparison_binding_create( result_comparison, file_info_an1, file_info_an2, error_info_an1_ind, error_info_an2_ind) # FileInfo actions END result_comparison.stat_matrix_fill_by_bindings() return result_comparison
def __reaching_defs(self, analyzer1_info: AnalyzerInfo, analyzer2_info: AnalyzerInfo, used_comparison=None): result_comparison = Comparison() self.__subproc_comparison_init(result_comparison, analyzer1_info, analyzer2_info) if not result_comparison.check_both_FileInfo_format(): return -1 for file_info_an1 in analyzer1_info: file_info_an2 = analyzer2_info.search_by_file(file_info_an1.file) if isinstance(file_info_an2, int) and file_info_an2 == -1: continue cursor = create_cursor(file_info_an1.file) for error_an1_ind, error_an1 in enumerate(file_info_an1): var_er_an1 = self.__subproc_get_msg_leak_var( error_an1, analyzer1_info.analyzer_name) if var_er_an1 is None: continue line_er_an1 = error_an1.main_line cursor_er_an1 = reaching_var_def_by_line( cursor, var_er_an1, line_er_an1) for error_an2_ind, error_an2 in enumerate(file_info_an2): var_er_an2 = self.__subproc_get_msg_leak_var( error_an2, analyzer2_info.analyzer_name) if var_er_an2 is None: continue line_er_an2 = error_an2.main_line cursor_er_an2 = reaching_var_def_by_line( cursor, var_er_an2, line_er_an2) if cursor_er_an1 is None or cursor_er_an2 is None: continue if cursor_er_an2 == cursor_er_an1: self.__subproc_result_comparison_binding_create( result_comparison, file_info_an1, file_info_an2, error_an1_ind, error_an2_ind) result_comparison.stat_matrix_fill_by_bindings() return result_comparison
def __funcs(self, analyzer1_info: AnalyzerInfo, analyzer2_info: AnalyzerInfo, used_comparison=None): # TODO: fully implement and debug def __subproc_same_func_in_file_check(cursor: cl.Cursor, error_an1, error_an2): for child in cursor.get_children(): if child.kind == cl.CursorKind.FUNCTION_DECL: if child.extent.start.line <= error_an1.main_line <= child.extent.end.line and \ child.extent.start.line <= error_an2.main_line <= child.extent.end.line: return True result_comparison = Comparison() self.__subproc_comparison_init(result_comparison, analyzer1_info, analyzer2_info) if not result_comparison.check_both_FileInfo_format(): return -1 for file_info_an1 in analyzer1_info: file_info_an2 = analyzer2_info.search_by_file(file_info_an1.file) if isinstance(file_info_an2, int) and file_info_an2 == -1: continue cursor = create_cursor(file_info_an1.file) for error_info_an1_ind, error_an1 in enumerate(file_info_an1): for error_info_an2_ind, error_an2 in enumerate(file_info_an2): if __subproc_same_func_in_file_check( cursor, error_an1, error_an2): self.__subproc_result_comparison_binding_create( result_comparison, file_info_an1, file_info_an2, error_info_an1_ind, error_info_an2_ind) result_comparison.stat_matrix_fill_by_bindings() return result_comparison
def __files(self, analyzer1_info: AnalyzerInfo, analyzer2_info: AnalyzerInfo, used_comparison=None): result_comparison = Comparison() self.__subproc_comparison_init(result_comparison, analyzer1_info, analyzer2_info) if not result_comparison.check_both_FileInfo_format(): return -1 for file_info_an1 in analyzer1_info: #if file_info_an1.file == "/home/nick/C/testcases/CWE401_Memory_Leak/s01/CWE401_Memory_Leak__char_calloc_21.c": # print("HEH") file_info_an2 = analyzer2_info.search_by_file(file_info_an1.file) if isinstance(file_info_an2, int) and file_info_an2 == -1: continue for error_an1_ind, error_an1 in enumerate(file_info_an1): var_er_an1 = self.__subproc_get_msg_leak_var( error_an1, analyzer1_info.analyzer_name) for error_an2_ind, error_an2 in enumerate(file_info_an2): var_er_an2 = self.__subproc_get_msg_leak_var( error_an2, analyzer2_info.analyzer_name) if var_er_an1 == var_er_an2: self.__subproc_result_comparison_binding_create( result_comparison, file_info_an1, file_info_an2, error_an1_ind, error_an2_ind) result_comparison.stat_matrix_fill_by_bindings() return result_comparison
from projectLib.AnalyzerInfo import AnalyzerInfo from projectLib.Comparison import Comparison from projectLib.Heuristic import Heuristic from projectTests.ProjectConfig_test import * # REQUIRES: mine tests should be passed! juliet_res_dir = project_source_dir + "/AnalyzerOutputs/juliet_output_lines.svres" svace_res_dir = project_source_dir + "/AnalyzerOutputs/svace_output_lines.svres" juliet_info = AnalyzerInfo() juliet_info.mine_info("juliet", juliet_res_dir, code_project_source_path, cwe_num_list, warnings_list["juliet"]) svace_info = AnalyzerInfo() svace_info.mine_info("svace", svace_res_dir, code_project_source_path, cwe_num_list, warnings_list["juliet"]) lines_heuristic = Heuristic(heuristic_name="lines", heuristic_params=dict({"distance": 0})) lines_comparison = lines_heuristic.compare_info_with_heuristic(svace_info, juliet_info) print("ANALYZER 1") lines_comparison.print_comparison("an1") print("ANALYZER 2") lines_comparison.print_comparison("an2") print("ANALYZER BOTH") lines_comparison.print_comparison("an_both") print("Test Finish")
from projectLib.AnalyzerInfo import AnalyzerInfo from projectTests.ProjectConfig_test import * # REQUIRES: mining tests should be passed! # Automatically checks if information is not lost during save/load juliet_res_dir = project_source_dir + "/AnalyzerOutputs/juliet_output_mine.svres" svace_res_dir = project_source_dir + "/AnalyzerOutputs/svace_output_mine.svres" juliet_info = AnalyzerInfo() juliet_info.mine_info("juliet", juliet_res_dir, code_project_source_path, cwe_num_list, warnings_list["juliet"]) svace_info = AnalyzerInfo() svace_info.mine_info("svace", svace_res_dir, code_project_source_path, cwe_num_list, warnings_list["juliet"]) svace_info.save_info(info_path["svace"], info_ind=0) juliet_info.save_info(info_path["juliet"], info_ind=0) svace_info_new = AnalyzerInfo() svace_info_new.load_info(info_path["svace"], info_ind=0) juliet_info_new = AnalyzerInfo() juliet_info_new.load_info(info_path["juliet"], info_ind=0) if svace_info_new == svace_info and juliet_info_new == juliet_info: print("Check save/load: Pass") else: print("Check save/load: Fail")
from copy import deepcopy as dc # Internal imports from projectLib.AnalyzerInfo import AnalyzerInfo from ProjectConfig import * from projectLib.Heuristic import Heuristic # LINES GENERATION PART START print("COMPARISON GENERATION PART START") svace_info = AnalyzerInfo() svace_info.load_info(info_path["svace"], info_ind=1) juliet_info = AnalyzerInfo() juliet_info.load_info(info_path["juliet"], info_ind=1) comparison = Heuristic("funcs", {}).\ compare_info_with_heuristic(dc(svace_info), dc(juliet_info)) comparison.save_comparison(comp_results_path["standard"], 5) print("COMPARISON GENERATION PART END") print("SVRES GENERATION PART BEGIN") comparison.generate_svres_for_both( svres_gen_path["standard"], project_name_par=code_project_name, project_src_dir_par=code_project_source_path, ind=5) print("SVRES GENERATION PART END")
def __syntax_construct(self, analyzer1_info: AnalyzerInfo, analyzer2_info: AnalyzerInfo, used_comparison=None): # SUBPROCEDURES BEGIN def __subfunc_search(node: clang.cindex.Cursor, lst: list): if node.kind in self.heuristic_params["statement_list"]: trace_unit = [] trace_unit.append(node.location.line) sub_stmts = list(node.get_children()) for el in sub_stmts: trace_unit.append(el.location.line) lst.append(trace_unit) for c in node.get_children(): __subfunc_search(c, lst) return # SUBPROCEDURES END result_comparison = Comparison() self.__subproc_comparison_init(result_comparison, analyzer1_info, analyzer2_info) if not result_comparison.check_both_FileInfo_format(): return -1 # FileInfo actions BEGIN for file_info_an1 in analyzer1_info: file_info_an2 = analyzer2_info.search_by_file(file_info_an1.file) if isinstance(file_info_an2, int) and file_info_an2 == -1: continue index = clang.cindex.Index.create() translation_unit = index.parse( file_info_an1.file, args=[self.heuristic_params["c++_version"]]) cursor = translation_unit.cursor syntax_constr_line_list = [] __subfunc_search(cursor, syntax_constr_line_list) for error_info_an1_ind in range(len(file_info_an1.errors)): for error_info_an2_ind in range(len(file_info_an2.errors)): if file_info_an1[error_info_an1_ind].type in self.heuristic_params["analyzer1_warn_types_list"] and \ file_info_an2[error_info_an2_ind].type in self.heuristic_params["analyzer2_warn_types_list"]: for statement_lines in syntax_constr_line_list: if self.__subproc_lines_check_intersect(file_info_an1[error_info_an1_ind].lines, statement_lines, 0) and \ self.__subproc_lines_check_intersect(file_info_an2[error_info_an2_ind].lines, statement_lines, 0): self.__subproc_result_comparison_binding_create( result_comparison, file_info_an1, file_info_an2, error_info_an1_ind, error_info_an2_ind) # FileInfo actions END result_comparison.stat_matrix_fill_by_bindings() return result_comparison
from projectLib.AnalyzerInfo import AnalyzerInfo from projectLib.FileInfo import FileInfo from projectLib.ErrorInfo import ErrorInfo from projectTests.ProjectConfig_test import * # REQUIRES: svace_mine test should be passed! svace_res_dir = project_source_dir + "/AnalyzerOutputs/svace_output_mine.svres" svace_info = AnalyzerInfo() svace_info.mine_info("svace", svace_res_dir, code_project_source_path, cwe_num_list, warnings_list["juliet"]) file_info = svace_info[0] file_info_to_append = FileInfo(file="proxy", errors=[ErrorInfo()]) svace_info.append(file_info_to_append) if file_info_to_append in svace_info: print("Check append: Pass") else: print("Check append: Fail") file_search = svace_info.search_by_file(filename="proxy") if file_search == file_info_to_append: print("Check search_by_file: Pass") else: print("Check search_by_file: Fail") svace_info.remove(file_info_to_append)