From ed2b85c3401a0809d50da613e030d62efb98c702 Mon Sep 17 00:00:00 2001 From: Marius Smytzek Date: Thu, 20 Jul 2023 09:35:10 +0200 Subject: [PATCH] added last_evaluation to analysis --- pyproject.toml | 2 +- src/sflkit/__init__.py | 2 +- src/sflkit/analysis/analysis_type.py | 7 +++++++ src/sflkit/analysis/predicate.py | 22 +++++++++++++++++++++- src/sflkit/analysis/spectra.py | 14 +++++++++++++- 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 24361e8..5d44e15 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta" [project] name = "sflkit" -version = "0.2.4" +version = "0.2.5" authors = [ { name = "Marius Smytzek", email = "marius.smytzek@cispa.de" }, ] diff --git a/src/sflkit/__init__.py b/src/sflkit/__init__.py index 396a8cb..e55436f 100644 --- a/src/sflkit/__init__.py +++ b/src/sflkit/__init__.py @@ -6,7 +6,7 @@ from sflkit.config import Config, parse_config from sflkit.instrumentation.dir_instrumentation import DirInstrumentation -__version__ = "0.2.4" +__version__ = "0.2.5" def instrument_config(conf: Config, event_dump: str = None): diff --git a/src/sflkit/analysis/analysis_type.py b/src/sflkit/analysis/analysis_type.py index bdf527d..d7e0276 100644 --- a/src/sflkit/analysis/analysis_type.py +++ b/src/sflkit/analysis/analysis_type.py @@ -5,6 +5,12 @@ from sflkit.model.scope import Scope +class EvaluationResult(enum.Enum): + TRUE = 1 + FALSE = 0 + UNOBSERVED = -1 + + class AnalysisType(enum.Enum): LINE = 0 BRANCH = 1 @@ -48,6 +54,7 @@ def set_finder(function_finder, loop_finder, branch_finder): # noinspection PyUnusedLocal def __init__(self, event): self.suspiciousness: float = 0 + self.last_evaluation: EvaluationResult = EvaluationResult.UNOBSERVED def __repr__(self): return f"{self.analysis_type()}:{self.suspiciousness}" diff --git a/src/sflkit/analysis/predicate.py b/src/sflkit/analysis/predicate.py index 9153aa6..4a7c88b 100644 --- a/src/sflkit/analysis/predicate.py +++ b/src/sflkit/analysis/predicate.py @@ -5,7 +5,7 @@ from sflkitlib.events import EventType from sflkitlib.events.event import BranchEvent, FunctionExitEvent, DefEvent -from sflkit.analysis.analysis_type import AnalysisType +from sflkit.analysis.analysis_type import AnalysisType, EvaluationResult from sflkit.analysis.spectra import Spectrum from sflkit.analysis.suggestion import Suggestion, Location from sflkit.model import scope @@ -24,6 +24,17 @@ def __init__(self, file, line): self.increase_true = 0 self.increase_false = 0 self.true_hits = dict() + self.last_evaluation = EvaluationResult.UNOBSERVED + + @staticmethod + def default_evaluation() -> EvaluationResult: + return EvaluationResult.UNOBSERVED + + def get_last_evaluation(self, id_: int) -> EvaluationResult: + if id_ not in self.true_hits: + return self.default_evaluation() + else: + return self.last_evaluation def finalize(self, passed: list, failed: list): super().finalize(passed, failed) @@ -46,6 +57,9 @@ def hit(self, id_, event, scope_: scope.Scope = None): self.true_hits[id_] = 0 if self._evaluate_predicate(scope_): self.true_hits[id_] += 1 + self.last_evaluation = EvaluationResult.TRUE + else: + self.last_evaluation = EvaluationResult.FALSE def get_metric(self, metric: Callable = None): if metric is None: @@ -131,6 +145,9 @@ def hit(self, id_, event, scope_: scope.Scope = None): if event.then_id == self.then_id: super(Predicate, self).hit(id_, event, scope_) self.true_hits[id_] += 1 + self.last_evaluation = EvaluationResult.TRUE + else: + self.last_evaluation = EvaluationResult.FALSE def get_suggestion(self, metric: Callable = None, base_dir: str = ""): if metric == Predicate.IncreaseFalse: @@ -427,6 +444,9 @@ def hit(self, id_, event, scope_: scope.Scope = None): self.true_hits[id_] = 0 if event.value: self.true_hits[id_] += 1 + self.last_evaluation = EvaluationResult.TRUE + else: + self.last_evaluation = EvaluationResult.FALSE def __str__(self): return f"{self.analysis_type()}:{self.file}:{self.line}:{self.condition}" diff --git a/src/sflkit/analysis/spectra.py b/src/sflkit/analysis/spectra.py index 86f2a0e..162dd90 100644 --- a/src/sflkit/analysis/spectra.py +++ b/src/sflkit/analysis/spectra.py @@ -14,7 +14,7 @@ UseEvent, ) -from sflkit.analysis.analysis_type import AnalysisObject, AnalysisType +from sflkit.analysis.analysis_type import AnalysisObject, AnalysisType, EvaluationResult from sflkit.analysis.suggestion import Suggestion, Location from sflkit.model.scope import Scope @@ -39,10 +39,21 @@ def __init__( self.failed_observed = failed_observed self.failed_not_observed = failed_not_observed self.hits = dict() + self.last_evaluation: EvaluationResult = EvaluationResult.FALSE def __str__(self): return f"{self.analysis_type()}:{self.file}:{self.line}" + @staticmethod + def default_evaluation() -> EvaluationResult: + return EvaluationResult.FALSE + + def get_last_evaluation(self, id_: int) -> EvaluationResult: + if id_ not in self.hits: + return self.default_evaluation() + else: + return self.last_evaluation + def get_metric(self, metric: Callable = None): if metric is None: metric = Spectrum.Ochiai @@ -62,6 +73,7 @@ def assign_suspiciousness(self, metric: Callable = None): self.suspiciousness = self.get_metric(metric) def hit(self, id_, event, scope_: Scope = None): + self.last_evaluation = True if id_ not in self.hits: self.hits[id_] = 1 else: