# Facebook Infer Checkers vs fold Detectors — Gap Matrix > Generated 2026-05-29. Maps every Infer C/C++ checker to fold's existing detectors. ## Coverage Summary Infer has ~30 C/C++ checkers across 6 categories. fold covers 9 of these domains. | Category | Infer Checkers | fold Has | fold Missing | |----------|---------------|----------|-------------| | Memory safety | 5 | 5 | 0 | | Resource management | 4 | 3 | 1 | | Concurrency | 7 | 0 | 7 | | Performance | 5 | 1 | 4 | | C++ lifetime | 4 | 0 | 4 | | Taint / security | 3 | 1 | 2 | | **Total** | **~30** | **10** | **18** | ## Key Gaps ### Concurrency (7 Infer checkers, 0 in fold) | Infer Checker | What it finds | |---------------|--------------| | RacerD | Data races on Java/ObjC fields (some C++ support) | | Starvation | Deadlocks from lock ordering | | Thread-safety | Unsafe publication, missing synchronization | | Lock consistency | Lock/unlock imbalance | | GuardedBy | Missing lock acquisition before accessing guarded field | **fold opportunity**: Syntactic lock/unlock imbalance detection (low effort). Full RacerD equivalent requires thread interleaving model (high effort, beyond current scope). ### Resource Management (1 gap) | Infer Checker | fold Equivalent | |---------------|----------------| | Resource leak (files) | `memory-leak` (heap only) — missing file/socket leak | | Memory leak | `memory-leak` ✅ | ### C++ Lifetime (4 Infer checkers, 0 in fold) | Infer Checker | What it finds | fold Feasibility | |---------------|--------------|-----------------| | Dangling pointer | Use-after-free | `use-after-free` ✅ (observer-based) | | Dangling reference | Reference to temporary | NEW — syntactic check | | Ownership | shared_ptr cycles | Beyond scope | | Smart pointer | unique_ptr/shared_ptr misuse | NEW — syntactic check | ### Performance (5 Infer checkers, 1 in fold) | Infer Checker | fold Equivalent | |---------------|----------------| | Unnecessary copy | `redundant-store` (partial) | | Expensive loop invariant | NEW — Z3 could prove expression is loop-invariant | | Vector reallocation | NEW — detect reserve() opportunities | | Boxed primitive | N/A (Java-specific) | ## What fold Does Better Than Infer | Capability | fold | Infer | |-----------|------|-------| | Z3-proved findings | Yes (UNSAT proofs) | No (biabduction, heuristic) | | Semantic equivalence | Yes (Type-4 clones) | No | | Binary scanning | Yes | No | | Dead branch detection | Yes | Partial (pulse dead store) | | Cross-language (Rust/Swift) | Yes | No | | Observer architecture | Yes (pluggable detectors) | No (checker registration) | ## Recommended Additions | Priority | Detector | Approach | Effort | |----------|----------|----------|--------| | 1 | File/socket leak | Extend memory-leak to track non-heap resources | M | | 2 | Dangling reference | Syntactic: detect references to temporaries | S | | 3 | Lock imbalance | Syntactic: count lock/unlock per function | S | | 4 | Vector reallocation | Syntactic: detect push_back in loop without reserve | S | | 5 | Expensive loop invariant | Z3: prove expression is loop-invariant | L |