コード例 #1
0
ファイル: Comparison.py プロジェクト: Gor4i4ka/KURS_CURRENT
        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
コード例 #2
0
ファイル: Comparison.py プロジェクト: Gor4i4ka/KURS_CURRENT
    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)
コード例 #3
0
ファイル: Heuristic.py プロジェクト: Gor4i4ka/KURS_CURRENT
    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
コード例 #4
0
ファイル: Heuristic.py プロジェクト: Gor4i4ka/KURS_CURRENT
    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
コード例 #5
0
ファイル: Heuristic.py プロジェクト: Gor4i4ka/KURS_CURRENT
    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
コード例 #6
0
ファイル: Heuristic.py プロジェクト: Gor4i4ka/KURS_CURRENT
    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
コード例 #7
0
ファイル: lines_test.py プロジェクト: Gor4i4ka/KURS_CURRENT
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")

コード例 #8
0
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")
コード例 #9
0
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")
コード例 #10
0
ファイル: Heuristic.py プロジェクト: Gor4i4ka/KURS_CURRENT
    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
コード例 #11
0
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)