-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
76 lines (61 loc) · 1.48 KB
/
main.go
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main
import (
"flag"
"fmt"
"os"
)
var (
funcName = flag.String("func", "Fuzz", "name of the Fuzz function")
outputFile = flag.String("o", "afl", "output file")
)
func main() {
flag.Parse()
checkFlags()
// Switch environment variables so that afl uses gccgo
aflCC := setAflEnvVars()
// Find the package and the Fuzz function name
pkgName, err := findPackageFunc()
handlePkgError(err)
// Load the package
pkgImport, err := loadPackage(pkgName)
handlePkgError(err)
// Create a temp main go file
mainGo, cleanupMainGo := createTemplate(tmplMainGo, `main.*.go`, mainGoData{
PkgImport: pkgImport,
PkgName: pkgName,
FuncName: *funcName,
})
defer cleanupMainGo()
// Create a temp library file
libFile, libHeader, cleanupLibFile := createLibFile()
defer cleanupLibFile()
// Build the library file using gccgo
buildLibFile(pkgName, mainGo, libFile)
// Create a temp main c file
mainC, cleanupMainC := createTemplate(tmplMainC, `main.*.c`, libHeader)
defer cleanupMainC()
// Compile with AFL++ compiler
buildAFL(aflCC, mainC, libFile)
}
func checkFlags() {
if *funcName == "" {
fmt.Println("Usage: go-afl-build -func FuncName")
flag.PrintDefaults()
os.Exit(1)
}
}
func setAflEnvVars() string {
aflCC := os.Getenv(`AFL_CC`)
if aflCC == `` {
aflCC = `afl-gcc-fast`
}
gccGo := os.Getenv(`GCCGO`)
if gccGo == `` {
gccGo = `gccgo`
}
err := os.Setenv(`AFL_CC`, gccGo)
panicOnError(err)
err = os.Setenv(`GCCGO`, aflCC)
panicOnError(err)
return aflCC
}