changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > core / annotate lisp/lib/rt/fuzz.lisp

changeset 647: 74e563ed4537
parent: 849f72b72b41
author: Richard Westhaver <ellis@rwest.io>
date: Wed, 11 Sep 2024 21:40:01 -0400
permissions: -rw-r--r--
description: cli and rt/fuzz
635
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
1
 ;;; fuzz.lisp --- RT Fuzz
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
2
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
3
 ;; FUZZER API
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
4
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
5
 ;;; Commentary:
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
6
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
7
 ;; 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
8
 ;; wiki: https://en.wikipedia.org/wiki/Fuzzing
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
9
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
10
 ;;; Code:
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
11
 (in-package :rt/fuzz)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
12
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
13
 (defvar *default-fuzz-generator*
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
14
   (lambda (state)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
15
     (random most-positive-fixnum state)))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
16
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
17
 (defclass fuzzer ()
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
18
   ((state :initform (make-random-state t)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
19
     :initarg :state
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
20
           :accessor fuzz-state)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
21
    (generator :initform *default-fuzz-generator*
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
22
               :initarg :generator
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
23
               :type function
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
24
               :accessor fuzz-generator))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
25
   (:documentation "An object which provides invalid, unexpected or random data as inputs to some
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
26
 program."))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
27
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
28
 (defgeneric fuzz (self &key &allow-other-keys)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
29
   (:method ((self fuzzer) &key &allow-other-keys)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
30
     (funcall (the function (fuzz-generator self)) (fuzz-state self)))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
31
   (:method ((self fuzzer) &key count)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
32
     (if count
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
33
         (let ((ret))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
34
           (dotimes (i count ret)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
35
             (push (funcall (the function (fuzz-generator self)) (fuzz-state self)) ret)))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
36
         (fuzz self))))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
37
 
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
38
 (defgeneric fuzz* (state generator &key &allow-other-keys)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
39
   (:method ((state list) (generator function) &key (count 1))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
40
     (let ((ret))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
41
       (dotimes (i count ret)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
42
         (push (funcall generator state) ret))))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
43
   (:method ((state vector) (generator function) &key (count 1))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
44
     (let ((ret (make-array count :fill-pointer 0)))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
45
       (dotimes (i count ret)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
46
         (setf (aref ret i) (funcall generator state)))))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
47
   (:method ((state hash-table) (generator function) &key (count 1))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
48
     (let ((ret (make-hash-table)))
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
49
       (dotimes (i count ret)
849f72b72b41 add back fuzz.lisp and proper codegen for parquet.json thrift definitions
Richard Westhaver <ellis@rwest.io>
parents:
diff changeset
50
         (destructuring-bind (k v) (funcall generator state)
647
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 635
diff changeset
51
           (setf (gethash k ret) v)))))
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 635
diff changeset
52
   (:method ((state random-state) (generator function) &key (count 1))
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 635
diff changeset
53
     (let ((ret))
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 635
diff changeset
54
       (dotimes (i count ret)
74e563ed4537 cli and rt/fuzz
Richard Westhaver <ellis@rwest.io>
parents: 635
diff changeset
55
         (push (funcall generator state) ret)))))