tools icon indicating copy to clipboard operation
tools copied to clipboard

x/tools/go/analysis/passes/ctrlflow: encode more knowledge about standard library in ctrlflow analyzer

Open yuxincs opened this issue 1 year ago • 7 comments

ctrlflow Analyzer has a list of intrinsic no-return functions such as "syscall.Exit" but not higher-level standard library functions like "os.Exit". It relies on actually analyzing those functions (which internally will call the intrinsic no-return functions), and then exporting the knowledge as "noReturn" facts for downstream analyses.

However, as is noted in "analysis" framework documentation (https://pkg.go.dev/golang.org/x/tools/go/analysis#hdr-Modular_analysis_with_Facts):

"Some driver implementations (such as those based on Bazel and Blaze) do not currently apply analyzers to packages of the standard library. Therefore, for best results, analyzer authors should not rely on analysis facts being available for standard packages."

From our testing with Bazel (nogo), this still seems to be true (May 2024), since rules_go (https://github.com/bazelbuild/rules_go) compiles the standard library via "go install", where analyzers are not applied, and hence won't export the "noReturn" facts. This would have cascading effects since "os.Exit" not being marked as no-return will lead to user-defined functions like

func HandleError(err error) { SendLog(err) os.Exit(1) }

as well as its further wrappers not being marked as no-return. Then, the blocks containing calls to them would still have successors (incorrectly).

Following the recommendations from the documentation ("analyzer authors should not rely on analysis facts being available"), this PR encodes more higher-level functions from the standard library as no-return.

yuxincs avatar Jun 05 '24 19:06 yuxincs