1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// SPDX-License-Identifier: GPL-3.0-or-later
package sexp
import "testing"
// FuzzParse checks that Parse never panics and that every node it returns
// spans valid bytes, with lists pointing at their own parentheses.
func FuzzParse(f *testing.F) {
for _, s := range []string{`(a "b" (c))`, `"\"`, `(((`, `)`, "; x\n(y)", `("ł" x)`, "\xff", `"\\"`} {
f.Add([]byte(s))
}
f.Fuzz(func(t *testing.T, src []byte) {
nodes, err := Parse("f", src)
if err != nil {
return
}
walk(nodes, func(n *Node) {
if n.Pos.Offset < 0 || n.End.Offset > len(src) || n.Pos.Offset >= n.End.Offset {
t.Fatalf("bad span %d..%d in %q", n.Pos.Offset, n.End.Offset, src)
}
if n.Kind == List && (src[n.Pos.Offset] != '(' || src[n.End.Offset-1] != ')') {
t.Fatalf("list %d..%d does not span its parens in %q", n.Pos.Offset, n.End.Offset, src)
}
})
})
}
|