Initial commit
This commit is contained in:
Коммит
f2d381790f
|
@ -0,0 +1,118 @@
|
|||
package minioExtensions
|
||||
|
||||
import "errors"
|
||||
|
||||
func thenBranchGoodError() error {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Good: returning an error
|
||||
return errors.New("failed")
|
||||
}
|
||||
doSomething()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func thenBranchGoodWithElseError() error {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Good: an error means we return an error
|
||||
return errors.New("failed")
|
||||
} else {
|
||||
doSomething()
|
||||
}
|
||||
doSomething()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBadError() error {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Bad: despite an error, we return nil
|
||||
return nil
|
||||
}
|
||||
doSomething()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBadWithElseError() error {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Bad: despite an error, we return nil
|
||||
return nil
|
||||
} else {
|
||||
doSomething()
|
||||
}
|
||||
doSomething()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func elseBranchGoodError() error {
|
||||
|
||||
if errorSource() == ErrNone {
|
||||
doSomething()
|
||||
} else {
|
||||
// Good: returning an error
|
||||
return errors.New("failed")
|
||||
}
|
||||
doSomething()
|
||||
return nil
|
||||
}
|
||||
|
||||
func elseBranchBadError() error {
|
||||
|
||||
if errorSource() == ErrNone {
|
||||
doSomething()
|
||||
} else {
|
||||
// Bad: despite an error, we return nil
|
||||
return nil
|
||||
}
|
||||
doSomething()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func multiReturnBad() (string, error) {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Bad: despite an error, we return a nil error
|
||||
return "", nil
|
||||
}
|
||||
doSomething()
|
||||
return "Result", nil
|
||||
|
||||
}
|
||||
|
||||
func getNil() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func getError(s string) error {
|
||||
return errors.New(s)
|
||||
}
|
||||
|
||||
func thenBranchGoodInterproceduralError() error {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Good: returning an error
|
||||
return getError("failed")
|
||||
}
|
||||
doSomething()
|
||||
return getNil()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBadInterproceduralError() error {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Good: returning nil despite an error
|
||||
return getNil()
|
||||
}
|
||||
doSomething()
|
||||
return getNil()
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
package minioExtensions
|
||||
|
||||
func thenBranchGood() {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchGoodWithElse() {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
} else {
|
||||
doSomething()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBad() {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBadWithElse() {
|
||||
|
||||
if errorSource() != ErrNone {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
} else {
|
||||
doSomething()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func elseBranchGood() {
|
||||
|
||||
if errorSource() == ErrNone {
|
||||
doSomething()
|
||||
} else {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func elseBranchBad() {
|
||||
|
||||
if errorSource() == ErrNone {
|
||||
doSomething()
|
||||
} else {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
|
@ -0,0 +1,125 @@
|
|||
package minioExtensions
|
||||
|
||||
func negatedThenBranchGood() {
|
||||
|
||||
if !(errorSource() == ErrNone) {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func negatedThenBranchGoodWithElse() {
|
||||
|
||||
if !(errorSource() == ErrNone) {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
} else {
|
||||
doSomething()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func negatedElseBranchGood() {
|
||||
|
||||
if !(errorSource() != ErrNone) {
|
||||
doSomething()
|
||||
} else {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func negatedElseBranchBad() {
|
||||
|
||||
if !(errorSource() != ErrNone) {
|
||||
doSomething()
|
||||
} else {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func someOtherCondition() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func logicalAndThenBranchGood() {
|
||||
|
||||
if errorSource() != ErrNone && someOtherCondition() {
|
||||
// Good: in the then-block, where we're certain there has been an error,
|
||||
// we return early. In the other branch an error is possible but not certain.
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func logicalAndThenBranchBad() {
|
||||
|
||||
if errorSource() != ErrNone && someOtherCondition() {
|
||||
// Bad: in the then-block, where we're certain there has been an error,
|
||||
// we do not return early.
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func logicalAndElseBranchUncertain() {
|
||||
|
||||
if errorSource() == ErrNone && someOtherCondition() {
|
||||
doSomething()
|
||||
} else {
|
||||
// Uncertain: an error is not a precondition for entering either branch.
|
||||
// We should be conservative and NOT flag this function as a problem.
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func logicalOrElseBranchGood() {
|
||||
|
||||
if errorSource() == ErrNone || someOtherCondition() {
|
||||
doSomething()
|
||||
} else {
|
||||
// Good: in the else-block, where we're certain there has been an error,
|
||||
// we return early. In the other branch an error is possible but not certain.
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func logicalOrElseBranchBad() {
|
||||
|
||||
if errorSource() == ErrNone || someOtherCondition() {
|
||||
doSomething()
|
||||
} else {
|
||||
// Bad: in the else-block, where we're certain there has been an error,
|
||||
// we do not return early.
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func logicalOrThenBranchUncertain() {
|
||||
|
||||
if errorSource() != ErrNone || someOtherCondition() {
|
||||
// Uncertain: an error is not a precondition for entering either branch.
|
||||
// We should be conservative and NOT flag this function as a problem.
|
||||
insteadOfReturn()
|
||||
} else {
|
||||
doSomething()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
package minioExtensions
|
||||
|
||||
const particularErrOne = 1
|
||||
const particularErrTwo = 2
|
||||
|
||||
func subBranchGood() int {
|
||||
|
||||
// Good: while the if-block's logic is complex, it always returns.
|
||||
err := errorSource()
|
||||
if err != ErrNone {
|
||||
if err == particularErrOne {
|
||||
return -1
|
||||
} else if err == particularErrTwo {
|
||||
return -2
|
||||
} else {
|
||||
return -3
|
||||
}
|
||||
}
|
||||
doSomething()
|
||||
return 0
|
||||
|
||||
}
|
||||
|
||||
func subBranchBad() int {
|
||||
|
||||
// Bad: one of the if-block's branches falls through to execute `doSomething()`.
|
||||
err := errorSource()
|
||||
if err != ErrNone {
|
||||
if err == particularErrOne {
|
||||
return -1
|
||||
} else if err == particularErrTwo {
|
||||
err = ErrNone
|
||||
} else {
|
||||
return -3
|
||||
}
|
||||
}
|
||||
doSomething()
|
||||
return 0
|
||||
|
||||
}
|
||||
|
||||
func switchGood() int {
|
||||
|
||||
// Good: while the if-block's logic is complex, it always returns.
|
||||
err := errorSource()
|
||||
if err != ErrNone {
|
||||
switch err {
|
||||
case particularErrOne:
|
||||
return -1
|
||||
case particularErrTwo:
|
||||
return -2
|
||||
default:
|
||||
return -3
|
||||
}
|
||||
}
|
||||
doSomething()
|
||||
return 0
|
||||
|
||||
}
|
||||
|
||||
func switchBad() int {
|
||||
|
||||
// Bad: one of the if-block's branches falls through to execute `doSomething()`.
|
||||
err := errorSource()
|
||||
if err != ErrNone {
|
||||
switch err {
|
||||
case particularErrOne:
|
||||
err = ErrNone
|
||||
case particularErrTwo:
|
||||
return -2
|
||||
default:
|
||||
return -3
|
||||
}
|
||||
}
|
||||
doSomething()
|
||||
return 0
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package minioExtensions
|
||||
|
||||
func errorSource() int {
|
||||
// The source of error values that must be checked.
|
||||
// We should treat this the same as `isReqAuthenticated` in the real `minio`.
|
||||
return 0
|
||||
}
|
||||
|
||||
// The ErrNone value that errorSource() is compared against.
|
||||
var ErrNone = 0
|
||||
|
||||
func doSomething() {
|
||||
// A no-op used as a stand-in for whatever code would normally follow an error check.
|
||||
}
|
||||
|
||||
// A filler function, used to occupy a then- or else-block that would otherwise be empty,
|
||||
// where a return would be expected
|
||||
func insteadOfReturn() {
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
package minioExtensions
|
||||
|
||||
func success() bool {
|
||||
return errorSource() == ErrNone
|
||||
}
|
||||
|
||||
func failure() bool {
|
||||
return errorSource() != ErrNone
|
||||
}
|
||||
|
||||
func succeeded(ret int) bool {
|
||||
return ret == ErrNone
|
||||
}
|
||||
|
||||
func failed(ret int) bool {
|
||||
return ret != ErrNone
|
||||
}
|
||||
|
||||
func thenBranchGoodSourceWrapper() {
|
||||
|
||||
if failure() {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBadSourceWrapper() {
|
||||
|
||||
if failure() {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func elseBranchGoodSourceWrapper() {
|
||||
|
||||
if success() {
|
||||
doSomething()
|
||||
} else {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func elseBranchBadSourceWrapper() {
|
||||
|
||||
if success() {
|
||||
doSomething()
|
||||
} else {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchGoodTestWrapper() {
|
||||
|
||||
if failed(errorSource()) {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func thenBranchBadTestWrapper() {
|
||||
|
||||
if failed(errorSource()) {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func elseBranchGoodTestWrapper() {
|
||||
|
||||
if succeeded(errorSource()) {
|
||||
doSomething()
|
||||
} else {
|
||||
// Good: an error means we return early
|
||||
return
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
||||
|
||||
func elseBranchBadTestWrapper() {
|
||||
|
||||
if succeeded(errorSource()) {
|
||||
doSomething()
|
||||
} else {
|
||||
// Bad: despite an error, we carry on to execute doSomething()
|
||||
insteadOfReturn()
|
||||
}
|
||||
doSomething()
|
||||
|
||||
}
|
Загрузка…
Ссылка в новой задаче