github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/tools/syz-codesearch/codesearch.go (about) 1 // Copyright 2025 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package main 5 6 import ( 7 "flag" 8 "fmt" 9 "os" 10 11 "github.com/google/syzkaller/pkg/clangtool" 12 "github.com/google/syzkaller/pkg/codesearch" 13 "github.com/google/syzkaller/pkg/tool" 14 ) 15 16 func main() { 17 var ( 18 flagDatabase = flag.String("database", "", "path to input/output database file (mandatory)") 19 flagKernelSrc = flag.String("kernel-src", "", "path to kernel source directory (mandatory)") 20 flagKernelObj = flag.String("kernel-obj", "", "path to kernel build directory (mandatory)") 21 ) 22 flag.Parse() 23 if len(flag.Args()) == 0 || *flagDatabase == "" || *flagKernelSrc == "" || *flagKernelObj == "" { 24 printUsageAndExit() 25 } 26 cmd, args := flag.Args()[0], flag.Args()[1:] 27 if cmd == "index" { 28 if len(args) != 1 { 29 printUsageAndExit() 30 } 31 cfg := &clangtool.Config{ 32 ToolBin: args[0], 33 KernelSrc: *flagKernelSrc, 34 KernelObj: *flagKernelObj, 35 CacheFile: *flagDatabase, 36 DebugTrace: os.Stderr, 37 } 38 39 if _, err := clangtool.Run[codesearch.Database](cfg); err != nil { 40 tool.Fail(err) 41 } 42 return 43 } 44 index, err := codesearch.NewIndex(*flagDatabase, []string{*flagKernelSrc, *flagKernelObj}) 45 if err != nil { 46 tool.Fail(err) 47 } 48 res, err := index.Command(cmd, args) 49 if err != nil { 50 tool.Fail(err) 51 } 52 os.Stdout.WriteString(res) 53 } 54 55 func printUsageAndExit() { 56 fmt.Printf(`syz-codesearch usage: 57 syz-codesearch [flags] command [command arguments] 58 commands and their arguments: 59 `) 60 for _, cmd := range codesearch.Commands { 61 fmt.Printf(" - %v [%v args]\n", cmd.Name, cmd.NArgs) 62 } 63 fmt.Printf("\nflags:\n") 64 flag.PrintDefaults() 65 os.Exit(1) 66 }