aboutsummaryrefslogtreecommitdiff
path: root/internal/sexp/fuzz_test.go
blob: 01d436b2dcddc59893742289b69342a60f71af3a (plain) (blame)
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)
			}
		})
	})
}