diff options
author | iximeow <me@iximeow.net> | 2025-04-13 19:40:12 -0700 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2025-04-13 19:40:12 -0700 |
commit | 5a1731a2584222cf3e2d66685f96f8dc43cd3542 (patch) | |
tree | c5975b420c6f6234e3ed8a550f163c2d45752c3e | |
parent | 6f10ec12b4c81e4d040b933b1e3ee01da5ac9a0c (diff) |
another fuzz victory!
-rw-r--r-- | fuzz/fuzz_targets/fresh-decode.rs | 4 | ||||
-rw-r--r-- | src/display.rs | 6 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | tests/from_brain.rs | 8 |
4 files changed, 17 insertions, 3 deletions
diff --git a/fuzz/fuzz_targets/fresh-decode.rs b/fuzz/fuzz_targets/fresh-decode.rs index 76a402e..a3da0ed 100644 --- a/fuzz/fuzz_targets/fresh-decode.rs +++ b/fuzz/fuzz_targets/fresh-decode.rs @@ -17,5 +17,9 @@ fuzz_target!(|data: &[u8]| { let mut words = yaxpeax_arch::U8Reader::new(data); let fresh_inst = decoder.decode(&mut words).expect("decoded before, can decode again"); assert_eq!(reused_inst, fresh_inst); + + let s = reused_inst.to_string(); + assert!(!s.contains("BUG")); + assert!(!s.contains("<invalid decode>")); } }); diff --git a/src/display.rs b/src/display.rs index 90dfca4..810d07f 100644 --- a/src/display.rs +++ b/src/display.rs @@ -294,7 +294,7 @@ impl fmt::Display for Instruction { Some(AssignMode::SetBit) => ("= setbit", true), }; write!(f, "{}({}){} {}{}{}{}", - self.opcode, self.dest.expect("unreachable; store has a destination"), + self.opcode, display_or_partial(self.dest.as_ref()), match self.flags.threads { Some(DomainHint::Same) => { ":st" }, Some(DomainHint::All) => { ":at" }, @@ -314,8 +314,8 @@ impl fmt::Display for Instruction { if SC_STORES.contains(&self.opcode) { write!(f, "{}({}, {}) = {}", self.opcode, - self.dest.expect("unreachable; store has a destination"), - self.alt_dest.expect("unreachable; store-conditional has a predicate reg"), + display_or_partial(self.dest.as_ref()), + display_or_partial(self.alt_dest.as_ref()), self.sources[0] )?; return Ok(()); @@ -2115,6 +2115,8 @@ fn decode_packet< current_word += 1; } + opcode_check!(extender.is_none()); + handler.on_decode_end(); Ok(()) diff --git a/tests/from_brain.rs b/tests/from_brain.rs index 9c33dbf..0c9be88 100644 --- a/tests/from_brain.rs +++ b/tests/from_brain.rs @@ -2468,3 +2468,11 @@ fn no_panic() { DecodeError::InvalidOpcode ); } +#[test] +fn display() { + // if there is only an extender and no instruction, return an error. + test_invalid( + &[252, 205, 99, 0], + DecodeError::InvalidOpcode + ); +} |