use super::super::domains::{AbstractDomainType, AbstractValue};
use crate::NodeId;
use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct AbstractInterpretationConfig {
pub domain_type: AbstractDomainType,
pub max_iterations: usize,
pub widening_delay: usize,
pub enable_narrowing: bool,
pub enable_backward_analysis: bool,
pub properties: Vec<Property>,
pub precision_threshold: f64,
}
impl Default for AbstractInterpretationConfig {
fn default() -> Self {
Self {
domain_type: AbstractDomainType::Intervals,
max_iterations: 100,
widening_delay: 3,
enable_narrowing: true,
enable_backward_analysis: false,
properties: Vec::new(),
precision_threshold: 0.8,
}
}
}
#[derive(Debug, Clone)]
pub enum Property {
NonNegative(NodeId),
Positive(NodeId),
BoundedValue(NodeId, f64, f64),
NoDivisionByZero(NodeId),
NoOverflow(NodeId),
SafetyProperty(String, NodeId),
}
#[derive(Debug, Clone)]
pub enum SafetyCheck {
BoundsCheck,
NullCheck,
DivisionByZeroCheck,
OverflowCheck,
ArrayBoundsCheck,
}
#[derive(Debug, Clone)]
pub enum SafetyCheckResult {
Safe,
Unsafe,
Unknown,
}
#[derive(Debug, Clone)]
pub struct Invariant {
pub invariant_type: InvariantType,
pub description: String,
pub confidence: f64,
pub location: String,
}
#[derive(Debug, Clone)]
pub enum InvariantType {
ValueRange,
LoopInvariant,
ConditionalInvariant,
MemorySafety,
NumericalProperty,
}
#[derive(Debug, Clone)]
pub struct FunctionInvariant {
pub invariant_type: InvariantType,
pub description: String,
pub confidence: f64,
pub location: String,
}
#[derive(Debug, Clone)]
pub struct ModuleInvariant {
pub invariant_type: InvariantType,
pub description: String,
pub confidence: f64,
pub scope: String,
}
#[derive(Debug, Clone)]
pub struct AnalysisStatistics {
pub analysis_time: Duration,
pub fixpoint_iterations: usize,
pub abstract_states_computed: usize,
pub cache_hits: usize,
pub cache_misses: usize,
}
#[derive(Debug, Clone)]
pub struct ForwardAnalysisResult {
pub pre_states: HashMap<NodeId, AbstractValue>,
pub post_states: HashMap<NodeId, AbstractValue>,
pub iterations: usize,
pub converged: bool,
}
impl ForwardAnalysisResult {
pub fn new() -> Self {
Self {
pre_states: HashMap::new(),
post_states: HashMap::new(),
iterations: 0,
converged: false,
}
}
}
impl Default for ForwardAnalysisResult {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct BackwardAnalysisResult {
pub pre_states: HashMap<NodeId, AbstractValue>,
pub post_states: HashMap<NodeId, AbstractValue>,
pub iterations: usize,
pub converged: bool,
}
impl BackwardAnalysisResult {
pub fn new() -> Self {
Self {
pre_states: HashMap::new(),
post_states: HashMap::new(),
iterations: 0,
converged: false,
}
}
}
impl Default for BackwardAnalysisResult {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct AbstractFunctionResult {
pub forward_result: FunctionForwardResult,
pub backward_result: Option<FunctionBackwardResult>,
pub invariants: Vec<FunctionInvariant>,
}
#[derive(Debug, Clone)]
pub struct FunctionForwardResult {
pub converged: bool,
pub iterations: usize,
pub entry_state: Option<AbstractValue>,
pub exit_state: Option<AbstractValue>,
}
impl FunctionForwardResult {
pub fn new() -> Self {
Self {
converged: false,
iterations: 0,
entry_state: None,
exit_state: None,
}
}
}
impl Default for FunctionForwardResult {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct FunctionBackwardResult {
pub converged: bool,
pub iterations: usize,
pub entry_state: Option<AbstractValue>,
pub exit_state: Option<AbstractValue>,
}
impl FunctionBackwardResult {
pub fn new() -> Self {
Self {
converged: false,
iterations: 0,
entry_state: None,
exit_state: None,
}
}
}
impl Default for FunctionBackwardResult {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct InterproceduralAnalysisResult {
pub call_graph: HashMap<String, Vec<String>>,
pub global_invariants: Vec<Invariant>,
}
#[derive(Debug, Clone)]
pub struct PropertyResult {
pub property: Property,
pub result: SafetyCheckResult,
pub confidence: f64,
pub details: String,
}
#[derive(Debug, Clone)]
pub struct PrecisionAnalysis {
pub overall_precision: f64,
pub node_precision: HashMap<NodeId, f64>,
pub improvement_suggestions: Vec<String>,
}
#[derive(Debug, Clone)]
pub struct PerformanceAnalysis {
pub complexity_score: f64,
pub bottlenecks: Vec<PerformanceBottleneck>,
pub optimization_opportunities: Vec<OptimizationOpportunity>,
}
#[derive(Debug, Clone)]
pub struct PerformanceBottleneck {
pub bottleneck_type: BottleneckType,
pub location: NodeId,
pub severity: f64,
pub description: String,
}
#[derive(Debug, Clone)]
pub enum BottleneckType {
ComputationIntensive,
MemoryBound,
LoopBottleneck,
CallOverhead,
CacheMisses,
}
#[derive(Debug, Clone)]
pub struct OptimizationOpportunity {
pub optimization_type: OptimizationType,
pub location: NodeId,
pub benefit: f64,
pub description: String,
}
#[derive(Debug, Clone)]
pub enum OptimizationType {
LoopUnrolling,
ConstantFolding,
CommonSubexpressionElimination,
DeadCodeElimination,
Vectorization,
}
#[derive(Debug, Clone)]
pub struct ComplexityMetrics {
pub cyclomatic_complexity: usize,
pub variable_count: usize,
pub nesting_depth: usize,
}
#[derive(Debug, Clone)]
pub struct AbstractAnalysisResult {
pub forward_result: ForwardAnalysisResult,
pub backward_result: Option<BackwardAnalysisResult>,
pub invariants: Vec<Invariant>,
pub property_results: Vec<PropertyResult>,
pub precision_analysis: PrecisionAnalysis,
pub performance_analysis: PerformanceAnalysis,
pub statistics: AnalysisStatistics,
pub node_values: HashMap<NodeId, AbstractValue>,
}
#[derive(Debug, Clone)]
pub struct AbstractIrResult {
pub function_results: HashMap<String, AbstractFunctionResult>,
pub interprocedural_result: InterproceduralAnalysisResult,
pub module_invariants: Vec<ModuleInvariant>,
}