Skip to content

mark-pictor-csec/goreduce

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

goreduce

Build Status

Reduce a program to its simplest form as long as it produces a compiler error or any output (such as a panic) matching a regular expression.

go get -u mvdan.cc/goreduce

Example

func main() {
        a := []int{1, 2, 3}
        if true {
                a = append(a, 4)
        }
        a[1] = -2
        println(a[10])
}
goreduce -match 'index out of range' .
func main() {
        a := []int{}
        println(a[0])
}

For more usage information, see goreduce -h.

Design

  • The tool should be reproducible, giving the same output for an input program as long as external factors don't modify its behavior
  • The rules should be as simple and composable as possible
  • Rules should avoid generating changes that they can know won't compile

Rules

Removing

Before After
statement a; b a or b
index a[1] a
slice a[:2] a or a[:]
binary part a + b, a && b a or b
unary op -a, !a a
star *a a
parentheses (a) a
if/else if a { b } else c b or c
defer defer f() f()
go go f() f()
basic value 123, "foo" 0, ""
composite value T{a, b} T{}

Inlining

Before After
const const c = 0; f(c) f(0)
var v := false; f(v) f(false)
case case x: a a
block { a } a
simple call f() { body }

Resolving

Before After
integer op 2 * 3 6
string op "foo" + "bar" "foobar"
slice "foo"[1:] "oo"
index "foo"[0] 'f'
builtin len("foo") 3

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%