@@ -12,89 +12,96 @@ use nom::{
12
12
combinator:: { map, map_res, verify} ,
13
13
multi:: fold_many0,
14
14
sequence:: { delimited, pair, terminated} ,
15
- IResult ,
15
+ IResult , Parser
16
16
} ;
17
17
18
- use std:: str:: FromStr ;
19
18
use std:: cell:: RefCell ;
19
+ use std:: str:: FromStr ;
20
20
21
21
thread_local ! {
22
22
pub static LEVEL : RefCell <u32 > = RefCell :: new( 0 ) ;
23
23
}
24
24
25
25
fn reset ( ) {
26
- LEVEL . with ( |l| {
27
- * l. borrow_mut ( ) = 0 ;
28
- } ) ;
26
+ LEVEL . with ( |l| {
27
+ * l. borrow_mut ( ) = 0 ;
28
+ } ) ;
29
29
}
30
30
31
31
fn incr ( i : & str ) -> IResult < & str , ( ) > {
32
- LEVEL . with ( |l| {
33
- * l. borrow_mut ( ) += 1 ;
34
-
35
- // limit the number of recursions, the fuzzer keeps running into them
36
- if * l. borrow ( ) >= 8192 {
37
- return Err ( nom:: Err :: Failure ( nom:: error:: Error :: new ( i, nom:: error:: ErrorKind :: Count ) ) ) ;
38
- } else {
39
- Ok ( ( i, ( ) ) )
40
- }
41
- } )
32
+ LEVEL . with ( |l| {
33
+ * l. borrow_mut ( ) += 1 ;
34
+
35
+ // limit the number of recursions, the fuzzer keeps running into them
36
+ if * l. borrow ( ) >= 8192 {
37
+ return Err ( nom:: Err :: Failure ( nom:: error:: Error :: new (
38
+ i,
39
+ nom:: error:: ErrorKind :: Count ,
40
+ ) ) ) ;
41
+ } else {
42
+ Ok ( ( i, ( ) ) )
43
+ }
44
+ } )
42
45
}
43
46
44
47
fn decr ( ) {
45
- LEVEL . with ( |l| {
46
- * l. borrow_mut ( ) -= 1 ;
47
- } ) ;
48
+ LEVEL . with ( |l| {
49
+ * l. borrow_mut ( ) -= 1 ;
50
+ } ) ;
48
51
}
49
52
50
53
fn parens ( i : & str ) -> IResult < & str , i64 > {
51
- delimited ( space , delimited (
52
- terminated ( tag ( "(" ) , incr ) ,
53
- expr ,
54
- map ( tag ( ")" ) , |_| decr ( ) )
55
- ) , space ) ( i)
54
+ delimited (
55
+ space ,
56
+ delimited ( terminated ( tag ( "(" ) , incr ) , expr , map ( tag ( ")" ) , |_| decr ( ) ) ) ,
57
+ space ,
58
+ ) . parse ( i)
56
59
}
57
60
58
-
59
61
fn factor ( i : & str ) -> IResult < & str , i64 > {
60
62
alt ( (
61
63
map_res ( delimited ( space, digit, space) , FromStr :: from_str) ,
62
64
parens,
63
- ) ) ( i)
65
+ ) ) . parse ( i)
64
66
}
65
67
66
-
67
68
fn term ( i : & str ) -> IResult < & str , i64 > {
68
69
incr ( i) ?;
69
- let ( i, init) = factor ( i) . map_err ( |e| { decr ( ) ; e } ) ?;
70
+ let ( i, init) = factor ( i) . map_err ( |e| {
71
+ decr ( ) ;
72
+ e
73
+ } ) ?;
70
74
71
75
let res = fold_many0 (
72
76
alt ( (
73
- pair ( char ( '*' ) , factor) ,
74
- pair ( char ( '/' ) , verify ( factor, |i| * i != 0 ) ) ,
77
+ pair ( char ( '*' ) , factor) ,
78
+ pair ( char ( '/' ) , verify ( factor, |i| * i != 0 ) ) ,
75
79
) ) ,
76
80
|| init,
77
81
|acc, ( op, val) : ( char , i64 ) | {
78
82
if op == '*' {
79
83
acc. saturating_mul ( val)
80
84
} else {
81
85
match acc. checked_div ( val) {
82
- Some ( v) => v,
83
- // we get a division with overflow because we can get acc = i64::MIN and val = -1
84
- // the division by zero is already checked earlier by verify
85
- None => i64:: MAX ,
86
+ Some ( v) => v,
87
+ // we get a division with overflow because we can get acc = i64::MIN and val = -1
88
+ // the division by zero is already checked earlier by verify
89
+ None => i64:: MAX ,
86
90
}
87
91
}
88
92
} ,
89
- ) ( i) ;
93
+ ) . parse ( i) ;
90
94
91
95
decr ( ) ;
92
96
res
93
97
}
94
98
95
99
fn expr ( i : & str ) -> IResult < & str , i64 > {
96
100
incr ( i) ?;
97
- let ( i, init) = term ( i) . map_err ( |e| { decr ( ) ; e } ) ?;
101
+ let ( i, init) = term ( i) . map_err ( |e| {
102
+ decr ( ) ;
103
+ e
104
+ } ) ?;
98
105
99
106
let res = fold_many0 (
100
107
pair ( alt ( ( char ( '+' ) , char ( '-' ) ) ) , term) ,
@@ -106,20 +113,20 @@ fn expr(i: &str) -> IResult<&str, i64> {
106
113
acc. saturating_sub ( val)
107
114
}
108
115
} ,
109
- ) ( i) ;
116
+ ) . parse ( i) ;
110
117
111
118
decr ( ) ;
112
119
res
113
120
}
114
121
115
122
fuzz_target ! ( |data: & [ u8 ] | {
116
- reset( ) ;
117
- // fuzzed code goes here
118
- let temp = match str :: from_utf8( data) {
119
- Ok ( v) => {
120
- //println!("v: {}", v);
121
- factor( v)
122
- } ,
123
- Err ( e ) => factor( "2" ) ,
124
- } ;
123
+ reset( ) ;
124
+ // fuzzed code goes here
125
+ let _ = match str :: from_utf8( data) {
126
+ Ok ( v) => {
127
+ //println!("v: {}", v);
128
+ factor( v)
129
+ }
130
+ Err ( _ ) => factor( "2" ) ,
131
+ } ;
125
132
} ) ;
0 commit comments