-
Notifications
You must be signed in to change notification settings - Fork 287
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
False positive on select {} #804
Comments
This fixes a false positive reported by revive on the following: select {} This is a way to block the program indefinitely. It is used in cases like: - Running a long-running server in a background thread and blocking `main` from exiting until the application dies. This is something you might do if your process has multiple servers/listeners in the same process. ```go go grpcListenAndServe() go httpListenAndServe() go logFlusher() select {} ``` - In programs compiled to WASM to prevent the application from exiting, so that the Javascript components may interact with it. ```go func main() { js.Global().Set("foo", foo) select {} } ``` Without this, one may see an error like, "Error: Go program has already exited" As a workaround, these programs can block forever by receiving from a throwaway channel (`<-make(chan struct{})`), but `select {}` is still a completely valid way of doing this, so supporting it makes sense. The issue was previously reported in mgechev#698 but was closed because the author was satisfied with a `//nolint` comment. Now that this rule is part of the default rule set (mgechev#799) the case for addressing the false positive is stronger. Resolves mgechev#804
Hi @abhinav, thanks for filling the issue (and providing a PR) As I've mentioned in the clone of this issue (#698) the frequency of the construction |
Hey, @chavacava. Thanks for the response and for maintaining the tool. RE: false positive: I agree that as of #698, the frequency of |
This fixes a false positive reported by revive on the following: select {} This is a way to block the program indefinitely. It is used in cases like: - Running a long-running server in a background thread and blocking `main` from exiting until the application dies. This is something you might do if your process has multiple servers/listeners in the same process. ```go go grpcListenAndServe() go httpListenAndServe() go logFlusher() select {} ``` - In programs compiled to WASM to prevent the application from exiting, so that the Javascript components may interact with it. ```go func main() { js.Global().Set("foo", foo) select {} } ``` Without this, one may see an error like, "Error: Go program has already exited" As a workaround, these programs can block forever by receiving from a throwaway channel (`<-make(chan struct{})`), but `select {}` is still a completely valid way of doing this, so supporting it makes sense. The issue was previously reported in #698 but was closed because the author was satisfied with a `//nolint` comment. Now that this rule is part of the default rule set (#799) the case for addressing the false positive is stronger. Resolves #804
Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Steps to reproduce the behavior:
go install github.com/mgechev/revive@latest
Expected behavior
No errors.
Logs
Desktop (please complete the following information):
Additional context
Previously reported in #698
The text was updated successfully, but these errors were encountered: