From 2ca842682b33e0b255cd1fed5b302945d2e30294 Mon Sep 17 00:00:00 2001 From: Tamara Vedenina Date: Sun, 28 Feb 2021 17:56:44 +0300 Subject: [PATCH] extend nilValReturn checker --- checkers/nilValReturn_checker.go | 21 ++++++++++++------- .../testdata/nilValReturn/negative_tests.go | 21 +++++++++++++++++++ .../testdata/nilValReturn/positive_tests.go | 16 ++++++++++++++ 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/checkers/nilValReturn_checker.go b/checkers/nilValReturn_checker.go index e53ca0cc0..0a8e793ee 100644 --- a/checkers/nilValReturn_checker.go +++ b/checkers/nilValReturn_checker.go @@ -45,17 +45,24 @@ func (c *nilValReturnChecker) VisitStmt(stmt ast.Stmt) { return } ret, ok := ifStmt.Body.List[0].(*ast.ReturnStmt) - if !ok || len(ret.Results) != 1 { + if !ok { return } expr, ok := ifStmt.Cond.(*ast.BinaryExpr) - cond := ok && - expr.Op == token.EQL && + if !ok { + return + } + xIsNil := expr.Op == token.EQL && typep.SideEffectFree(c.ctx.TypesInfo, expr.X) && - qualifiedName(expr.Y) == "nil" && - astequal.Expr(expr.X, ret.Results[0]) - if cond { - c.warn(ret, expr.X) + qualifiedName(expr.Y) == "nil" + if !xIsNil { + return + } + for _, res := range ret.Results { + if astequal.Expr(expr.X, res) { + c.warn(ret, expr.X) + break + } } } diff --git a/checkers/testdata/nilValReturn/negative_tests.go b/checkers/testdata/nilValReturn/negative_tests.go index 22de5653c..df4757037 100644 --- a/checkers/testdata/nilValReturn/negative_tests.go +++ b/checkers/testdata/nilValReturn/negative_tests.go @@ -22,6 +22,13 @@ func explicitNil() { return nil } + _ = func(o *object, err error) (*object, error) { + if err == nil { + return o, nil + } + return nil, err + } + _ = func(pointers [][][]map[string]*int) *int { if pointers[0][1][2]["ptr"] == nil { return nil @@ -55,6 +62,20 @@ func explicitNotEqual() { return nil } + _ = func(o *object, a *object) *object { + if o != nil { + return o + } + return a + } + + _ = func(o *object, err error) (*object, error) { + if err != nil { + return nil, err + } + return o, nil + } + _ = func(pointers [][][]map[string]*int) *int { if pointers[0][1][2]["ptr"] != nil { return pointers[0][1][2]["ptr"] diff --git a/checkers/testdata/nilValReturn/positive_tests.go b/checkers/testdata/nilValReturn/positive_tests.go index 454c1d4db..68037af66 100644 --- a/checkers/testdata/nilValReturn/positive_tests.go +++ b/checkers/testdata/nilValReturn/positive_tests.go @@ -29,6 +29,22 @@ func suspiciousReturns() { return nil } + _ = func(o *object, err error) (*object, error) { + if err == nil { + /*! returned expr is always nil; replace err with nil */ + return nil, err + } + return o, nil + } + + _ = func(o *object, a *object) *object { + if o == nil { + /*! returned expr is always nil; replace o with nil */ + return o + } + return a + } + _ = func(pointers [][][]map[string]*int) *int { if pointers[0][1][2]["ptr"] == nil { /*! returned expr is always nil; replace pointers[0][1][2]["ptr"] with nil */