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  }