https://github.com/tam7t/cautious-pancake
identity pure functions in golang source
https://github.com/tam7t/cautious-pancake
code-generator fuzz golang-tools
Last synced: 7 months ago
JSON representation
identity pure functions in golang source
- Host: GitHub
- URL: https://github.com/tam7t/cautious-pancake
- Owner: tam7t
- License: bsd-3-clause
- Created: 2016-10-01T03:41:07.000Z (over 8 years ago)
- Default Branch: main
- Last Pushed: 2023-03-18T14:15:26.000Z (over 2 years ago)
- Last Synced: 2024-06-20T17:52:41.095Z (12 months ago)
- Topics: code-generator, fuzz, golang-tools
- Language: Go
- Homepage:
- Size: 58.6 KB
- Stars: 25
- Watchers: 6
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# cautious-pancake
[](https://pkg.go.dev/github.com/tam7t/cautious-pancake) [](https://goreportcard.com/report/github.com/tam7t/cautious-pancake)
github generated the repo name for me
## fuzzing
`cautious-pancake` aims to make fuzzing golang packages easier by identifying
[pure functions](https://en.wikipedia.org/wiki/Pure_function). These functions
can be easily fuzzed since they only operate on their direct inputs and do not
modify global state.## example
### `pancakeinfo`
Given a package, `pancakeinfo` will tell you which functions are pure:
```shell
$ go get -u github.com/tam7t/cautious-pancake/cmd/pancakeinfo
$ pancakeinfo -pkg=github.com/mdlayher/arp
(Operation).String
NewPacket
(Client).HardwareAddr
(*Packet).UnmarshalBinary
(*Packet).MarshalBinary
```The `-pure=false` flag will return all functions deemed impure, including
the reason for the determination and the `-private` flag will display
information on private functions as well.### `pancakegen`
Given a package and a function, `pancakegen` will generate code to fuzz that
function:```text
$ go get -u github.com/tam7t/cautious-pancake/cmd/pancakegen
$ pancakegen -pkg=github.com/tam7t/cautious-pancake/fixtures -func=YesMaybePanic
package fixturesimport (
"testing"
)func FuzzYesMaybePanic(f *testing.F) {
f.Fuzz(func(t *testing.T, p0 byte) {
YesMaybePanic(p0)
})
}
```If you run the generated code you will quickly get:
```shell
$ go test ./fixtures/... --fuzz=Fuzz
fuzz: elapsed: 0s, gathering baseline coverage: 0/1 completed
fuzz: elapsed: 0s, gathering baseline coverage: 1/1 completed, now fuzzing with 16 workers
fuzz: elapsed: 0s, execs: 20 (701/sec), new interesting: 0 (total: 1)
--- FAIL: FuzzYesMaybePanic (0.03s)
--- FAIL: FuzzYesMaybePanic (0.00s)
testing.go:1349: panic: bad input
goroutine 35 [running]:
runtime/debug.Stack()
/usr/local/go/src/runtime/debug/stack.go:24 +0x90
testing.tRunner.func1()
/usr/local/go/src/testing/testing.go:1349 +0x1f2
panic({0x65dd40, 0x6ee3e0})
/usr/local/go/src/runtime/panic.go:838 +0x207
github.com/tam7t/cautious-pancake/fixtures.YesMaybePanic(...)
/home/tam7t/code/github.com/tam7t/cautious-pancake/fixtures/fuzzable.go:97
github.com/tam7t/cautious-pancake/fixtures.FuzzYesMaybePanic.func1(0x0?, 0xa)
/home/tam7t/code/github.com/tam7t/cautious-pancake/fixtures/fuzzable_test.go:9 +0x77
reflect.Value.call({0x660400?, 0x6b5f98?, 0x13?}, {0x69f589, 0x4}, {0xc00009bc80, 0x2, 0x2?})
/usr/local/go/src/reflect/value.go:556 +0x845
reflect.Value.Call({0x660400?, 0x6b5f98?, 0x514?}, {0xc00009bc80, 0x2, 0x2})
/usr/local/go/src/reflect/value.go:339 +0xbf
testing.(*F).Fuzz.func1.1(0x0?)
/usr/local/go/src/testing/fuzz.go:337 +0x231
testing.tRunner(0xc0001a16c0, 0xc00018aea0)
/usr/local/go/src/testing/testing.go:1439 +0x102
created by testing.(*F).Fuzz.func1
/usr/local/go/src/testing/fuzz.go:324 +0x5b8
Failing input written to testdata/fuzz/FuzzYesMaybePanic/358fa4d16da00de4d29482b2ea74da673eb27bfc5614d2b123ac0aa89e0e1ea5
To re-run:
go test -run=FuzzYesMaybePanic/358fa4d16da00de4d29482b2ea74da673eb27bfc5614d2b123ac0aa89e0e1ea5
FAIL
exit status 1
FAIL github.com/tam7t/cautious-pancake/fixtures 0.032s
```indicating that `fixtures.YesMaybePanic(0xA)` will result in a panic.