Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork1.5k
feat: add uncalled linter#3348
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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
Hey, thank you for opening your first Pull Request ! |
CLAassistant commentedNov 6, 2022 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
|
While this implements the same functionality asrowserrcheck that linter usesbuildssa which is currently incompatible withgo generics asbuildssa.SSA.SrcFuncs doesn't currently includeInstantiations. This is a from scratch implementation that usesinspect.Analyzer which doesn't have such problems. It also doesn't suffer from the false positives when the code has multiple reassigned Credit torowserrcheck for inspiration. |
ldez commentedNov 7, 2022 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
In order for a pull request adding a linter to be reviewed, the linter and the PR must follow some requirements. Pull Request Description
Linter
The Linter Tests Inside Golangci-lint
|
I've actually refactored the original implementation which was limited to checking for missingdatabase/sqlRows.Err() to use a configuration that will allow it to check for any number of missing calls. Working my way though validating your check list. |
@ldez thanks for the checklist, very helpful. I did notice it has more details thannew linters guide so I'll try to find some time to update that if it would help. I believe all the items on your list are good, but look forward to your feedback. |
@ldez any feedback I need to address? |
Add rowserr a linter which checks for missing sql Rows.Err() callsthat supports generics.
Refactor to use uncalled which is a generic version rowserr that usesa configuration to enable rules based checks instead of hard-coded fordatabase/sql Rows.Err() checks only.
Update to uncalled v0.4.0 to align with golangci-lint config style.
Update to uncalled v0.5.0 which adds net http response close checks.
Run go mod tidy to clean up go.mod
Update to uncalled v0.7.1 which adds more checkers, adds the ability tohandle more called types including direct calls in defers.This adds the following new rules:- http Response.Body.Close()- context context.CancelFunc()
Add default config, correct want and fix linter name.
Update to v0.8.0 which adds merge config support. This improvescompatibility with golangci-lint by allowing the internal rules to beapplied and overridden with minimal configuration.
Update uncalled to v0.8.1 which addresses a config data race.
I see this is now tagged at blocked@ldez anything that I need to address? I just updated to the latest version and rebased so it's in line with current master. |
I blocked the PR because I think this linter is a kind of duplicate but I need to investigate. |
It does duplicate the functionality ofrowserrcheck as mentioned in previous comment, but it usesbuildssa which is currently incompatible withgo generics asbuildssa.SSA.SrcFuncs so users currently have no way to check for that issue if they are using go 1.18+ This is a from scratch implementation that usesinspect.Analyzer which doesn't have such problems. It also doesn't suffer from the false positives when the code has multiple reassigned Row variables that don't result in a real check. Finally this uses an extensible model based on configuration, providing three separate checks currently:
|
SSA supports generics for about 1 year#2649 (comment) And since go1.20, go1.18 is unmaintained. Maybe I miss something here 🤔 |
Thanks for checking back in on this. When I wrote this SSA didn't have full generics support specifically it didn't supportinstantiations causingrowserrcheck to be disabled in go 1.18+ which have generics. I only mentioned 1.18 as that's when generics was introduced. I just did a check with golangci-lint v1.51.2 androwserrcheck is still disabled when running with go 1.20:
Looking atrowserrcheck it hasn't been updated since 2021, so unfortunately still isn't working with generics, although should be easier to fix now. uncalled, also has the ability to be extended with additional user checks via extra configuration so I think it still has value to the community, thoughts? |
Hi everyone I'm interested in the feature that uncalled linter would provide I'm thinking about a lot of use cases in my codebase. But I'm a bit lost in the current discussion, so bare with me, please. From what I understood,@ldez think it might be a duplicate, and is also worried about the fact that uncalled is coded in a way that prevents it to be added easily to golangci. Here is the point where you lost me guys 📦 I'm able to use uncalled via precommit hook, but having them in golangci would be easier. With my newbie point of view, I understand that uncalled might be a solution to replacerowserrcheck and provides a way to make people able to detect again what rowserrcheck was detecting, but that is likely to never be available as the project seems dead. So now, I said that... what is the current status ? @ldez : does you only need time to look at this project ? or does it mean@stevenh needs to write it totally ? because right now it's not compatible or may cause issues. Thank you both for your time on working on golangci-lint |
I believe the only concern is that it duplicates the check in uncalled is already fully integrated with |
Thanks for the explanation. From my understanding, it doesn't duplicate it. It supersedes it. I would be able not only to restore the feature of rowserrcheck on version above go1. 18 It will allow to provide way to define custom rules. rowserrcheck is only one possible things it can do. |
FYI rowserrcheck will be re-enabled#3691 |
ccoVeille commentedMar 14, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Thanks for the information. Does it reduce the chance to get |
Yes because duplicated linters are not accepted, but I have to evaluate pro/cons to replace |
Antonboom commentedOct 1, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
@stevenh, hi! @ldez, looks like
The killer feature is support not only std types 😎 P.S.@stevenh could you provide an example of |
But I confused from |
It's there to add structured logging with control over the level when running checks. Now std lib hasslog I'll likely look to migrate to that. |
stevenh commentedOct 2, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Thanks :)
bodyclose and rowserrcheck are already present in theconfig here
# Check for missing sql Rows.Close() calls. -name:sql-rows-closedisabled:falsecategory:sqlpackages: -database/sql -github.com/jmoiron/sqlxmethods:[]results: -type:.Rowspointer:trueexpect:call:.Closeargs:[] -type:errorpointer:false# Check for missing sql Stmt.Close() calls. -name:sql-stmt-closedisabled:falsecategory:sqlpackages: -database/sql -github.com/jmoiron/sqlxmethods:[]results: -type:.Stmtpointer:trueexpect:call:.Closeargs:[] -type:errorpointer:false# Check for missing sql NamedStmt.Close() calls. -name:sql-namedstmt-closedisabled:falsecategory:sqlpackages: -github.com/jmoiron/sqlxmethods:[]results: -type:.NamedStmtpointer:trueexpect:call:.Closeargs:[] -type:errorpointer:false
# Check for missing xml Encoder.Close() calls. -name:xml-encoder-closedisabled:falsecategory:xmlpackages: -encoding/xmlmethods:[]results: -type:.Encoderpointer:trueexpect:call:.Closeargs:[] -type:errorpointer:false
If this is of interest, I can look at creating tests to confirm the above? |
stevenh commentedOct 2, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Looks likeRows.Close is more complex as if |
Looking at ithttps://github.com/ryanrolds/sqlclosecheck suffers from the false positive when you have checked funcCalled(db*sql.DB) {rows,_:=db.Query("select id from tb")forrows.Next() {// Handle row.}ifrows.Err()!=nil {// Handle error.fmt.Fprintln(ioutil.Discard,"error")}} |
Uh oh!
There was an error while loading.Please reload this page.
Adduncalled linter which checks for missing calls based on configured rules and supports generics.