From db1469338b651328e8a63bf53699991a4b87affe Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Mar 2026 02:20:25 +0000 Subject: [PATCH 1/3] Initial plan From 1ce933f14e518dfaeb29eb00a787b4f8f7c334b3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Mar 2026 02:25:11 +0000 Subject: [PATCH 2/3] Add VM execution timing: track and print patch/sched elapsed time every 1000 runs Co-authored-by: gpBlockchain <32102187+gpBlockchain@users.noreply.github.com> --- fuzz/fuzz_targets/fuzz_tx_consistency.rs | 35 ++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/fuzz/fuzz_targets/fuzz_tx_consistency.rs b/fuzz/fuzz_targets/fuzz_tx_consistency.rs index 6f78eb1..7591fc9 100644 --- a/fuzz/fuzz_targets/fuzz_tx_consistency.rs +++ b/fuzz/fuzz_targets/fuzz_tx_consistency.rs @@ -1,24 +1,55 @@ #![no_main] -use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering}; +use std::time::Instant; use libfuzzer_sys::fuzz_target; use schedfuzz::{patch, sched}; static INCONSISTENCY_COUNT: AtomicUsize = AtomicUsize::new(0); +static RUN_COUNT: AtomicUsize = AtomicUsize::new(0); +static PATCH_TOTAL_NS: AtomicU64 = AtomicU64::new(0); +static SCHED_TOTAL_NS: AtomicU64 = AtomicU64::new(0); + +const PRINT_INTERVAL: usize = 1000; fuzz_target!(|data: &[u8]| { - // Fuzzed code goes here + // Individual run durations will not exceed u64::MAX nanoseconds (~584 years), so truncation is safe. + let patch_start_0 = Instant::now(); let r_patch = patch::run(data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + let patch_ns0 = patch_start_0.elapsed().as_nanos() as u64; + + let sched_start_0 = Instant::now(); let r_sched = sched::run(data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + let sched_ns0 = sched_start_0.elapsed().as_nanos() as u64; + 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 patch_start_2 = Instant::now(); let r_patch = patch::run(data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + let patch_ns2 = patch_start_2.elapsed().as_nanos() as u64; + + let sched_start_2 = Instant::now(); let r_sched = sched::run(data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + let sched_ns2 = sched_start_2.elapsed().as_nanos() as u64; + 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:?}"); } + + PATCH_TOTAL_NS.fetch_add(patch_ns0 + patch_ns2, Ordering::Relaxed); + SCHED_TOTAL_NS.fetch_add(sched_ns0 + sched_ns2, Ordering::Relaxed); + + let runs = RUN_COUNT.fetch_add(1, Ordering::Relaxed) + 1; + if runs % PRINT_INTERVAL == 0 { + let patch_total_ms = PATCH_TOTAL_NS.load(Ordering::Relaxed) / 1_000_000; + let sched_total_ms = SCHED_TOTAL_NS.load(Ordering::Relaxed) / 1_000_000; + eprintln!( + "[timing] runs={runs} patch_vm_total={}ms sched_vm_total={}ms", + patch_total_ms, sched_total_ms + ); + } }); From b65e8b592b767d9f2a6c461aeb8f464cda33392c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 4 Mar 2026 02:29:39 +0000 Subject: [PATCH 3/3] Move VM execution timing to main.rs, revert fuzz target Co-authored-by: gpBlockchain <32102187+gpBlockchain@users.noreply.github.com> --- fuzz/fuzz_targets/fuzz_tx_consistency.rs | 35 ++---------------------- src/main.rs | 16 +++++++++++ 2 files changed, 18 insertions(+), 33 deletions(-) diff --git a/fuzz/fuzz_targets/fuzz_tx_consistency.rs b/fuzz/fuzz_targets/fuzz_tx_consistency.rs index 7591fc9..6f78eb1 100644 --- a/fuzz/fuzz_targets/fuzz_tx_consistency.rs +++ b/fuzz/fuzz_targets/fuzz_tx_consistency.rs @@ -1,55 +1,24 @@ #![no_main] -use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering}; -use std::time::Instant; +use std::sync::atomic::{AtomicUsize, Ordering}; use libfuzzer_sys::fuzz_target; use schedfuzz::{patch, sched}; static INCONSISTENCY_COUNT: AtomicUsize = AtomicUsize::new(0); -static RUN_COUNT: AtomicUsize = AtomicUsize::new(0); -static PATCH_TOTAL_NS: AtomicU64 = AtomicU64::new(0); -static SCHED_TOTAL_NS: AtomicU64 = AtomicU64::new(0); - -const PRINT_INTERVAL: usize = 1000; fuzz_target!(|data: &[u8]| { - // Individual run durations will not exceed u64::MAX nanoseconds (~584 years), so truncation is safe. - let patch_start_0 = Instant::now(); + // Fuzzed code goes here let r_patch = patch::run(data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); - let patch_ns0 = patch_start_0.elapsed().as_nanos() as u64; - - let sched_start_0 = Instant::now(); let r_sched = sched::run(data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); - let sched_ns0 = sched_start_0.elapsed().as_nanos() as u64; - 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 patch_start_2 = Instant::now(); let r_patch = patch::run(data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); - let patch_ns2 = patch_start_2.elapsed().as_nanos() as u64; - - let sched_start_2 = Instant::now(); let r_sched = sched::run(data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); - let sched_ns2 = sched_start_2.elapsed().as_nanos() as u64; - 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:?}"); } - - PATCH_TOTAL_NS.fetch_add(patch_ns0 + patch_ns2, Ordering::Relaxed); - SCHED_TOTAL_NS.fetch_add(sched_ns0 + sched_ns2, Ordering::Relaxed); - - let runs = RUN_COUNT.fetch_add(1, Ordering::Relaxed) + 1; - if runs % PRINT_INTERVAL == 0 { - let patch_total_ms = PATCH_TOTAL_NS.load(Ordering::Relaxed) / 1_000_000; - let sched_total_ms = SCHED_TOTAL_NS.load(Ordering::Relaxed) / 1_000_000; - eprintln!( - "[timing] runs={runs} patch_vm_total={}ms sched_vm_total={}ms", - patch_total_ms, sched_total_ms - ); - } }); diff --git a/src/main.rs b/src/main.rs index 4ae489c..ce89a33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,13 +12,22 @@ fn main() -> Result<(), Box> { let mut failed_corpus_v1 = 0; let mut success_corpus_v1 = 0; + let mut patch_vm_total_ns: u128 = 0; + let mut sched_vm_total_ns: u128 = 0; + for directory in std::fs::read_dir(dir)? { let path = directory?.path(); // println!("{}", path.display()); let data = std::fs::read(path.clone())?; + let patch_start = std::time::Instant::now(); let r_patch = schedfuzz::patch::run(&data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + patch_vm_total_ns += patch_start.elapsed().as_nanos(); + + let sched_start = std::time::Instant::now(); let r_sched = schedfuzz::sched::run(&data, 0).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + sched_vm_total_ns += sched_start.elapsed().as_nanos(); + assert_eq!(r_patch, r_sched, "file path : {}", path.display()); match r_patch { Ok(_) => { @@ -29,8 +38,14 @@ fn main() -> Result<(), Box> { } } + let patch_start = std::time::Instant::now(); let r_patch = schedfuzz::patch::run(&data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + patch_vm_total_ns += patch_start.elapsed().as_nanos(); + + let sched_start = std::time::Instant::now(); let r_sched = schedfuzz::sched::run(&data, 2).map_err(|e| schedfuzz::normalize_error(format!("{:?}", e))); + sched_vm_total_ns += sched_start.elapsed().as_nanos(); + assert_eq!(r_patch, r_sched, "file path : {}", path.display()); match r_patch { Ok(_) => { @@ -43,6 +58,7 @@ fn main() -> Result<(), Box> { } println!("version data succ:{},failed:{}", success_corpus_v0, failed_corpus_v0); println!("version data1 succ:{},failed:{}", success_corpus_v1, failed_corpus_v1); + println!("patch_vm_total={}ms sched_vm_total={}ms", patch_vm_total_ns / 1_000_000, sched_vm_total_ns / 1_000_000); }; Ok(())