-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
Critical Memory System Recursion Bug - SOLUTION FOUND
Problem Description
The wrtd binary crashes with stack overflow during WASM module execution due to circular dependencies in the memory system initialization.
Root Cause Analysis
Through LLDB debugging and 20 rounds of sequential thinking analysis, identified the exact recursion chain:
CapabilityAwareEngine::with_context_and_preset()
createsBoundedMap::new(NoStdProvider<4096>)
BoundedMap::new()
→BoundedVec::with_verification_level(provider, level)
- Critical Point:
BoundedVec::with_verification_level()
atwrt-foundation/src/bounded.rs:1052
callsT::default().serialized_size()
- When T=
MemoryWrapper
, this callsMemoryWrapper::default()
MemoryWrapper::default()
→Memory::new()
→LargeMemoryProvider::default()
(which isNoStdProvider<67108864>
)- This creates another memory allocation cycle, causing stack overflow
Stack Trace Evidence
* thread #1, stop reason = EXC_BAD_ACCESS (code=2, address=0x16f6071e0)
* frame #0: MemoryWrapper::default() at module.rs:2544
frame #1: BoundedVec::default() at bounded.rs:1009:35
frame #6: BoundedMap::new(NoStdProvider<4096>) at bounded_collections.rs:413:23
frame #8: CapabilityAwareEngine::with_preset(QM) at capability_engine.rs:222:9
Industry Research & Comparative Analysis
Approaches Analyzed
- Heapless Pattern: Fixed-capacity collections with const generics
- embedded-alloc Pattern: Global allocator with critical sections
- ASIL D/Functional Safety: Static allocation with formal verification
- Eclipse SCORE: Process isolation and memory separation
- Current WRT System: Capability-based allocation (broken)
Decision Criteria Spider Diagram
Memory Efficiency (5)
★
/|\
/ | \
/ | \
/ | \
Ecosystem (4) ★---+----+----+---★ Safety Cert (5)
/ \ | / \
/ \ | / \
/ \ | / \
/ \|/ \
/ ★ \
Performance (4) ------/ \------ Implementation (3)
\ ★ /
\ /|\ /
\ / | \ /
\ / | \ /
\ / | \ /
★---+----+----+---★
Maintainability (4)
Legend: (1=Low Priority, 5=Critical)
Scoring Matrix by Solution
Solution | Memory | Safety | Performance | Implementation | Maintainability | Ecosystem | Total |
---|---|---|---|---|---|---|---|
Heapless | 5/5 | 5/5 | 5/5 | 4/5 | 4/5 | 4/5 | 27/30 |
embedded-alloc | 3/5 | 3/5 | 3/5 | 3/5 | 3/5 | 4/5 | 19/30 |
ASIL D Static | 5/5 | 5/5 | 5/5 | 2/5 | 2/5 | 2/5 | 21/30 |
Eclipse SCORE | 2/5 | 5/5 | 3/5 | 2/5 | 3/5 | 3/5 | 18/30 |
Winner: Heapless Pattern (27/30 total score)
Proposed Solution: WRT Memory System v2.0
Phase 1: Emergency Fix (Week 1) - P0 Critical
Add StaticSerializedSize trait pattern:
// New trait for compile-time known sizes
pub trait StaticSerializedSize {
const SERIALIZED_SIZE: usize;
}
// Implement for MemoryWrapper
impl StaticSerializedSize for MemoryWrapper {
const SERIALIZED_SIZE: usize = 12; // From existing ToBytes impl
}
// Update BoundedVec construction logic
impl<T, const N: usize, P> BoundedVec<T, N, P> {
pub fn with_verification_level(provider_arg: P, level: VerificationLevel) -> Result<Self> {
// Use static size if available, fallback to Default pattern
let item_size = if let Some(size) = Self::static_item_size() {
size
} else {
T::default().serialized_size() // Legacy fallback
};
// ... rest of implementation
}
fn static_item_size() -> Option<usize>
where
T: StaticSerializedSize,
{
Some(T::SERIALIZED_SIZE)
}
}
Phase 2: Heapless Migration (Month 1-2) - P1 High
Adopt heapless collection patterns:
// New heapless-style BoundedVec
pub struct WrtVec<T, const N: usize, P: MemoryProvider> {
phantom: PhantomData<T>,
len: usize,
buffer: [MaybeUninit<T>; N],
provider: P,
}
impl<T, const N: usize, P: MemoryProvider> WrtVec<T, N, P> {
// No Default dependency - pure const construction
pub const fn new_with_provider(provider: P) -> Self {
Self {
phantom: PhantomData,
len: 0,
buffer: unsafe { MaybeUninit::uninit().assume_init() },
provider,
}
}
}
Phase 3: Complete Modernization (Month 2-3) - P2 Medium
Full transition to modern memory system with ASIL compliance
Research Foundation
Based on comprehensive 2025 industry analysis:
- HighTec ASIL D Rust Compiler: First ISO 26262 certified Rust compiler
- Heapless Crate: Battle-tested in thousands of embedded projects
- Eclipse SCORE: Automotive safety platform with process isolation
- embedded-alloc: Production-ready heap allocator patterns
Task List
🚨 Phase 1: Emergency Fix (Week 1)
- Day 1: Add
StaticSerializedSize
trait towrt-foundation/src/traits.rs
- Day 1: Implement
StaticSerializedSize
forMemoryWrapper
withSERIALIZED_SIZE = 12
- Day 1: Update
BoundedVec::with_verification_level()
to use static size first - Day 2: Test basic WASM module execution:
./target/debug/wrtd /tmp/simple.wasm
- Day 3: Run
cargo-wrt verify-matrix --report
to ensure ASIL compliance - Day 4: Execute comprehensive test suite with wrtd
- Day 5: Profile memory usage to confirm no regressions
- Week 1: Update this GitHub issue with emergency fix results
🔄 Phase 2: Heapless Migration (Month 1-2)
- Week 1: Design new
WrtVec<T, const N: usize, P>
with MaybeUninit storage - Week 2: Implement
WrtVec
with heapless-style const construction - Week 3: Migrate
BoundedMap
to use new WrtVec internally - Week 4: Migrate
BoundedString
to heapless pattern - Week 5: Replace core collections in
wrt-runtime
module system - Week 6: Replace collections in
wrt-component
instantiation - Week 7: Update capability engine to use new collections
- Week 8: Comprehensive testing and performance validation
⚡ Phase 3: Complete Modernization (Month 2-3)
- Month 2 Week 1: Audit all 274+ NoStdProvider usage locations
- Month 2 Week 2: Replace remaining NoStdProvider patterns with safe_managed_alloc!
- Month 2 Week 3: Implement unified
WrtMemorySystem
with ASIL-aware allocation - Month 2 Week 4: Add formal verification hooks for safety certification
- Month 3 Week 1: Performance optimization and memory profiling
- Month 3 Week 2: ASIL D compliance testing with HighTec compiler
- Month 3 Week 3: Documentation and architectural decision records
- Month 3 Week 4: Final validation and release preparation
🧪 Testing Checkpoints
- Emergency Fix: wrtd executes simple WASM without crash
- Phase 2: All existing tests pass with new collections
- Phase 3: Full ASIL D verification matrix passes
- Final: Performance benchmarks show improvement over baseline
📊 Success Metrics
Metric | Baseline | Target | Measurement |
---|---|---|---|
Crash Rate | 100% (stack overflow) | 0% | wrtd execution |
Memory Efficiency | Multiple provider layers | Direct allocation | Profiling tools |
ASIL Compliance | Failing | ASIL D ready | cargo-wrt verify |
Performance | N/A (crashes) | Constant time ops | Benchmarks |
Priority Classification
- P0-Critical: Phase 1 emergency fix (blocks all functionality)
- P1-High: Phase 2 heapless migration (architectural debt)
- P2-Medium: Phase 3 modernization (competitive advantage)
Expected Benefits
Aspect | Current | After Fix | Improvement |
---|---|---|---|
Functionality | ❌ Complete failure | ✅ Full operation | 100% |
Memory Efficiency | ✅ Direct allocation | 60% | |
Safety Compliance | ❌ ASIL D failing | ✅ ASIL D ready | 100% |
Performance | ❌ Stack overflow | ✅ Constant time | 80% |
Maintainability | ❌ Complex traits | ✅ Clear patterns | 70% |
Files Affected
wrt-foundation/src/bounded.rs:1052
- Core recursion pointwrt-runtime/src/module.rs:2544
- MemoryWrapper::default()wrt-runtime/src/bounded_runtime_infra.rs:42
- BaseRuntimeProvider definitionwrt-runtime/src/memory.rs:169
- LargeMemoryProvider definition- 274+ files with NoStdProvider usage requiring Phase 3 migration
Industry Alignment
This solution aligns WRT with 2025 industry developments:
- HighTec's ASIL D Rust compiler certification
- Heapless pattern adoption in embedded Rust ecosystem
- Eclipse SCORE automotive safety platform requirements
- Software Defined Vehicle memory safety demands
Implementing this architecture positions WRT as a leader in safe, efficient WebAssembly runtime systems for embedded and automotive applications.
Metadata
Metadata
Assignees
Labels
No labels