Skip to main content

xbp_analysis/application/rules/
missing_cleanup.rs

1use super::{base_caps, concepts_of, finding_from_concept};
2use crate::domain::concepts::ConceptKind;
3use crate::domain::model::LanguageModel;
4use crate::domain::rule::{Rule, RuleMeta};
5use crate::domain::types::{Confidence, Finding, Severity};
6use std::sync::OnceLock;
7
8#[derive(Default)]
9pub struct MissingCleanupRule;
10
11impl Rule for MissingCleanupRule {
12    fn meta(&self) -> &RuleMeta {
13        static META: OnceLock<RuleMeta> = OnceLock::new();
14        META.get_or_init(|| RuleMeta {
15            id: "missing-cleanup".into(),
16            name: "Missing cleanup on error".into(),
17            description: "Resource or lock cleanup may be skipped on failure paths.".into(),
18            default_severity: Severity::Medium,
19            required_capabilities: base_caps(),
20            autofix_safe: false,
21        })
22    }
23
24    fn evaluate(&self, model: &LanguageModel) -> Vec<Finding> {
25        concepts_of(model, ConceptKind::ResourceCleanup)
26            .map(|(lang, c)| {
27                finding_from_concept(
28                    &self.meta().id,
29                    lang,
30                    c,
31                    Severity::Medium,
32                    Confidence::Low,
33                    "Resource/lock cleanup may fail or be skipped after an error.",
34                    "Leaked handles, held locks, or unflushed buffers cause deadlocks or data loss.",
35                    "Use RAII / defer / finally patterns so cleanup runs on all paths.",
36                )
37            })
38            .collect()
39    }
40}