Skip to content

fix(evm): report unexpected faults in JIT code as internal errors - #604

Open
abmcar wants to merge 1 commit into
DTVMStack:mainfrom
abmcar:fix/evm-null-deref-classification
Open

abmcar wants to merge 1 commit into
DTVMStack:mainfrom
abmcar:fix/evm-null-deref-classification

Conversation

@abmcar

@abmcar abmcar commented Aug 28, 2026 •

Copy link
Copy Markdown
Contributor

1. Does this PR affect any open issues?(Y/N) and add issue references (e.g. "fix #123", "re #123".):

  • N
  • Y

2. What is the scope of this PR (e.g. component or file name):

Runtime::callEVMInJITMode in src/runtime/runtime.cpp.

3. Provide a description of the PR(e.g. more details, effects, motivations or doc link):

  • Affects user behaviors
  • Contains CI/CD configuration changes
  • Contains documentation changes
  • Contains experimental features
  • Performance regression: Consumes more CPU
  • Performance regression: Consumes more Memory
  • Other

In EVM JIT code, every SIGSEGV/SIGBUS that was not native stack exhaustion was reported as EVMC_INVALID_MEMORY_ACCESS. The mapping comes from WebAssembly, whose linear memory is bounds-checked by guard pages. EVM memory is a heap buffer expanded explicitly before each access, and EVM exceptions use the illegal-instruction trap, so such a fault can only be an engine defect. Reported as an EVM halt, it was accepted as a valid result: with the stale memory base fixed in #600, the replay of mainnet block 25818502 finished with wrong gas instead of failing.

This PR reports these faults as EVMC_INTERNAL_ERROR, as other unexpected signals already are. Stack exhaustion still maps to EVMC_STACK_OVERFLOW.

Change doc: docs/changes/2026-10-11-evm-jit-fault-internal-error

4. Are there any breaking changes?(Y/N) and describe the breaking changes(e.g. more details, motivations or doc link):

  • N
  • Y

An embedder now receives EVMC_INTERNAL_ERROR instead of EVMC_INVALID_MEMORY_ACCESS for a fault in EVM JIT code. No status changes for any condition the EVM defines.

5. Are there test cases for these changes?(Y/N) select and add more details, references or doc links:

  • Unit test
  • Integration test
  • Benchmark (add benchmark stats below)
  • Manual test (add detailed scripts or steps below)
  • Other

No new tests. ctest (default and CI multipass arguments) and tools/run_evm_tests.py (multipass, interpreter) pass.

6. Release note

Report unexpected faults in EVM JIT code as EVMC_INTERNAL_ERROR instead of EVMC_INVALID_MEMORY_ACCESS.

🤖 Generated with Claude Code

Copilot AI lite review requested due to automatic review settings August 28, 2026 14:43

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adjusts EVM JIT trap handling so that faults at (or near) a null pointer are reported as an internal engine error rather than being misclassified as an EVM out-of-bounds memory access, preventing an engine defect from being surfaced as a consensus-visible halt condition.

Changes:

  • Add a dedicated EVMNullPointerDereference error code for JIT-only null-pointer faults.
  • Update Runtime::callEVMInJITMode signal-trap mapping to classify low-address SIGSEGV/SIGBUS as EVMC_INTERNAL_ERROR instead of EVMC_INVALID_MEMORY_ACCESS.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
src/runtime/runtime.cpp Adds low-address (null) fault detection in the EVM JIT trap handler and maps it to an internal EVMC status.
src/common/errors.def Introduces EVMNullPointerDereference to represent JIT null-pointer dereference defects distinctly from EVM execution faults.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/runtime/runtime.cpp Outdated
Comment on lines +933 to +936
/// Size of the unmapped low address range. A faulting address below this is a
/// null pointer plus a small offset, never a real allocation.
static constexpr uintptr_t NullPointerPageSize = 4096;

@github-actions

github-actions Bot commented Aug 28, 2026 •

Copy link
Copy Markdown

⚡ Performance Regression Check Results

✅ Performance Check Passed (interpreter)

Performance Benchmark Results (threshold: 25%)

Benchmark Baseline (us) Current (us) Change Status
total/main/blake2b_huff/8415nulls 2.48 2.62 +5.4% PASS
total/main/blake2b_huff/empty 0.04 0.04 -0.9% PASS
total/main/blake2b_shifts/8415nulls 13.79 15.57 +12.9% PASS
total/main/sha1_divs/5311 8.26 8.29 +0.3% PASS
total/main/sha1_divs/empty 0.10 0.10 -6.3% PASS
total/main/sha1_shifts/5311 5.42 5.21 -3.9% PASS
total/main/sha1_shifts/empty 0.04 0.04 +0.2% PASS
total/main/snailtracer/benchmark 91.98 93.27 +1.4% PASS
total/main/structarray_alloc/nfts_rank 1.15 1.16 +0.7% PASS
total/main/swap_math/insufficient_liquidity 0.00 0.00 +0.0% PASS
total/main/swap_math/received 0.01 0.01 +7.9% PASS
total/main/swap_math/spent 0.01 0.01 +3.7% PASS
total/main/weierstrudel/1 0.31 0.32 +5.6% PASS
total/main/weierstrudel/15 3.44 3.34 -2.8% PASS
total/micro/JUMPDEST_n0/empty 2.65 2.64 -0.1% PASS
total/micro/jump_around/empty 0.11 0.12 +3.3% PASS
total/micro/loop_with_many_jumpdests/empty 69.88 69.05 -1.2% PASS
total/micro/memory_grow_mload/by1 0.17 0.16 -3.8% PASS
total/micro/memory_grow_mload/by16 0.19 0.19 -0.7% PASS
total/micro/memory_grow_mload/by32 0.12 0.11 -1.5% PASS
total/micro/memory_grow_mload/nogrow 0.09 0.09 -2.1% PASS
total/micro/memory_grow_mstore/by1 0.19 0.18 -3.9% PASS
total/micro/memory_grow_mstore/by16 0.11 0.11 -0.4% PASS
total/micro/memory_grow_mstore/by32 0.22 0.23 +2.3% PASS
total/micro/memory_grow_mstore/nogrow 0.18 0.18 +1.2% PASS
total/micro/signextend/one 0.25 0.25 -0.5% PASS
total/micro/signextend/zero 0.47 0.45 -4.4% PASS
total/synth/ADD/b0 2.02 2.01 -0.2% PASS
total/synth/ADD/b1 2.75 2.67 -2.7% PASS
total/synth/ADDRESS/a0 6.08 6.26 +3.0% PASS
total/synth/ADDRESS/a1 5.19 5.20 +0.1% PASS
total/synth/AND/b0 2.16 2.17 +0.5% PASS
total/synth/AND/b1 2.33 2.38 +2.5% PASS
total/synth/BYTE/b0 6.16 6.14 -0.3% PASS
total/synth/BYTE/b1 8.64 8.27 -4.3% PASS
total/synth/CALLDATASIZE/a0 5.39 5.31 -1.5% PASS
total/synth/CALLDATASIZE/a1 3.46 3.45 -0.2% PASS
total/synth/CALLER/a0 6.04 6.11 +1.1% PASS
total/synth/CALLER/a1 6.32 6.19 -2.0% PASS
total/synth/CALLVALUE/a0 3.43 3.37 -1.7% PASS
total/synth/CALLVALUE/a1 6.40 5.90 -7.9% PASS
total/synth/CODESIZE/a0 5.84 5.81 -0.6% PASS
total/synth/CODESIZE/a1 6.05 6.13 +1.4% PASS
total/synth/DUP1/d0 1.79 1.72 -3.8% PASS
total/synth/DUP1/d1 1.91 1.94 +1.2% PASS
total/synth/DUP10/d0 1.78 1.72 -3.1% PASS
total/synth/DUP10/d1 2.06 1.90 -7.8% PASS
total/synth/DUP11/d0 1.23 1.25 +1.2% PASS
total/synth/DUP11/d1 1.97 2.15 +9.3% PASS
total/synth/DUP12/d0 1.83 1.64 -10.4% PASS
total/synth/DUP12/d1 1.23 1.23 +0.0% PASS
total/synth/DUP13/d0 1.78 1.79 +0.8% PASS
total/synth/DUP13/d1 1.94 1.90 -2.4% PASS
total/synth/DUP14/d0 1.25 1.25 +0.5% PASS
total/synth/DUP14/d1 1.97 1.88 -4.3% PASS
total/synth/DUP15/d0 1.69 1.66 -2.0% PASS
total/synth/DUP15/d1 1.23 1.17 -5.3% PASS
total/synth/DUP16/d0 1.70 1.69 -0.9% PASS
total/synth/DUP16/d1 2.00 2.06 +2.6% PASS
total/synth/DUP2/d0 1.23 0.99 -19.8% PASS
total/synth/DUP2/d1 2.03 1.89 -6.8% PASS
total/synth/DUP3/d0 1.79 1.70 -5.2% PASS
total/synth/DUP3/d1 1.23 1.23 -0.2% PASS
total/synth/DUP4/d0 1.75 1.69 -3.6% PASS
total/synth/DUP4/d1 2.00 1.91 -4.7% PASS
total/synth/DUP5/d0 1.23 1.23 +0.1% PASS
total/synth/DUP5/d1 1.91 1.91 +0.3% PASS
total/synth/DUP6/d0 1.67 1.69 +0.9% PASS
total/synth/DUP6/d1 1.16 1.23 +5.7% PASS
total/synth/DUP7/d0 1.79 1.65 -8.1% PASS
total/synth/DUP7/d1 1.99 2.08 +4.5% PASS
total/synth/DUP8/d0 1.24 1.24 -0.1% PASS
total/synth/DUP8/d1 1.94 2.06 +6.0% PASS
total/synth/DUP9/d0 1.77 1.67 -5.5% PASS
total/synth/DUP9/d1 1.24 1.15 -6.7% PASS
total/synth/EQ/b0 4.52 4.52 +0.1% PASS
total/synth/EQ/b1 5.00 5.00 -0.1% PASS
total/synth/GAS/a0 3.77 3.76 -0.4% PASS
total/synth/GAS/a1 6.84 6.86 +0.2% PASS
total/synth/GT/b0 4.85 4.82 -0.4% PASS
total/synth/GT/b1 5.00 4.99 -0.1% PASS
total/synth/ISZERO/u0 7.12 7.05 -1.0% PASS
total/synth/JUMPDEST/n0 2.65 2.64 -0.1% PASS
total/synth/LT/b0 4.83 4.83 -0.1% PASS
total/synth/LT/b1 4.28 4.25 -0.7% PASS
total/synth/MSIZE/a0 5.56 5.43 -2.1% PASS
total/synth/MSIZE/a1 5.91 5.61 -5.0% PASS
total/synth/MUL/b0 5.47 5.50 +0.6% PASS
total/synth/MUL/b1 5.23 5.22 -0.2% PASS
total/synth/NOT/u0 1.84 1.86 +1.1% PASS
total/synth/OR/b0 2.16 2.28 +5.6% PASS
total/synth/OR/b1 1.65 1.64 -0.9% PASS
total/synth/PC/a0 5.31 5.31 +0.4% PASS
total/synth/PC/a1 3.43 3.40 -1.0% PASS
total/synth/PUSH1/p0 2.21 1.77 -19.8% PASS
total/synth/PUSH1/p1 1.72 1.71 -0.1% PASS
total/synth/PUSH10/p0 1.77 1.79 +1.5% PASS
total/synth/PUSH10/p1 1.72 1.72 -0.4% PASS
total/synth/PUSH11/p0 1.87 1.79 -4.6% PASS
total/synth/PUSH11/p1 2.45 2.13 -13.0% PASS
total/synth/PUSH12/p0 1.23 1.24 +0.7% PASS
total/synth/PUSH12/p1 2.11 2.23 +5.4% PASS
total/synth/PUSH13/p0 1.81 1.82 +0.5% PASS
total/synth/PUSH13/p1 1.72 1.75 +1.6% PASS
total/synth/PUSH14/p0 1.83 2.35 +28.8% PASS
total/synth/PUSH14/p1 2.22 2.19 -1.5% PASS
total/synth/PUSH15/p0 1.26 1.23 -2.6% PASS
total/synth/PUSH15/p1 2.28 2.55 +12.3% PASS
total/synth/PUSH16/p0 1.87 1.84 -1.7% PASS
total/synth/PUSH16/p1 1.72 1.73 +0.3% PASS
total/synth/PUSH17/p0 1.89 1.80 -4.6% PASS
total/synth/PUSH17/p1 2.16 2.20 +1.5% PASS
total/synth/PUSH18/p0 1.24 1.24 -0.0% PASS
total/synth/PUSH18/p1 2.18 2.17 -0.5% PASS
total/synth/PUSH19/p0 1.83 1.83 -0.2% PASS
total/synth/PUSH19/p1 1.72 1.74 +1.1% PASS
total/synth/PUSH2/p0 1.83 1.93 +5.7% PASS
total/synth/PUSH2/p1 2.14 2.22 +4.0% PASS
total/synth/PUSH20/p0 1.80 1.98 +10.2% PASS
total/synth/PUSH20/p1 2.24 2.21 -1.2% PASS
total/synth/PUSH21/p0 1.24 1.23 -0.6% PASS
total/synth/PUSH21/p1 2.21 2.16 -2.3% PASS
total/synth/PUSH22/p0 1.82 2.03 +11.9% PASS
total/synth/PUSH22/p1 1.72 1.73 +0.4% PASS
total/synth/PUSH23/p0 1.89 1.82 -3.9% PASS
total/synth/PUSH23/p1 2.32 2.24 -3.2% PASS
total/synth/PUSH24/p0 1.24 1.23 -0.3% PASS
total/synth/PUSH24/p1 2.07 2.16 +4.7% PASS
total/synth/PUSH25/p0 1.79 1.81 +1.0% PASS
total/synth/PUSH25/p1 1.72 1.72 -0.4% PASS
total/synth/PUSH26/p0 1.86 1.93 +3.6% PASS
total/synth/PUSH26/p1 2.08 2.22 +7.0% PASS
total/synth/PUSH27/p0 1.25 1.24 -0.8% PASS
total/synth/PUSH27/p1 2.42 2.16 -10.9% PASS
total/synth/PUSH28/p0 1.85 1.83 -1.1% PASS
total/synth/PUSH28/p1 1.73 1.74 +0.6% PASS
total/synth/PUSH29/p0 1.92 1.87 -2.6% PASS
total/synth/PUSH29/p1 2.28 2.22 -2.6% PASS
total/synth/PUSH3/p0 1.23 1.24 +0.3% PASS
total/synth/PUSH3/p1 2.08 2.12 +1.7% PASS
total/synth/PUSH30/p0 1.30 1.31 +0.8% PASS
total/synth/PUSH30/p1 2.14 2.16 +0.7% PASS
total/synth/PUSH31/p0 1.82 1.94 +7.1% PASS
total/synth/PUSH31/p1 1.55 1.74 +12.4% PASS
total/synth/PUSH32/p0 1.93 1.80 -6.5% PASS
total/synth/PUSH32/p1 2.20 2.12 -3.7% PASS
total/synth/PUSH4/p0 1.89 1.77 -6.5% PASS
total/synth/PUSH4/p1 1.72 1.73 +0.6% PASS
total/synth/PUSH5/p0 1.80 1.74 -3.1% PASS
total/synth/PUSH5/p1 2.09 2.21 +5.9% PASS
total/synth/PUSH6/p0 1.24 1.24 +0.1% PASS
total/synth/PUSH6/p1 2.27 2.29 +1.0% PASS
total/synth/PUSH7/p0 1.87 1.80 -3.7% PASS
total/synth/PUSH7/p1 1.72 1.72 +0.2% PASS
total/synth/PUSH8/p0 1.89 1.82 -3.3% PASS
total/synth/PUSH8/p1 2.10 2.08 -0.9% PASS
total/synth/PUSH9/p0 1.24 1.25 +0.6% PASS
total/synth/PUSH9/p1 2.18 2.02 -7.3% PASS
total/synth/RETURNDATASIZE/a0 3.53 3.57 +1.1% PASS
total/synth/RETURNDATASIZE/a1 6.16 6.59 +6.9% PASS
total/synth/SAR/b0 3.95 3.95 -0.0% PASS
total/synth/SAR/b1 7.22 7.44 +3.0% PASS
total/synth/SGT/b0 3.63 3.63 +0.0% PASS
total/synth/SGT/b1 3.28 3.28 -0.2% PASS
total/synth/SHL/b0 3.79 3.76 -0.8% PASS
total/synth/SHL/b1 1.84 1.81 -1.4% PASS
total/synth/SHR/b0 3.79 3.80 +0.3% PASS
total/synth/SHR/b1 3.11 3.05 -2.0% PASS
total/synth/SIGNEXTEND/b0 3.26 3.44 +5.4% PASS
total/synth/SIGNEXTEND/b1 6.49 6.51 +0.2% PASS
total/synth/SLT/b0 3.43 3.42 -0.0% PASS
total/synth/SLT/b1 3.77 3.85 +1.9% PASS
total/synth/SUB/b0 2.67 2.66 -0.5% PASS
total/synth/SUB/b1 2.75 2.76 +0.1% PASS
total/synth/SWAP1/s0 1.52 1.51 -0.6% PASS
total/synth/SWAP10/s0 1.58 1.52 -3.6% PASS
total/synth/SWAP11/s0 2.67 2.65 -0.5% PASS
total/synth/SWAP12/s0 2.68 2.64 -1.5% PASS
total/synth/SWAP13/s0 1.53 1.53 -0.0% PASS
total/synth/SWAP14/s0 2.83 2.67 -5.6% PASS
total/synth/SWAP15/s0 2.77 2.71 -2.0% PASS
total/synth/SWAP16/s0 1.53 1.53 +0.2% PASS
total/synth/SWAP2/s0 2.78 2.61 -6.3% PASS
total/synth/SWAP3/s0 2.75 2.77 +0.8% PASS
total/synth/SWAP4/s0 1.51 1.51 +0.0% PASS
total/synth/SWAP5/s0 2.66 2.77 +4.1% PASS
total/synth/SWAP6/s0 2.63 2.75 +4.6% PASS
total/synth/SWAP7/s0 1.52 1.52 -0.2% PASS
total/synth/SWAP8/s0 2.64 2.66 +0.6% PASS
total/synth/SWAP9/s0 2.82 2.64 -6.3% PASS
total/synth/XOR/b0 1.98 1.97 -0.3% PASS
total/synth/XOR/b1 2.15 2.12 -1.6% PASS
total/synth/loop_v1 8.50 8.72 +2.6% PASS
total/synth/loop_v2 8.96 8.55 -4.6% PASS

Summary: 194 benchmarks, 0 regressions


✅ Performance Check Passed (multipass)

Performance Benchmark Results (threshold: 25%)

Benchmark Baseline (us) Current (us) Change Status
total/main/blake2b_huff/8415nulls 0.67 0.70 +3.6% PASS
total/main/blake2b_huff/empty 0.01 0.01 -2.3% PASS
total/main/blake2b_shifts/8415nulls 2.52 2.58 +2.4% PASS
total/main/sha1_divs/5311 0.42 0.44 +4.3% PASS
total/main/sha1_divs/empty 0.01 0.01 +1.9% PASS
total/main/sha1_shifts/5311 0.37 0.37 +2.0% PASS
total/main/sha1_shifts/empty 0.00 0.00 -1.0% PASS
total/main/snailtracer/benchmark 26.04 25.86 -0.7% PASS
total/main/structarray_alloc/nfts_rank 0.16 0.16 +3.6% PASS
total/main/swap_math/insufficient_liquidity 0.00 0.00 +4.7% PASS
total/main/swap_math/received 0.00 0.00 +3.9% PASS
total/main/swap_math/spent 0.00 0.00 +0.6% PASS
total/main/weierstrudel/1 0.18 0.18 +2.8% PASS
total/main/weierstrudel/15 2.12 2.13 +0.3% PASS
total/micro/JUMPDEST_n0/empty 0.00 0.00 +0.0% PASS
total/micro/jump_around/empty 0.01 0.01 -3.0% PASS
total/micro/loop_with_many_jumpdests/empty 0.00 0.00 +0.2% PASS
total/micro/memory_grow_mload/by1 0.01 0.01 +8.0% PASS
total/micro/memory_grow_mload/by16 0.01 0.01 -0.1% PASS
total/micro/memory_grow_mload/by32 0.01 0.01 +2.1% PASS
total/micro/memory_grow_mload/nogrow 0.01 0.01 +2.7% PASS
total/micro/memory_grow_mstore/by1 0.01 0.01 -0.6% PASS
total/micro/memory_grow_mstore/by16 0.01 0.01 +0.9% PASS
total/micro/memory_grow_mstore/by32 0.01 0.01 +6.4% PASS
total/micro/memory_grow_mstore/nogrow 0.01 0.01 +1.0% PASS
total/micro/signextend/one 0.00 0.00 -0.3% PASS
total/micro/signextend/zero 0.00 0.00 +3.1% PASS
total/synth/ADD/b0 0.00 0.00 +3.6% PASS
total/synth/ADD/b1 0.00 0.00 +1.6% PASS
total/synth/ADDRESS/a0 0.10 0.10 -1.0% PASS
total/synth/ADDRESS/a1 0.08 0.08 +1.9% PASS
total/synth/AND/b0 0.00 0.00 +0.8% PASS
total/synth/AND/b1 0.00 0.00 +0.2% PASS
total/synth/BYTE/b0 0.00 0.00 +3.6% PASS
total/synth/BYTE/b1 0.00 0.00 +0.3% PASS
total/synth/CALLDATASIZE/a0 0.06 0.05 -11.6% PASS
total/synth/CALLDATASIZE/a1 0.03 0.03 +3.0% PASS
total/synth/CALLER/a0 0.10 0.10 +1.0% PASS
total/synth/CALLER/a1 0.10 0.10 -3.5% PASS
total/synth/CALLVALUE/a0 0.10 0.10 +1.2% PASS
total/synth/CALLVALUE/a1 0.13 0.13 +1.0% PASS
total/synth/CODESIZE/a0 0.05 0.06 +8.1% PASS
total/synth/CODESIZE/a1 0.05 0.06 +3.4% PASS
total/synth/DUP1/d0 0.00 0.00 +2.7% PASS
total/synth/DUP1/d1 0.00 0.00 +5.1% PASS
total/synth/DUP10/d0 0.00 0.00 -2.0% PASS
total/synth/DUP10/d1 0.00 0.00 +1.8% PASS
total/synth/DUP11/d0 0.00 0.00 +2.4% PASS
total/synth/DUP11/d1 0.00 0.00 +4.0% PASS
total/synth/DUP12/d0 0.00 0.00 -0.5% PASS
total/synth/DUP12/d1 0.00 0.00 +4.7% PASS
total/synth/DUP13/d0 0.00 0.00 +2.0% PASS
total/synth/DUP13/d1 0.00 0.00 +4.9% PASS
total/synth/DUP14/d0 0.00 0.00 +3.0% PASS
total/synth/DUP14/d1 0.00 0.00 +1.4% PASS
total/synth/DUP15/d0 0.00 0.00 +0.9% PASS
total/synth/DUP15/d1 0.00 0.00 +2.6% PASS
total/synth/DUP16/d0 0.00 0.00 +4.5% PASS
total/synth/DUP16/d1 0.00 0.00 +2.0% PASS
total/synth/DUP2/d0 0.00 0.00 +6.7% PASS
total/synth/DUP2/d1 0.00 0.00 +3.3% PASS
total/synth/DUP3/d0 0.00 0.00 +4.6% PASS
total/synth/DUP3/d1 0.00 0.00 +5.7% PASS
total/synth/DUP4/d0 0.00 0.00 -5.4% PASS
total/synth/DUP4/d1 0.00 0.00 -0.9% PASS
total/synth/DUP5/d0 0.00 0.00 +1.7% PASS
total/synth/DUP5/d1 0.00 0.00 +3.7% PASS
total/synth/DUP6/d0 0.00 0.00 +6.2% PASS
total/synth/DUP6/d1 0.00 0.00 +4.1% PASS
total/synth/DUP7/d0 0.00 0.00 -3.8% PASS
total/synth/DUP7/d1 0.00 0.00 +1.8% PASS
total/synth/DUP8/d0 0.00 0.00 +1.8% PASS
total/synth/DUP8/d1 0.00 0.00 +1.0% PASS
total/synth/DUP9/d0 0.00 0.00 -3.0% PASS
total/synth/DUP9/d1 0.00 0.00 +2.9% PASS
total/synth/EQ/b0 0.00 0.00 +0.2% PASS
total/synth/EQ/b1 0.00 0.00 +4.7% PASS
total/synth/GAS/a0 0.47 0.49 +4.4% PASS
total/synth/GAS/a1 0.55 0.55 +1.6% PASS
total/synth/GT/b0 0.00 0.00 +5.0% PASS
total/synth/GT/b1 0.00 0.00 +2.4% PASS
total/synth/ISZERO/u0 0.00 0.00 +0.6% PASS
total/synth/JUMPDEST/n0 0.00 0.00 +3.6% PASS
total/synth/LT/b0 0.00 0.00 +5.3% PASS
total/synth/LT/b1 0.00 0.00 +3.6% PASS
total/synth/MSIZE/a0 0.00 0.00 +9.0% PASS
total/synth/MSIZE/a1 0.00 0.00 +5.8% PASS
total/synth/MUL/b0 0.00 0.00 +5.1% PASS
total/synth/MUL/b1 0.00 0.00 +3.1% PASS
total/synth/NOT/u0 0.00 0.00 +2.3% PASS
total/synth/OR/b0 0.00 0.00 +4.3% PASS
total/synth/OR/b1 0.00 0.00 +6.3% PASS
total/synth/PC/a0 0.00 0.00 +1.7% PASS
total/synth/PC/a1 0.00 0.00 +2.9% PASS
total/synth/PUSH1/p0 0.00 0.00 +2.7% PASS
total/synth/PUSH1/p1 0.00 0.00 +2.8% PASS
total/synth/PUSH10/p0 0.00 0.00 -1.0% PASS
total/synth/PUSH10/p1 0.00 0.00 +1.8% PASS
total/synth/PUSH11/p0 0.00 0.00 +4.3% PASS
total/synth/PUSH11/p1 0.00 0.00 +1.3% PASS
total/synth/PUSH12/p0 0.00 0.00 +6.5% PASS
total/synth/PUSH12/p1 0.00 0.00 +4.0% PASS
total/synth/PUSH13/p0 0.00 0.00 +0.1% PASS
total/synth/PUSH13/p1 0.00 0.00 +4.8% PASS
total/synth/PUSH14/p0 0.00 0.00 +4.4% PASS
total/synth/PUSH14/p1 0.00 0.00 -1.8% PASS
total/synth/PUSH15/p0 0.00 0.00 +7.5% PASS
total/synth/PUSH15/p1 0.00 0.00 -5.1% PASS
total/synth/PUSH16/p0 0.00 0.00 -0.3% PASS
total/synth/PUSH16/p1 0.00 0.00 -0.9% PASS
total/synth/PUSH17/p0 0.00 0.00 -1.1% PASS
total/synth/PUSH17/p1 0.00 0.00 -1.3% PASS
total/synth/PUSH18/p0 0.00 0.00 +3.6% PASS
total/synth/PUSH18/p1 0.00 0.00 +3.3% PASS
total/synth/PUSH19/p0 0.00 0.00 +2.8% PASS
total/synth/PUSH19/p1 0.00 0.00 +5.9% PASS
total/synth/PUSH2/p0 0.00 0.00 -0.0% PASS
total/synth/PUSH2/p1 0.00 0.00 +0.4% PASS
total/synth/PUSH20/p0 0.00 0.00 +1.9% PASS
total/synth/PUSH20/p1 0.00 0.00 +0.9% PASS
total/synth/PUSH21/p0 0.00 0.00 +2.8% PASS
total/synth/PUSH21/p1 0.00 0.00 -6.4% PASS
total/synth/PUSH22/p0 0.97 1.02 +5.2% PASS
total/synth/PUSH22/p1 1.18 1.17 -0.4% PASS
total/synth/PUSH23/p0 0.98 0.98 -0.0% PASS
total/synth/PUSH23/p1 1.32 1.36 +3.4% PASS
total/synth/PUSH24/p0 0.97 1.00 +3.1% PASS
total/synth/PUSH24/p1 1.24 1.39 +11.5% PASS
total/synth/PUSH25/p0 0.99 0.99 +0.9% PASS
total/synth/PUSH25/p1 1.14 1.19 +4.3% PASS
total/synth/PUSH26/p0 0.98 0.98 -0.9% PASS
total/synth/PUSH26/p1 1.26 1.28 +1.7% PASS
total/synth/PUSH27/p0 1.00 0.98 -1.8% PASS
total/synth/PUSH27/p1 1.28 1.34 +4.7% PASS
total/synth/PUSH28/p0 0.95 1.03 +7.4% PASS
total/synth/PUSH28/p1 1.18 1.18 +0.1% PASS
total/synth/PUSH29/p0 0.97 1.00 +3.4% PASS
total/synth/PUSH29/p1 1.28 1.26 -1.2% PASS
total/synth/PUSH3/p0 0.00 0.00 +2.4% PASS
total/synth/PUSH3/p1 0.00 0.00 -2.5% PASS
total/synth/PUSH30/p0 0.97 0.99 +2.6% PASS
total/synth/PUSH30/p1 1.25 1.29 +2.7% PASS
total/synth/PUSH31/p0 0.98 0.99 +0.3% PASS
total/synth/PUSH31/p1 1.18 1.20 +2.5% PASS
total/synth/PUSH32/p0 1.02 0.99 -2.9% PASS
total/synth/PUSH32/p1 1.25 1.29 +3.0% PASS
total/synth/PUSH4/p0 0.00 0.00 +3.2% PASS
total/synth/PUSH4/p1 0.00 0.00 +4.7% PASS
total/synth/PUSH5/p0 0.00 0.00 +5.3% PASS
total/synth/PUSH5/p1 0.00 0.00 +4.3% PASS
total/synth/PUSH6/p0 0.00 0.00 +4.4% PASS
total/synth/PUSH6/p1 0.00 0.00 -2.0% PASS
total/synth/PUSH7/p0 0.00 0.00 -3.8% PASS
total/synth/PUSH7/p1 0.00 0.00 +3.3% PASS
total/synth/PUSH8/p0 0.00 0.00 +0.6% PASS
total/synth/PUSH8/p1 0.00 0.00 -4.6% PASS
total/synth/PUSH9/p0 0.00 0.00 +3.6% PASS
total/synth/PUSH9/p1 0.00 0.00 +4.2% PASS
total/synth/RETURNDATASIZE/a0 0.02 0.02 +3.9% PASS
total/synth/RETURNDATASIZE/a1 0.02 0.02 +7.2% PASS
total/synth/SAR/b0 0.00 0.00 +4.0% PASS
total/synth/SAR/b1 0.00 0.00 -4.3% PASS
total/synth/SGT/b0 0.00 0.00 -4.7% PASS
total/synth/SGT/b1 0.00 0.00 +2.2% PASS
total/synth/SHL/b0 0.00 0.00 -0.9% PASS
total/synth/SHL/b1 0.00 0.00 +1.8% PASS
total/synth/SHR/b0 0.00 0.00 +0.8% PASS
total/synth/SHR/b1 0.00 0.00 -3.6% PASS
total/synth/SIGNEXTEND/b0 0.00 0.00 +0.6% PASS
total/synth/SIGNEXTEND/b1 0.00 0.00 +5.4% PASS
total/synth/SLT/b0 0.00 0.00 +4.0% PASS
total/synth/SLT/b1 0.00 0.00 -1.8% PASS
total/synth/SUB/b0 0.00 0.00 +3.6% PASS
total/synth/SUB/b1 0.00 0.00 +3.9% PASS
total/synth/SWAP1/s0 0.00 0.00 +3.7% PASS
total/synth/SWAP10/s0 0.00 0.00 +2.6% PASS
total/synth/SWAP11/s0 0.00 0.00 -2.2% PASS
total/synth/SWAP12/s0 0.00 0.00 -2.1% PASS
total/synth/SWAP13/s0 0.00 0.00 +4.1% PASS
total/synth/SWAP14/s0 0.00 0.00 +7.5% PASS
total/synth/SWAP15/s0 0.00 0.00 +1.2% PASS
total/synth/SWAP16/s0 0.00 0.00 +2.6% PASS
total/synth/SWAP2/s0 0.00 0.00 +4.9% PASS
total/synth/SWAP3/s0 0.00 0.00 -2.6% PASS
total/synth/SWAP4/s0 0.00 0.00 +1.1% PASS
total/synth/SWAP5/s0 0.00 0.00 -2.1% PASS
total/synth/SWAP6/s0 0.00 0.00 +2.9% PASS
total/synth/SWAP7/s0 0.00 0.00 +2.5% PASS
total/synth/SWAP8/s0 0.00 0.00 +3.2% PASS
total/synth/SWAP9/s0 0.00 0.00 +1.5% PASS
total/synth/XOR/b0 0.00 0.00 +1.8% PASS
total/synth/XOR/b1 0.00 0.00 +0.9% PASS
total/synth/loop_v1 4.38 4.48 +2.2% PASS
total/synth/loop_v2 4.37 4.48 +2.5% PASS

Summary: 194 benchmarks, 0 regressions


callEVMInJITMode mapped every SIGSEGV/SIGBUS that was not native stack
exhaustion to EVMC_INVALID_MEMORY_ACCESS, a mapping inherited from the
guard-page bounds checks of WebAssembly. EVM memory is never bounds-checked
by a fault, so in EVM JIT code such a fault is an engine defect, and
reporting it as an EVM halt let the embedder accept a wrong result.

Report it as EVMC_INTERNAL_ERROR, as other unexpected signals already are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@abmcar
abmcar force-pushed the fix/evm-null-deref-classification branch from f41ef6a to 754dd9a Compare October 11, 2026 06:55
@abmcar abmcar changed the title fix(evm): do not report a null-pointer dereference as an EVM memory fault fix(evm): report unexpected faults in JIT code as internal errors Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants