From ba22b463bfd908672a8f2766ff342673a7040252 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:04:56 +0000 Subject: [PATCH 1/2] Initial plan From fdabc7d8071a91d018f7a969ee94d2bca114d6a9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:12:53 +0000 Subject: [PATCH 2/2] Remove assert_eq! from fuzz_tx_consistency, count inconsistencies instead; normalize MemOutOfBound errors Co-authored-by: gpBlockchain <32102187+gpBlockchain@users.noreply.github.com> --- fuzz/fuzz_targets/fuzz_tx_consistency.rs | 13 +++++++++++-- src/lib.rs | 10 ++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/fuzz/fuzz_targets/fuzz_tx_consistency.rs b/fuzz/fuzz_targets/fuzz_tx_consistency.rs index dcbed9e..6f78eb1 100644 --- a/fuzz/fuzz_targets/fuzz_tx_consistency.rs +++ b/fuzz/fuzz_targets/fuzz_tx_consistency.rs @@ -1,15 +1,24 @@ #![no_main] +use std::sync::atomic::{AtomicUsize, Ordering}; use libfuzzer_sys::fuzz_target; use schedfuzz::{patch, sched}; +static INCONSISTENCY_COUNT: AtomicUsize = AtomicUsize::new(0); + fuzz_target!(|data: &[u8]| { // Fuzzed code goes here let r_patch = patch::run(data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); let r_sched = sched::run(data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); - assert_eq!(r_patch, r_sched); + if r_patch != r_sched { + let count = INCONSISTENCY_COUNT.fetch_add(1, Ordering::Relaxed) + 1; + eprintln!("inconsistency #{count} (version 0): left={r_patch:?}, right={r_sched:?}"); + } let r_patch = patch::run(data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); let r_sched = sched::run(data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); - assert_eq!(r_patch, r_sched); + if r_patch != r_sched { + let count = INCONSISTENCY_COUNT.fetch_add(1, Ordering::Relaxed) + 1; + eprintln!("inconsistency #{count} (version 2): left={r_patch:?}, right={r_sched:?}"); + } }); diff --git a/src/lib.rs b/src/lib.rs index 5be4d4c..535ff00 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -117,20 +117,22 @@ pub mod patch { /// Normalize an error string to ignore known formatting differences between /// CKB VM versions. For example, one version may produce `MemWriteOnExecutablePage` -/// while another produces `MemWriteOnExecutablePage(18)`. +/// while another produces `MemWriteOnExecutablePage(18)`, or `MemOutOfBound` +/// while another produces `MemOutOfBound(4194364, Memory)`. pub fn normalize_error(err: String) -> String { let mut result = err; - let patterns = ["MemWriteOnExecutablePage"]; + let patterns = ["MemWriteOnExecutablePage", "MemOutOfBound"]; for pattern in patterns { loop { - // Find "Pattern(digits)" and replace with just "Pattern" + // Find "Pattern(...)" and replace with just "Pattern" let Some(start) = result.find(pattern) else { break }; let after = start + pattern.len(); let Some(rest) = result.get(after..) else { break }; if !rest.starts_with('(') { break; } let Some(close) = rest.find(')') else { break }; + // Only strip args that are alphanumeric/comma/space (e.g. "4194364, Memory" or "18") let inside = &rest[1..close]; - if !inside.chars().all(|c| c.is_ascii_digit()) { break; } + if !inside.chars().all(|c| c.is_ascii_alphanumeric() || c == ',' || c == ' ') { break; } result = format!( "{}{}", &result[..after],