use crate::x86_filter_scan::auto_x86_filter_ranges;
use crate::{FilterKind, FilterSpec, Result};
use std::ops::Range;
const SCREEN_SAMPLE_LEN: usize = 128 * 1024;
const SCREEN_SAMPLE_ALIGNMENT: usize = 12;
const SCREEN_MARGIN_PERCENT: usize = 1;
const X86_CODE_COVERAGE_RATIO: (usize, usize) = (9, 10);
const X86_ASSUMED_REGIONS: u64 = 4;
pub(crate) const AUTO_DELTA_EDGE_SKIP: usize = 64;
const TABLE_SCAN_WINDOW: usize = 16 * 1024;
const MAX_TABLE_STRIDE: usize = 32;
const TABLE_STRIDE_NEAR: u8 = 2;
const TABLE_STRIDE_HIT_PERCENT: usize = 40;
const TABLE_STRIDE_TIE_PERCENT: usize = 95;
const MIN_TABLE_REGION: usize = 2 * TABLE_SCAN_WINDOW;
const TABLE_ASSUMED_REGIONS: u64 = 2;
pub(crate) trait FilterSearch {
type Options: Copy + PartialEq;
fn screened_kinds(&self, data: &[u8]) -> Vec<FilterKind>;
fn detects_x86(&self) -> bool {
true
}
fn max_delta_channels(&self) -> usize;
fn screen_options(&self, options: Self::Options) -> Self::Options {
options
}
fn filtered_bytes(&self, data: &[u8], filters: &[FilterSpec]) -> Result<Vec<u8>>;
fn encode_plain(
&self,
data: &[u8],
options: Self::Options,
progress: Option<&mut dyn FnMut(usize) -> bool>,
) -> Result<Vec<u8>>;
fn encode_filtered(
&self,
data: &[u8],
filters: &[FilterSpec],
options: Self::Options,
progress: Option<&mut dyn FnMut(usize) -> bool>,
) -> Result<Vec<u8>>;
}
fn borrow_progress<'a>(
progress: &'a mut Option<&mut dyn FnMut(usize) -> bool>,
) -> Option<&'a mut dyn FnMut(usize) -> bool> {
match progress {
Some(report) => Some(&mut **report),
None => None,
}
}
pub(crate) fn search_applies(data: &[u8]) -> bool {
!data.is_empty() && !is_text_like(data)
}
fn is_text_like(data: &[u8]) -> bool {
let sample_len = data.len().min(8192);
if sample_len == 0 {
return false;
}
let sample = &data[..sample_len];
let text_bytes = sample
.iter()
.filter(|&&byte| matches!(byte, b'\t' | b'\n' | b'\r' | 0x20..=0x7e))
.count();
text_bytes * 100 / sample_len >= 95
}
fn screen_wins(filtered: usize, baseline: usize) -> bool {
filtered * 100 < baseline * (100 - SCREEN_MARGIN_PERCENT)
}
fn screen_sample(data: &[u8]) -> &[u8] {
if data.len() <= SCREEN_SAMPLE_LEN {
return data;
}
let middle = (data.len() - SCREEN_SAMPLE_LEN) / 2;
let start = middle / SCREEN_SAMPLE_ALIGNMENT * SCREEN_SAMPLE_ALIGNMENT;
&data[start..start + SCREEN_SAMPLE_LEN]
}
struct ScreenedKind {
kind: FilterKind,
measured: Option<Vec<u8>>,
worth_a_range: bool,
}
#[derive(Default)]
struct ScreenOutcome {
kinds: Vec<ScreenedKind>,
plain: Option<Vec<u8>>,
}
fn screen_kinds<S: FilterSearch>(
search: &S,
data: &[u8],
options: S::Options,
) -> Result<ScreenOutcome> {
let sample = screen_sample(data);
let mut outcome = ScreenOutcome::default();
if sample.len() < SCREEN_SAMPLE_ALIGNMENT {
return Ok(outcome);
}
let screen_options = search.screen_options(options);
let measures_the_member = sample.len() == data.len() && screen_options == options;
let baseline = search.encode_plain(sample, screen_options, None)?;
for kind in search.screened_kinds(data) {
let filters = [FilterSpec::whole(kind)];
let packed = if measures_the_member {
search.encode_filtered(data, &filters, options, None)?
} else {
let transformed = search.filtered_bytes(sample, &filters)?;
search.encode_plain(&transformed, screen_options, None)?
};
let worth_a_range = screen_wins(packed.len(), baseline.len());
if measures_the_member {
outcome.kinds.push(ScreenedKind {
kind,
measured: Some(packed),
worth_a_range,
});
} else if worth_a_range {
outcome.kinds.push(ScreenedKind {
kind,
measured: None,
worth_a_range,
});
}
}
if measures_the_member {
outcome.plain = Some(baseline);
}
Ok(outcome)
}
fn x86_code_regions(data: &[u8]) -> Vec<Range<usize>> {
disjoint_filter_ranges(auto_x86_filter_ranges(data, true))
}
fn x86_screened_regions<S: FilterSearch>(
search: &S,
data: &[u8],
regions: &[Range<usize>],
options: S::Options,
) -> Result<X86Screen> {
let mut kept = Vec::new();
let mut helped = false;
for region in regions {
let sample = screen_sample(&data[region.clone()]);
if sample.len() < SCREEN_SAMPLE_ALIGNMENT {
kept.push((region.clone(), None));
continue;
}
let baseline = search.encode_plain(sample, options, None)?;
let transformed = search.filtered_bytes(sample, &[FilterSpec::whole(FilterKind::E8E9)])?;
let filtered = search.encode_plain(&transformed, options, None)?;
if filtered.len() > baseline.len() {
continue;
}
helped |= filtered.len() < baseline.len();
kept.push((region.clone(), Some(filtered.len())));
}
let rejected_a_region = kept.len() < regions.len();
if !helped {
return Ok(X86Screen::default());
}
let mut jumps_cost_more = false;
for (region, e8e9) in &kept {
let Some(e8e9) = *e8e9 else { continue };
let sample = screen_sample(&data[region.clone()]);
let e8_only = search.filtered_bytes(sample, &[FilterSpec::whole(FilterKind::E8)])?;
let e8_only = search.encode_plain(&e8_only, options, None)?;
jumps_cost_more |= e8_only.len() < e8e9;
}
Ok(X86Screen {
rejected_a_region,
kept: kept.into_iter().map(|(region, _)| region).collect(),
jumps_cost_more,
})
}
#[derive(Default)]
struct X86Screen {
kept: Vec<Range<usize>>,
rejected_a_region: bool,
jumps_cost_more: bool,
}
fn x86_finalists(data: &[u8], screen: &X86Screen) -> Vec<Vec<FilterSpec>> {
let regions = &screen.kept;
let covered: usize = regions.iter().map(|range| range.len()).sum();
let (numerator, denominator) = X86_CODE_COVERAGE_RATIO;
let sparse = covered * denominator < data.len() * numerator;
let rejected_a_region = screen.rejected_a_region;
let mut kinds = vec![FilterKind::E8E9];
if screen.jumps_cost_more {
kinds.push(FilterKind::E8);
}
let mut finalists = Vec::new();
for kind in kinds {
if rejected_a_region || sparse {
finalists.push(
regions
.iter()
.map(|range| FilterSpec::range(kind, range.clone()))
.collect(),
);
}
if !rejected_a_region {
finalists.push(vec![FilterSpec::whole(kind)]);
}
}
finalists
}
fn table_stride(window: &[u8], max_stride: usize) -> Option<usize> {
if max_stride == 0 || window.len() < max_stride * 8 {
return None;
}
let mut hits = [0usize; MAX_TABLE_STRIDE + 1];
for index in max_stride..window.len() {
let byte = window[index];
for stride in 1..=max_stride {
let diff = (byte.wrapping_sub(window[index - stride]) as i8).unsigned_abs();
hits[stride] += usize::from(diff <= TABLE_STRIDE_NEAR);
}
}
let total = window.len() - max_stride;
let best = *hits[1..=max_stride]
.iter()
.max()
.expect("there is at least one stride");
if best * 100 < total * TABLE_STRIDE_HIT_PERCENT {
return None;
}
(1..=max_stride).find(|&stride| hits[stride] * 100 >= best * TABLE_STRIDE_TIE_PERCENT)
}
fn delta_table_regions(data: &[u8], max_stride: usize) -> Vec<(Range<usize>, usize)> {
let max_stride = max_stride.min(MAX_TABLE_STRIDE);
let mut regions: Vec<(Range<usize>, usize)> = Vec::new();
for start in (0..).map(|window| window * TABLE_SCAN_WINDOW) {
let Some(window) = data.get(start..start + TABLE_SCAN_WINDOW) else {
break;
};
let Some(stride) = table_stride(window, max_stride) else {
continue;
};
match regions.last_mut() {
Some((last, last_stride)) if *last_stride == stride && last.end == start => {
last.end = start + TABLE_SCAN_WINDOW;
}
_ => regions.push((start..start + TABLE_SCAN_WINDOW, stride)),
}
}
regions.retain(|(range, _)| range.len() >= MIN_TABLE_REGION);
regions
}
fn table_screened_regions<S: FilterSearch>(
search: &S,
data: &[u8],
regions: &[(Range<usize>, usize)],
options: S::Options,
) -> Result<Vec<(Range<usize>, usize)>> {
let screen_options = search.screen_options(options);
let mut kept = Vec::new();
for (region, stride) in regions {
let sample = screen_sample(&data[region.clone()]);
if sample.len() < SCREEN_SAMPLE_ALIGNMENT {
continue;
}
let baseline = search.encode_plain(sample, screen_options, None)?;
let filters = [FilterSpec::whole(FilterKind::Delta { channels: *stride })];
let transformed = search.filtered_bytes(sample, &filters)?;
let filtered = search.encode_plain(&transformed, screen_options, None)?;
if screen_wins(filtered.len(), baseline.len()) {
kept.push((region.clone(), *stride));
}
}
Ok(kept)
}
fn subtract_ranges(range: Range<usize>, removed: &[Range<usize>]) -> Vec<Range<usize>> {
let mut kept = Vec::new();
let mut start = range.start;
for cut in removed {
if cut.end <= start {
continue;
}
if cut.start >= range.end {
break;
}
if cut.start > start {
kept.push(start..cut.start);
}
start = start.max(cut.end);
}
if start < range.end {
kept.push(start..range.end);
}
kept
}
fn graft_tables(
specs: Vec<FilterSpec>,
tables: &[(Range<usize>, usize)],
member: usize,
) -> Vec<FilterSpec> {
if tables.is_empty() {
return specs;
}
let table_ranges: Vec<Range<usize>> = tables.iter().map(|(range, _)| range.clone()).collect();
let mut grafted: Vec<FilterSpec> = specs
.into_iter()
.flat_map(|spec| {
let covered = spec.range.clone().unwrap_or(0..member);
subtract_ranges(covered, &table_ranges)
.into_iter()
.map(move |range| FilterSpec::range(spec.kind, range))
})
.collect();
grafted.extend(tables.iter().map(|(range, stride)| {
FilterSpec::range(FilterKind::Delta { channels: *stride }, range.clone())
}));
grafted.sort_by_key(|spec| spec.range.as_ref().map_or(0, |range| range.start));
grafted
}
#[allow(clippy::type_complexity)]
fn finalists<S: FilterSearch>(
search: &S,
data: &[u8],
options: S::Options,
) -> Result<Vec<(Vec<FilterSpec>, Option<Vec<u8>>)>> {
let screen = screen_kinds(search, data, options)?;
let mut finalists = vec![(Vec::new(), screen.plain)];
let table_regions = delta_table_regions(data, search.max_delta_channels());
let tables = table_screened_regions(search, data, &table_regions, options)?;
let mut tables_carried = false;
if search.detects_x86() {
let screen = x86_screened_regions(search, data, &x86_code_regions(data), options)?;
if !screen.kept.is_empty() {
tables_carried = !tables.is_empty();
finalists.extend(
x86_finalists(data, &screen)
.into_iter()
.map(|specs| (graft_tables(specs, &tables, data.len()), None)),
);
}
}
if !tables.is_empty() && !tables_carried {
finalists.push((graft_tables(Vec::new(), &tables, data.len()), None));
}
for screened in screen.kinds {
finalists.push((vec![FilterSpec::whole(screened.kind)], screened.measured));
if let (true, FilterKind::Delta { channels }) = (screened.worth_a_range, screened.kind) {
if let Some(range) = auto_delta_filter_range(data, channels) {
finalists.push((vec![FilterSpec::range(screened.kind, range)], None));
}
}
}
Ok(finalists)
}
pub(crate) fn choose_filter<S: FilterSearch>(
search: &S,
data: &[u8],
options: S::Options,
mut progress: Option<&mut dyn FnMut(usize) -> bool>,
) -> Result<(Vec<FilterSpec>, Vec<u8>)> {
let mut best: Option<(Vec<FilterSpec>, Vec<u8>)> = None;
for (specs, measured) in finalists(search, data, options)? {
let packed = match measured {
Some(packed) => packed,
None if specs.is_empty() => {
search.encode_plain(data, options, borrow_progress(&mut progress))?
}
None => {
search.encode_filtered(data, &specs, options, borrow_progress(&mut progress))?
}
};
if best
.as_ref()
.is_none_or(|(_, best): &(_, Vec<u8>)| packed.len() < best.len())
{
best = Some((specs, packed));
}
}
Ok(best.expect("the unfiltered member is always a finalist"))
}
pub(crate) fn walk_bytes<S: FilterSearch>(
search: &S,
data: &[u8],
encoder_candidates: usize,
) -> u64 {
let member = data.len() as u64;
let encoder_candidates = encoder_candidates.max(1) as u64;
let sample = screen_sample(data).len() as u64;
let screened = search.screened_kinds(data).len() as u64;
let (x86_screen, x86_finalists) = if search.detects_x86() {
((sample * X86_ASSUMED_REGIONS).min(member) * 2, 2)
} else {
(0, 0)
};
let table_screen = (sample * TABLE_ASSUMED_REGIONS).min(member) * 2;
let screen = sample * (screened + 1) + x86_screen + table_screen;
let finalists = if sample == member {
x86_finalists
} else {
2 + x86_finalists
};
screen + member * (finalists + encoder_candidates - 1)
}
pub(crate) fn auto_delta_filter_range(data: &[u8], channels: usize) -> Option<Range<usize>> {
if channels == 0 || data.len() <= AUTO_DELTA_EDGE_SKIP * 2 + channels * 8 {
return None;
}
let start = AUTO_DELTA_EDGE_SKIP;
let end = data.len() - AUTO_DELTA_EDGE_SKIP;
let aligned_start = start + ((channels - start % channels) % channels);
let aligned_end = end - (end - aligned_start) % channels;
(aligned_start + channels * 8 <= aligned_end).then_some(aligned_start..aligned_end)
}
pub(crate) fn disjoint_filter_ranges(mut ranges: Vec<Range<usize>>) -> Vec<Range<usize>> {
ranges.sort_by_key(|range| (range.start, range.end));
let mut disjoint: Vec<Range<usize>> = Vec::new();
for range in ranges {
if let Some(last) = disjoint.last_mut() {
if range.start <= last.end {
last.end = last.end.max(range.end);
continue;
}
}
disjoint.push(range);
}
disjoint
}
#[cfg(test)]
mod tests {
use super::*;
use crate::codec::rar50::{
encode_lz_member_with_options, encode_lz_member_with_options_and_progress, EncodeOptions,
Unpack50Encoder,
};
#[derive(Clone, Copy)]
struct TestSearch {
cheap_screens: bool,
}
impl FilterSearch for TestSearch {
type Options = EncodeOptions;
fn screened_kinds(&self, _data: &[u8]) -> Vec<FilterKind> {
vec![
FilterKind::Arm,
FilterKind::Delta { channels: 1 },
FilterKind::Delta { channels: 2 },
FilterKind::Delta { channels: 3 },
FilterKind::Delta { channels: 4 },
]
}
fn max_delta_channels(&self) -> usize {
crate::codec::rar50::MAX_DELTA_CHANNELS
}
fn filtered_bytes(&self, data: &[u8], filters: &[FilterSpec]) -> Result<Vec<u8>> {
crate::codec::rar50::filtered_lz_member(data, filters)
.map(|(filtered, _)| filtered)
.map_err(crate::Error::from)
}
fn screen_options(&self, options: EncodeOptions) -> EncodeOptions {
if self.cheap_screens {
EncodeOptions::new(4).with_max_match_distance(options.max_match_distance)
} else {
options
}
}
fn encode_plain(
&self,
data: &[u8],
options: EncodeOptions,
progress: Option<&mut dyn FnMut(usize) -> bool>,
) -> Result<Vec<u8>> {
match progress {
Some(progress) => {
encode_lz_member_with_options_and_progress(data, 0, options, progress)
}
None => encode_lz_member_with_options(data, 0, options),
}
.map_err(crate::Error::from)
}
fn encode_filtered(
&self,
data: &[u8],
filters: &[FilterSpec],
options: EncodeOptions,
_progress: Option<&mut dyn FnMut(usize) -> bool>,
) -> Result<Vec<u8>> {
Unpack50Encoder::with_options(options)
.encode_member_with_filters(data, 0, filters)
.map_err(crate::Error::from)
}
}
const FULL: TestSearch = TestSearch {
cheap_screens: false,
};
fn options() -> EncodeOptions {
EncodeOptions::new(64).with_max_match_distance(128 * 1024)
}
fn interleaved_counters() -> Vec<u8> {
let mut data = Vec::new();
for index in 0..20_000u32 {
data.push(0xe8);
data.extend_from_slice(&index.to_le_bytes());
data.extend_from_slice(b"\x55\x89\xe5");
}
data
}
fn incompressible(len: usize) -> Vec<u8> {
let mut state = 0x2545_f491_4f6c_dd1du64;
std::iter::repeat_with(|| {
state ^= state << 13;
state ^= state >> 7;
state ^= state << 17;
state as u8
})
.take(len)
.collect()
}
#[test]
fn the_screen_keeps_a_delta_width_that_pays_off() {
let kinds: Vec<_> = screen_kinds(&FULL, &interleaved_counters(), options())
.unwrap()
.kinds
.into_iter()
.map(|screened| screened.kind)
.collect();
assert!(
kinds.contains(&FilterKind::Delta { channels: 4 }),
"delta 4 turns this into planes of constants, so it has to survive: {kinds:?}"
);
}
#[test]
fn the_screen_rejects_filters_on_incompressible_data() {
assert!(
screen_kinds(&FULL, &incompressible(400_000), options())
.unwrap()
.kinds
.is_empty(),
"nothing helps random bytes, and finding that out must not cost whole-member encodes"
);
}
#[test]
fn a_short_member_is_measured_by_the_screen_rather_than_encoded_twice() {
let data = interleaved_counters()[..100_000].to_vec();
assert!(data.len() <= SCREEN_SAMPLE_LEN);
let screen = screen_kinds(&FULL, &data, options()).unwrap();
assert!(screen.plain.is_some(), "the unfiltered encode is reusable");
assert_eq!(
screen.kinds.len(),
FULL.screened_kinds(&data).len(),
"a kind the screen has already encoded is worth keeping whether or \
not it won by the margin"
);
for screened in &screen.kinds {
let measured = screened
.measured
.as_ref()
.unwrap_or_else(|| panic!("{:?} came back without its bytes", screened.kind));
let written = FULL
.encode_filtered(&data, &[FilterSpec::whole(screened.kind)], options(), None)
.unwrap();
assert_eq!(*measured, written, "{:?}", screened.kind);
}
}
#[test]
fn cheaper_screens_are_not_reused_as_measurements() {
let data = interleaved_counters()[..100_000].to_vec();
let cheap = TestSearch {
cheap_screens: true,
};
let screen = screen_kinds(&cheap, &data, options()).unwrap();
assert!(screen.plain.is_none());
assert!(screen
.kinds
.iter()
.all(|screened| screened.measured.is_none()));
}
fn x86_like(len: usize) -> Vec<u8> {
let mut state = 0x2545_f491u32;
let mut data = Vec::with_capacity(len);
while data.len() < len {
state = state.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
if state.is_multiple_of(11) {
let target = 0x4000u32 + (state >> 28) * 0x400;
data.push(0xe8);
data.extend_from_slice(&target.to_le_bytes());
} else {
data.extend_from_slice(&[0x48, 0x89, (state >> 16) as u8, 0xe5]);
}
}
data.truncate(len);
data
}
#[test]
fn the_screen_finds_a_filter_worth_having_on_a_sampled_member() {
let data = x86_like(SCREEN_SAMPLE_LEN * 4);
let (specs, packed) = choose_filter(&FULL, &data, options(), None).unwrap();
let plain = FULL.encode_plain(&data, options(), None).unwrap();
assert!(
!specs.is_empty(),
"the search left the filter on the table: {} against {} unfiltered",
packed.len(),
plain.len()
);
assert!(packed.len() < plain.len());
}
fn calls_to_fixed_addresses(len: usize) -> Vec<u8> {
const BODIES: [[u8; 11]; 4] = [
[
0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xec, 0x20, 0x89, 0x7d, 0xfc,
],
[
0x48, 0x8b, 0x45, 0xf8, 0x48, 0x8b, 0x00, 0x48, 0x89, 0xc7, 0x90,
],
[
0x8b, 0x45, 0xfc, 0x83, 0xc0, 0x01, 0x89, 0x45, 0xfc, 0x66, 0x90,
],
[
0x48, 0x8d, 0x35, 0x00, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x0f, 0x1f,
],
];
let mut state = 0x2545_f491u32;
let mut data = Vec::with_capacity(len);
while data.len() < len {
state = state.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
data.extend_from_slice(&BODIES[(state >> 28) as usize % BODIES.len()]);
let target = 0x0010_0000u32 + ((state >> 24) & 7) * 0x400;
let call_end = (data.len() + 5) as u32;
data.push(0xe8);
data.extend_from_slice(&target.wrapping_sub(call_end).to_le_bytes());
}
data.truncate(len);
data
}
fn debug_like(len: usize) -> Vec<u8> {
const WORDS: [&[u8]; 6] = [
b"_ZN4llvm12FunctionPassE",
b"/usr/include/c++/14/bits/",
b"DW_AT_decl_file",
b"unsigned long long int",
b"__gnu_cxx::__normal_iterator",
b"DW_TAG_subprogram",
];
let mut state = 0x9e37_79b9u32;
let mut data = Vec::with_capacity(len);
while data.len() < len {
state = state.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
if state.is_multiple_of(37) {
data.push(0xe8);
data.extend_from_slice(
&(0x0004_0000u32 + ((state >> 20) & 3) * 0x40).to_le_bytes(),
);
} else {
data.extend_from_slice(WORDS[(state >> 28) as usize % WORDS.len()]);
data.push(0);
data.extend_from_slice(&state.rotate_left(7).to_le_bytes());
}
}
data.truncate(len);
data
}
fn code_then_debug() -> (Vec<u8>, usize) {
let code_len = 132 * 1024;
let gap = 48 * 1024;
let mut data = calls_to_fixed_addresses(code_len);
data.resize(code_len + gap, 0x5a);
data.extend_from_slice(&debug_like(220 * 1024));
(data, code_len)
}
#[test]
fn the_x86_screen_looks_past_the_largest_region_to_the_code() {
let (data, code_len) = code_then_debug();
let regions = x86_code_regions(&data);
let largest = regions
.iter()
.max_by_key(|range| range.len())
.expect("the scanner has to find something");
assert!(
largest.start >= code_len,
"this proves nothing unless the debug section is the largest region: {regions:?}"
);
let screen = x86_screened_regions(&FULL, &data, ®ions, options()).unwrap();
assert_eq!(
screen.kept.len(),
1,
"the code region is the only one worth filtering: {:?}",
screen.kept
);
assert!(
screen.kept[0].end <= code_len + 1024,
"kept {:?}",
screen.kept
);
assert!(screen.rejected_a_region);
}
#[test]
fn the_jump_opcodes_are_priced_on_a_sample_before_they_earn_an_encode() {
let (data, _) = code_then_debug();
let regions = x86_code_regions(&data);
let screen = x86_screened_regions(&FULL, &data, ®ions, options()).unwrap();
let kinds: Vec<_> = x86_finalists(&data, &screen)
.iter()
.map(|specs| specs[0].kind)
.collect();
assert!(!screen.jumps_cost_more, "{kinds:?}");
assert_eq!(
kinds,
[FilterKind::E8E9],
"the E8-only candidate cost an encode nothing asked for"
);
}
#[test]
fn the_search_filters_the_code_in_an_unstripped_binary() {
let (data, _) = code_then_debug();
let plain = FULL.encode_plain(&data, options(), None).unwrap();
let (specs, packed) = choose_filter(&FULL, &data, options(), None).unwrap();
assert!(
matches!(
specs.as_slice(),
[FilterSpec {
kind: FilterKind::E8E9 | FilterKind::E8,
range: Some(_)
}]
),
"expected a ranged x86 filter, got {specs:?} at {} against {} unfiltered",
packed.len(),
plain.len()
);
assert!(packed.len() * 100 < plain.len() * 97);
}
fn reloc_table(records: usize) -> Vec<u8> {
let mut data = Vec::with_capacity(records * 24);
for index in 0..records as u64 {
data.extend_from_slice(&(0x7f80_1234_0000 + index * 24).to_le_bytes());
data.extend_from_slice(&0x0102_0304_0506_0708u64.to_le_bytes());
data.extend_from_slice(&(0x4455_6677_0000 | ((index * 7) & 0xffff)).to_le_bytes());
}
data
}
#[test]
fn a_struct_table_scans_as_its_record_stride() {
let data = reloc_table(20_000);
let regions = delta_table_regions(&data, MAX_TABLE_STRIDE);
assert_eq!(regions.len(), 1, "{regions:?}");
let (region, stride) = ®ions[0];
assert_eq!(*stride, 24, "the record size is the shortest true period");
assert!(
region.len() * 10 >= data.len() * 9,
"the region has to cover the table: {region:?} of {}",
data.len()
);
}
#[test]
fn text_and_random_bytes_do_not_scan_as_tables() {
for data in [
b"the quick brown fox jumps over the lazy dog ".repeat(6_000),
incompressible(256 * 1024),
] {
assert_eq!(
delta_table_regions(&data, MAX_TABLE_STRIDE),
vec![],
"{} bytes",
data.len()
);
}
}
fn variable_length_code(len: usize) -> Vec<u8> {
const INSTRUCTIONS: [&[u8]; 7] = [
&[0x55], &[0x48, 0x89, 0xe5], &[0x8b, 0x45, 0xfc], &[0x48, 0x83, 0xec, 0x20], &[0x0f, 0xb6, 0x54, 0x18, 0x01], &[0x48, 0x8d, 0x35, 0x12, 0x00, 0x00, 0x00], &[0x66, 0x0f, 0x1f, 0x84, 0x00, 0, 0, 0, 0], ];
let mut state = 0x2545_f491u32;
let mut data = Vec::with_capacity(len);
while data.len() < len {
state = state.wrapping_mul(1_664_525).wrapping_add(1_013_904_223);
data.extend_from_slice(INSTRUCTIONS[(state >> 27) as usize % INSTRUCTIONS.len()]);
}
data.truncate(len);
data
}
#[test]
fn real_shaped_code_does_not_scan_as_a_table() {
let data = variable_length_code(256 * 1024);
assert_eq!(
delta_table_regions(&data, MAX_TABLE_STRIDE),
vec![],
"variable-length instructions have no record stride to find"
);
}
#[test]
fn code_never_reaches_the_encoder_as_a_delta_candidate() {
for data in [
variable_length_code(256 * 1024),
calls_to_fixed_addresses(256 * 1024),
] {
let regions = delta_table_regions(&data, MAX_TABLE_STRIDE);
assert_eq!(
table_screened_regions(&FULL, &data, ®ions, options()).unwrap(),
vec![],
"the screen let a delta filter onto code: {regions:?}"
);
}
}
#[test]
fn the_scan_stays_inside_what_the_format_can_encode() {
let data = reloc_table(20_000);
assert_eq!(delta_table_regions(&data, MAX_TABLE_STRIDE)[0].1, 24);
for (region, stride) in delta_table_regions(&data, 8) {
assert!(stride <= 8, "{region:?} asked for {stride} channels");
}
assert_eq!(delta_table_regions(&data, 0), vec![]);
}
#[test]
fn a_run_of_constant_bytes_screens_out_of_the_table_regions() {
let data = vec![0u8; 200 * 1024];
let regions = delta_table_regions(&data, MAX_TABLE_STRIDE);
assert!(!regions.is_empty(), "the scanner sees repetition in a run");
assert_eq!(
table_screened_regions(&FULL, &data, ®ions, options()).unwrap(),
vec![]
);
}
#[test]
fn subtracting_ranges_cuts_the_tables_out_of_the_code() {
assert_eq!(
subtract_ranges(0..1000, &[200..300, 600..700]),
vec![0..200, 300..600, 700..1000]
);
assert_eq!(
subtract_ranges(100..200, &[0..250, 300..400]),
Vec::<Range<usize>>::new()
);
assert_eq!(
subtract_ranges(100..200, &[0..50, 300..400]),
vec![100..200]
);
assert_eq!(
subtract_ranges(100..200, &[150..400, 500..600]),
vec![100..150]
);
}
#[test]
fn the_search_deltas_the_table_inside_a_binary() {
let code_len = 132 * 1024;
let mut data = calls_to_fixed_addresses(code_len);
let table_start = data.len();
data.extend_from_slice(&reloc_table(20_000));
let plain = FULL.encode_plain(&data, options(), None).unwrap();
let (specs, packed) = choose_filter(&FULL, &data, options(), None).unwrap();
let delta = specs
.iter()
.find(|spec| matches!(spec.kind, FilterKind::Delta { channels: 24 }))
.unwrap_or_else(|| panic!("no stride-24 delta among {specs:?}"));
let range = delta.range.clone().expect("the table filter is ranged");
assert!(
range.start >= table_start.saturating_sub(TABLE_SCAN_WINDOW)
&& range.start < table_start + TABLE_SCAN_WINDOW,
"the filter starts at the table, not the code: {range:?} against {table_start}"
);
for spec in &specs {
let other = spec.range.clone().expect("every spec here is ranged");
assert!(
spec == delta || other.end <= range.start || other.start >= range.end,
"{specs:?} overlap"
);
}
assert!(
packed.len() * 100 < plain.len() * 90,
"the table filter is worth a lot more than this: {} against {}",
packed.len(),
plain.len()
);
}
#[test]
fn grafting_cuts_the_tables_out_of_whatever_the_specs_covered() {
let tables = [(200..300, 24), (600..700, 8)];
assert_eq!(
graft_tables(vec![FilterSpec::whole(FilterKind::E8E9)], &tables, 1000),
vec![
FilterSpec::range(FilterKind::E8E9, 0..200),
FilterSpec::range(FilterKind::Delta { channels: 24 }, 200..300),
FilterSpec::range(FilterKind::E8E9, 300..600),
FilterSpec::range(FilterKind::Delta { channels: 8 }, 600..700),
FilterSpec::range(FilterKind::E8E9, 700..1000),
]
);
assert_eq!(
graft_tables(Vec::new(), &tables[..1], 1000),
vec![FilterSpec::range(
FilterKind::Delta { channels: 24 },
200..300
)]
);
let code_only = vec![FilterSpec::range(FilterKind::E8, 0..100)];
assert_eq!(graft_tables(code_only.clone(), &[], 1000), code_only);
}
#[test]
fn the_winner_filters_the_code_and_deltas_the_table_in_one_member() {
let (mut data, code_len) = code_then_debug();
let table_start = data.len();
data.extend_from_slice(&reloc_table(20_000));
let (specs, _) = choose_filter(&FULL, &data, options(), None).unwrap();
let filters_the_code = specs.iter().any(|spec| {
matches!(spec.kind, FilterKind::E8 | FilterKind::E8E9)
&& spec
.range
.as_ref()
.is_some_and(|range| range.start < code_len)
});
let deltas_the_table = specs.iter().any(|spec| {
matches!(spec.kind, FilterKind::Delta { channels: 24 })
&& spec
.range
.as_ref()
.is_some_and(|range| range.start >= table_start - TABLE_SCAN_WINDOW)
});
assert!(
filters_the_code && deltas_the_table,
"one of the two regions went unfiltered: {specs:?}"
);
}
#[test]
fn the_search_never_loses_to_no_filter() {
for data in [
interleaved_counters(),
b"the quick brown fox ".repeat(20_000),
(0..300_000u32).map(|index| (index / 3) as u8).collect(),
incompressible(200_000),
] {
let plain = FULL.encode_plain(&data, options(), None).unwrap();
let (specs, packed) = choose_filter(&FULL, &data, options(), None).unwrap();
assert!(
packed.len() <= plain.len(),
"{specs:?} came out at {} against {} unfiltered",
packed.len(),
plain.len()
);
}
}
#[test]
fn the_screen_sample_sits_in_the_middle_and_keeps_delta_planes_aligned() {
let data = vec![0u8; 5 * SCREEN_SAMPLE_LEN + 7];
let sample = screen_sample(&data);
assert_eq!(sample.len(), SCREEN_SAMPLE_LEN);
let start = sample.as_ptr() as usize - data.as_ptr() as usize;
assert_eq!(start % SCREEN_SAMPLE_ALIGNMENT, 0);
assert!(start > 0 && start + sample.len() < data.len());
}
#[test]
fn a_ranged_delta_filter_skips_container_edges_and_aligns_planes() {
let data = vec![0u8; 512];
let range = auto_delta_filter_range(&data, 3).unwrap();
assert!(range.start >= AUTO_DELTA_EDGE_SKIP);
assert!(range.end <= data.len() - AUTO_DELTA_EDGE_SKIP);
assert_eq!(range.start % 3, 0);
assert_eq!((range.end - range.start) % 3, 0);
assert!(auto_delta_filter_range(&data[..80], 3).is_none());
}
#[test]
fn overlapping_ranges_merge_rather_than_drop() {
assert_eq!(
disjoint_filter_ranges(vec![0..100, 50..200, 400..500]),
vec![0..200, 400..500]
);
assert_eq!(disjoint_filter_ranges(vec![0..100, 100..200]), vec![0..200]);
}
}