summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2025-04-13 19:40:12 -0700
committeriximeow <me@iximeow.net>2025-04-13 19:40:12 -0700
commit5a1731a2584222cf3e2d66685f96f8dc43cd3542 (patch)
treec5975b420c6f6234e3ed8a550f163c2d45752c3e
parent6f10ec12b4c81e4d040b933b1e3ee01da5ac9a0c (diff)
another fuzz victory!
-rw-r--r--fuzz/fuzz_targets/fresh-decode.rs4
-rw-r--r--src/display.rs6
-rw-r--r--src/lib.rs2
-rw-r--r--tests/from_brain.rs8
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(());
diff --git a/src/lib.rs b/src/lib.rs
index 6c89dec..3b816f9 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
+ );
+}