Skip to content

Commit 436836f

Browse files
committed
Track position where normalization failed
1 parent ec98c83 commit 436836f

File tree

4 files changed

+182
-103
lines changed

4 files changed

+182
-103
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ exclude = ["target/*", "Cargo.lock", "scripts/tmp", "*.txt", "tests/*"]
3737
version = "1"
3838
features = ["alloc"]
3939

40-
4140
[features]
4241
default = ["std"]
43-
std = []
42+
std = ["error"]
43+
error = []

fuzz/fuzz_targets/unicode-normalization.rs

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,74 +4,66 @@
44
extern crate libfuzzer_sys;
55

66
use unicode_normalization::{
7-
is_nfc, is_nfc_quick, is_nfc_stream_safe, is_nfc_stream_safe_quick, is_nfd, is_nfd_quick,
8-
is_nfd_stream_safe, is_nfd_stream_safe_quick, is_nfkc, is_nfkc_quick, is_nfkd, is_nfkd_quick,
9-
IsNormalized, UnicodeNormalization,
7+
check_nfc_quick, check_nfc_stream_safe_quick, check_nfd_quick, check_nfd_stream_safe_quick,
8+
check_nfkc_quick, check_nfkd_quick, is_nfc, is_nfc_stream_safe, is_nfd, is_nfd_stream_safe,
9+
is_nfkc, is_nfkd, UnicodeNormalization,
1010
};
1111

12-
fn from_bool(is_normalized: bool) -> IsNormalized {
13-
if is_normalized {
14-
IsNormalized::Yes
15-
} else {
16-
IsNormalized::No
17-
}
18-
}
19-
2012
fuzz_target!(|input: String| {
2113
// The full predicates imply the quick predicates.
22-
assert_ne!(is_nfc_quick(input.chars()), from_bool(!is_nfc(&input)));
23-
assert_ne!(is_nfd_quick(input.chars()), from_bool(!is_nfd(&input)));
24-
assert_ne!(is_nfkc_quick(input.chars()), from_bool(!is_nfkc(&input)));
25-
assert_ne!(is_nfkd_quick(input.chars()), from_bool(!is_nfkd(&input)));
26-
assert_ne!(
27-
is_nfc_stream_safe_quick(input.chars()),
28-
from_bool(!is_nfc_stream_safe(&input))
14+
assert_eq!(check_nfc_quick(&input).is_ok(), is_nfc(&input));
15+
assert_eq!(check_nfd_quick(&input).is_ok(), is_nfd(&input));
16+
assert_eq!(check_nfkc_quick(&input).is_ok(), is_nfkc(&input));
17+
assert_eq!(check_nfkd_quick(&input).is_ok(), is_nfkd(&input));
18+
assert_eq!(
19+
check_nfc_stream_safe_quick(&input).is_ok(),
20+
is_nfc_stream_safe(&input)
2921
);
30-
assert_ne!(
31-
is_nfd_stream_safe_quick(input.chars()),
32-
from_bool(!is_nfd_stream_safe(&input))
22+
assert_eq!(
23+
check_nfd_stream_safe_quick(&input).is_ok(),
24+
is_nfd_stream_safe(&input)
3325
);
3426

3527
// Check NFC, NFD, NFKC, and NFKD normalization.
36-
let nfc = input.chars().nfc().collect::<String>();
28+
let nfc = input.nfc().collect::<String>();
3729
assert_eq!(nfc.is_empty(), input.is_empty());
38-
assert_ne!(is_nfc_quick(nfc.chars()), IsNormalized::No);
30+
assert!(check_nfc_quick(&nfc).is_ok());
3931
assert!(is_nfc(&nfc));
4032

41-
let nfd = input.chars().nfd().collect::<String>();
33+
let nfd = input.nfd().collect::<String>();
4234
assert!(nfd.len() >= nfc.len());
43-
assert_ne!(is_nfd_quick(nfd.chars()), IsNormalized::No);
35+
assert!(check_nfd_quick(&nfd).is_ok());
4436
assert!(is_nfd(&nfd));
4537

46-
let nfkc = input.chars().nfkc().collect::<String>();
38+
let nfkc = input.nfkc().collect::<String>();
4739
assert_eq!(nfkc.is_empty(), input.is_empty());
48-
assert_ne!(is_nfkc_quick(nfkc.chars()), IsNormalized::No);
40+
assert!(check_nfkc_quick(&nfkc).is_ok());
4941
assert!(is_nfkc(&nfkc));
5042

51-
let nfkd = input.chars().nfkd().collect::<String>();
43+
let nfkd = input.nfkd().collect::<String>();
5244
assert!(nfkd.len() >= nfkc.len());
53-
assert_ne!(is_nfkd_quick(nfkd.chars()), IsNormalized::No);
45+
assert!(check_nfkd_quick(&nfkd).is_ok());
5446
assert!(is_nfkd(&nfkd));
5547

5648
// Check stream-safe.
57-
let nfc_ss = nfc.chars().stream_safe().collect::<String>();
49+
let nfc_ss = nfc.stream_safe().collect::<String>();
5850
assert!(nfc_ss.len() >= nfc.len());
59-
assert_ne!(is_nfc_stream_safe_quick(nfc_ss.chars()), IsNormalized::No);
51+
assert!(check_nfc_stream_safe_quick(&nfc_ss).is_ok());
6052
assert!(is_nfc_stream_safe(&nfc_ss));
6153

62-
let nfd_ss = nfd.chars().stream_safe().collect::<String>();
54+
let nfd_ss = nfd.stream_safe().collect::<String>();
6355
assert!(nfd_ss.len() >= nfd.len());
64-
assert_ne!(is_nfd_stream_safe_quick(nfd_ss.chars()), IsNormalized::No);
56+
assert!(check_nfd_stream_safe_quick(&nfd_ss).is_ok());
6557
assert!(is_nfd_stream_safe(&nfd_ss));
6658

6759
// Check that NFC and NFD preserve stream-safe.
68-
let ss_nfc = input.chars().stream_safe().nfc().collect::<String>();
60+
let ss_nfc = input.stream_safe().nfc().collect::<String>();
6961
assert_eq!(ss_nfc.is_empty(), input.is_empty());
70-
assert_ne!(is_nfc_stream_safe_quick(ss_nfc.chars()), IsNormalized::No);
62+
assert!(check_nfc_stream_safe_quick(&ss_nfc).is_ok());
7163
assert!(is_nfc_stream_safe(&ss_nfc));
7264

73-
let ss_nfd = input.chars().stream_safe().nfd().collect::<String>();
65+
let ss_nfd = input.stream_safe().nfd().collect::<String>();
7466
assert_eq!(ss_nfd.is_empty(), input.is_empty());
75-
assert_ne!(is_nfd_stream_safe_quick(ss_nfd.chars()), IsNormalized::No);
67+
assert!(check_nfd_stream_safe_quick(&ss_nfd).is_ok());
7668
assert!(is_nfd_stream_safe(&ss_nfd));
7769
});

src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@ extern crate tinyvec;
5454

5555
pub use crate::decompose::Decompositions;
5656
pub use crate::quick_check::{
57-
is_nfc, is_nfc_quick, is_nfc_stream_safe, is_nfc_stream_safe_quick, is_nfd, is_nfd_quick,
58-
is_nfd_stream_safe, is_nfd_stream_safe_quick, is_nfkc, is_nfkc_quick, is_nfkd, is_nfkd_quick,
59-
IsNormalized,
57+
check_nfc, check_nfc_quick, check_nfc_stream_safe, check_nfc_stream_safe_quick, check_nfd,
58+
check_nfd_quick, check_nfd_stream_safe, check_nfd_stream_safe_quick, check_nfkc,
59+
check_nfkc_quick, check_nfkd, check_nfkd_quick, is_nfc, is_nfc_stream_safe, is_nfd,
60+
is_nfd_stream_safe, is_nfkc, is_nfkd, NormalizationError, QuickCheck,
6061
};
6162
pub use crate::recompose::Recompositions;
6263
pub use crate::replace::Replacements;

0 commit comments

Comments
 (0)