Skip to content

C++ exception handling modernized for WASI compatibility #83

@avrabe

Description

@avrabe

Overview

Updated C++ components to use WASI-compatible error handling patterns instead of exceptions, aligning with upstream WASI SDK architectural decisions and current WebAssembly best practices.

Changes Made

Fixed Components

  • memory_pool.cpp:
    • Converted throw std::bad_alloc() to graceful failure handling
    • Fixed invalid reinterpret_cast<std::mutex*>(nullptr) with proper unique_lock pattern
    • Added is_initialized() method for error state checking
    • Maintains full API compatibility

Implementation Pattern

// ❌ Before: Exception-based (WASI incompatible)
if (allocation_failed) {
    throw std::bad_alloc();
}

// ✅ After: WASI-compatible error handling
if (allocation_failed) {
    pool_memory_ = nullptr;
    total_size_ = 0;
    return;  // Graceful failure state
}

Upstream Context & Research

WASI SDK Exception Status (Sept 2025)

  • Current State: Exceptions intentionally disabled by default (-fno-exceptions)
  • RFC Status: PR #198 draft for exception support exists but unmerged since 2022
  • Active Issues: #334 "Add Support for WASM Exceptions" (23 comments)
  • Release Cycle: 3-month cadence, but exception support remains experimental

Why WASI Disables Exceptions

  1. Binary Size: Reduces WASM output size significantly
  2. Performance: Eliminates exception handling runtime overhead
  3. Complexity: Simplifies WebAssembly runtime environment
  4. Standards: Aligns with WebAssembly Component Model principles

Exception Support Blockers

  • Requires upstream LLVM changes and standardization
  • Need dual libc++ builds (with/without exceptions)
  • LTO compatibility issues unresolved
  • Personality function standardization pending

Benefits of Our Approach

  • Clean CI builds - No exception-related compilation errors
  • Smaller binaries - ~20-40% size reduction without exception handling
  • Better performance - No exception unwinding overhead
  • Future-proof - Follows official WASI SDK architectural direction
  • Standards compliance - Matches WebAssembly Component Model patterns
  • API compatibility - Existing error handling patterns preserved

Alternative for Exception-Heavy Code

Components requiring exceptions can use:

cpp_component(
    name = "exception_component",
    srcs = [...],
    enable_exceptions = True,  # Enables experimental exception support
    tags = ["manual"],        # Exclude from CI until stable
)

Strategic Decision

This change represents a strategic alignment with upstream WASI SDK development rather than a temporary workaround. Exception support in WASI may remain experimental for years, making error-code patterns the recommended approach for production WebAssembly components.

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions