changelog shortlog graph tags branches changeset files revisions annotate raw help

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

changeset 581: d3e2829521a3
parent: 806c2b214df8
child: 568c39371122
author: Richard Westhaver <ellis@rwest.io>
date: Tue, 06 Aug 2024 21:17:24 -0400
permissions: -rw-r--r--
description: tmux work, fuzzer
1 ;;; fuzz.lisp --- RT Fuzz
2 
3 ;; FUZZER API
4 
5 ;;; Commentary:
6 
7 ;;
8 ;; wiki: https://en.wikipedia.org/wiki/Fuzzing
9 
10 ;;; Code:
11 (in-package :rt/fuzz)
12 
13 (defvar *default-fuzz-generator*
14  (lambda (state)
15  (random most-positive-fixnum state)))
16 
17 (defclass fuzzer ()
18  ((state :initform (make-random-state t)
19  :initarg :state
20  :accessor fuzzer-state)
21  (generator :initform *default-fuzz-generator*
22  :initarg :generator
23  :type (function (state))
24  :accessor fuzz-generator))
25  (:documentation "An object which provides invalid, unexpected or random data as inputs to some
26 program."))
27 
28 (defgeneric fuzz (self &key &allow-other-keys)
29  (:method ((self fuzzer) &key count)
30  (if count
31  (let ((ret))
32  (dotimes (i count ret)
33  (push (funcall (the function (fuzz-generator self)) (fuzzer-state self)) ret)))
34  (funcall (the function (fuzz-generator self)) (fuzzer-state self)))))
35 
36 (defgeneric fuzz* (state generator &key &allow-other-keys)
37  (:method ((state list) (generator function) &key (count 1))
38  (let ((ret))
39  (dotimes (i count ret)
40  (push (funcall generator state) ret))))
41  (:method ((state vector) (generator function) &key (count 1))
42  (let ((ret (make-array count :fill-pointer 0)))
43  (dotimes (i count ret)
44  (setf (aref ret i) (funcall generator state)))))
45  (:method ((state hash-table) (generator function) &key (count 1))
46  (let ((ret (make-hash-table)))
47  (dotimes (i count ret)
48  (destructuring-bind (k v) (funcall generator state)
49  (setf (gethash k ret) v))))))