dtolnay / dissimilar

Diff library with semantic cleanup, based on Google's diff-match-patch

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Panic with some very different unicode inputs

badicsalex opened this issue · comments

Hi,

The following testcase panics for me:

#[test]
fn test_panic() {
    let a = "Az épületek építésére, javítására, fenntartására, átalakítására vagy elbontására vonatkozó építőmunkát, így különösen földkiemelést, földmunkát, tényleges építőmunkát, előre gyártott elemek össze- és szétszerelését, felszerelést vagy berendezést, átalakításokat, felújítást, javítást, szétszerelést, elbontást, karbantartást, fenntartást, festési és takarítási munkát végző munkáltatók esetében az e tevékenység keretében foglalkoztatott munkavállalóra – az (1) bekezdésben meghatározott feltételek tekintetében – az ágazatra vagy alágazatra kiterjedő hatályú kollektív szerződés rendelkezéseit kell alkalmazni.";
    let b = "Magyarország területén ideiglenesen foglalkoztatott munkavállaló kiküldetésekor felmerülő vagy Magyarország területén történő tartózkodás során, a szokásos munkavégzés helyétől eltérő munkahelyre küldés esetén az utazással, ellátással és szállással kapcsolatos költségekre fizetett juttatások vagy költségtérítés mértéke";
    let d = diff(a,b);
    assert!(!d.is_empty());
}

Backtrace:

---- test_panic stdout ----
thread 'test_panic' panicked at 'byte index 415 is not a char boundary; it is inside 'í' (bytes 414..416) of `Az épületek építésére, javítására, fenntartására, átalakítására vagy elbontására vonatkozó építőmunkát, így különösen földkiemelést, földmunkát, tényleges építőmunkát, előre gyártott elemek össze- és szétszerelését`[...]', src/range.rs:90:6
stack backtrace:
   0: rust_begin_unwind
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/std/src/panicking.rs:556:5
   1: core::panicking::panic_fmt
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/core/src/panicking.rs:142:14
   2: core::str::slice_error_fail_rt
   3: core::str::slice_error_fail
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/core/src/str/mod.rs:86:9
   4: core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/core/src/str/traits.rs:218:21
   5: core::str::traits::<impl core::ops::index::Index<I> for str>::index
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/core/src/str/traits.rs:65:9
   6: dissimilar::range::str
             at ./src/range.rs:90:6
   7: dissimilar::range::Range::chars
             at ./src/range.rs:54:9
   8: dissimilar::common_prefix
             at ./src/lib.rs:346:53
   9: dissimilar::cleanup_merge
             at ./src/lib.rs:803:49
  10: dissimilar::cleanup_semantic
             at ./src/lib.rs:574:9
  11: dissimilar::diff
             at ./src/lib.rs:129:5
  12: test::test_panic
             at ./tests/test.rs:46:13
  13: test::test_panic::{{closure}}
             at ./tests/test.rs:43:1
  14: core::ops::function::FnOnce::call_once
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/core/src/ops/function.rs:251:5
  15: core::ops::function::FnOnce::call_once
             at /rustc/57f097ea25f2c05f424fc9b9dc50dbd6d399845c/library/core/src/ops/function.rs:251:5

Even small changes to the original strings caused the panic to go away, so I couldn't minimize the repro, and I haven't investigated it any deeper than this.

Fixed in 1.0.6.