diff --git a/srcs/dependtool/static_analyser.go b/srcs/dependtool/static_analyser.go index c09f630..0445c98 100644 --- a/srcs/dependtool/static_analyser.go +++ b/srcs/dependtool/static_analyser.go @@ -11,9 +11,6 @@ import ( "debug/elf" "fmt" "os" - "os/exec" - "path/filepath" - "strings" u "tools/srcs/common" ) @@ -194,114 +191,6 @@ func executeDependAptCache(programName string, data *u.StaticData, return nil } -// getProgramFolder gets the folder path in which the given program is located, according to the -// Unikraft standard (e.g., /home/.../apps/programFolder/.../program). -// -// It returns the folder containing the program files according to the standard described above. -func getProgramFolder(programPath string) string { - - tmp := strings.Split(programPath, "/") - i := 2 - - for ; i < len(tmp); i++ { - if tmp[len(tmp)-i] == "apps" { - break - } - } - - folderPath := strings.Join(tmp[:len(tmp)-i+2], "/") - return folderPath -} - -// findSourcesFiles puts together all C/C++ source files found in a given application folder. -// -// It returns a slice containing the found source file names and an error if any, otherwise it -// returns nil. -func findSourcesFiles(workspace string) ([]string, error) { - - var filenames []string - - err := filepath.Walk(workspace, - func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - - ext := filepath.Ext(info.Name()) - if ext == ".c" || ext == ".cpp" || ext == ".cc" || ext == ".h" || ext == ".hpp" || - ext == ".hcc" { - filenames = append(filenames, path) - } - return nil - }) - if err != nil { - return nil, err - } - return filenames, nil -} - -// TODO REPLACE -// ExecuteCommand a single command without displaying the output. -// -// It returns a string which represents stdout and an error if any, otherwise -// it returns nil. -func ExecuteCommand(command string, arguments []string) (string, error) { - out, err := exec.Command(command, arguments...).CombinedOutput() - return string(out), err -} - -// addSourceFileSymbols adds all the symbols present in 'output' to the static data field in -// 'data'. -func addSourceFileSymbols(output string, data *u.Data) { - outputTab := strings.Split(output, ",") - - // Get the list of system calls - systemCalls := initSystemCalls() - - for _, s := range outputTab { - if _, isSyscall := systemCalls[s]; isSyscall { - data.StaticData.SystemCalls[s] = systemCalls[s] - } else { - data.StaticData.Symbols[s] = "" - } - } -} - -// extractPrototype executes the parserClang.py script on each source file to extracts all possible -// symbols of each of these files. -// -// It returns an error if any, otherwise it returns nil. -func extractPrototype(sourcesFiltered []string, data *u.Data) error { - - for _, f := range sourcesFiltered { - script := filepath.Join(os.Getenv("GOPATH"), "src", "tools", "srcs", "dependtool", - "parserClang.py") - output, err := ExecuteCommand("python3", []string{script, "-q", "-t", f}) - if err != nil { - u.PrintWarning("Incomplete analysis with file " + f) - continue - } - addSourceFileSymbols(output, data) - } - return nil -} - -// gatherSourceFileSymbols gathers symbols of source files from a given application folder. -// -// It returns an error if any, otherwise it returns nil. -func gatherSourceFileSymbols(data *u.Data, programPath string) error { - - sourceFiles, err := findSourcesFiles(getProgramFolder(programPath)) - if err != nil { - u.PrintErr(err) - } - - if err := extractPrototype(sourceFiles, data); err != nil { - u.PrintErr(err) - } - return nil -} - // -------------------------------------Run------------------------------------- // staticAnalyser runs the static analysis to get shared libraries, @@ -351,12 +240,6 @@ func staticAnalyser(elfFile *elf.File, isDynamic, isLinux bool, args u.Arguments } } - // Detect symbols from source files - u.PrintHeader2("(*) Gathering symbols from source files") - if err := gatherSourceFileSymbols(data, programPath); err != nil { - u.PrintWarning(err) - } - // Detect symbols from shared libraries if fullStaticAnalysis && isLinux { u.PrintHeader2("(*) Gathering symbols and system calls of shared libraries from binary" +