Warn about [ $a != x ] || [ $a != y ]
This commit is contained in:
parent
36bb1e7858
commit
3e7c2bfec0
|
@ -8,6 +8,7 @@
|
||||||
- Source paths: Use `-P dir1:dir2` or a `source-path=dir1` directive
|
- Source paths: Use `-P dir1:dir2` or a `source-path=dir1` directive
|
||||||
to specify search paths for sourced files.
|
to specify search paths for sourced files.
|
||||||
- json1 format like --format=json but treats tabs as single characters
|
- json1 format like --format=json but treats tabs as single characters
|
||||||
|
- SC2252: Warn about `[ $a != x ] || [ $a != y ]`, similar to SC2055
|
||||||
- SC2251: Inform about ineffectual ! in front of commands
|
- SC2251: Inform about ineffectual ! in front of commands
|
||||||
- SC2250: Warn about variable references without braces (optional)
|
- SC2250: Warn about variable references without braces (optional)
|
||||||
- SC2249: Warn about `case` with missing default case (optional)
|
- SC2249: Warn about `case` with missing default case (optional)
|
||||||
|
|
|
@ -1348,14 +1348,39 @@ prop_checkOrNeq2 = verify checkOrNeq "(( a!=lol || a!=foo ))"
|
||||||
prop_checkOrNeq3 = verify checkOrNeq "[ \"$a\" != lol || \"$a\" != foo ]"
|
prop_checkOrNeq3 = verify checkOrNeq "[ \"$a\" != lol || \"$a\" != foo ]"
|
||||||
prop_checkOrNeq4 = verifyNot checkOrNeq "[ a != $cow || b != $foo ]"
|
prop_checkOrNeq4 = verifyNot checkOrNeq "[ a != $cow || b != $foo ]"
|
||||||
prop_checkOrNeq5 = verifyNot checkOrNeq "[[ $a != /home || $a != */public_html/* ]]"
|
prop_checkOrNeq5 = verifyNot checkOrNeq "[[ $a != /home || $a != */public_html/* ]]"
|
||||||
|
prop_checkOrNeq6 = verify checkOrNeq "[ $a != a ] || [ $a != b ]"
|
||||||
|
prop_checkOrNeq7 = verify checkOrNeq "[ $a != a ] || [ $a != b ] || true"
|
||||||
|
prop_checkOrNeq8 = verifyNot checkOrNeq "[[ $a != x || $a != x ]]"
|
||||||
-- This only catches the most idiomatic cases. Fixme?
|
-- This only catches the most idiomatic cases. Fixme?
|
||||||
|
|
||||||
|
-- For test-level "or": [ x != y -o x != z ]
|
||||||
checkOrNeq _ (TC_Or id typ op (TC_Binary _ _ op1 lhs1 rhs1 ) (TC_Binary _ _ op2 lhs2 rhs2))
|
checkOrNeq _ (TC_Or id typ op (TC_Binary _ _ op1 lhs1 rhs1 ) (TC_Binary _ _ op2 lhs2 rhs2))
|
||||||
| lhs1 == lhs2 && (op1 == op2 && (op1 == "-ne" || op1 == "!=")) && not (any isGlob [rhs1,rhs2]) =
|
| (op1 == op2 && (op1 == "-ne" || op1 == "!=")) && lhs1 == lhs2 && rhs1 /= rhs2 && not (any isGlob [rhs1,rhs2]) =
|
||||||
warn id 2055 $ "You probably wanted " ++ (if typ == SingleBracket then "-a" else "&&") ++ " here."
|
warn id 2055 $ "You probably wanted " ++ (if typ == SingleBracket then "-a" else "&&") ++ " here."
|
||||||
|
|
||||||
|
-- For arithmetic context "or"
|
||||||
checkOrNeq _ (TA_Binary id "||" (TA_Binary _ "!=" word1 _) (TA_Binary _ "!=" word2 _))
|
checkOrNeq _ (TA_Binary id "||" (TA_Binary _ "!=" word1 _) (TA_Binary _ "!=" word2 _))
|
||||||
| word1 == word2 =
|
| word1 == word2 =
|
||||||
warn id 2056 "You probably wanted && here."
|
warn id 2056 "You probably wanted && here, otherwise it's always true."
|
||||||
|
|
||||||
|
-- For command level "or": [ x != y ] || [ x != z ]
|
||||||
|
checkOrNeq _ (T_OrIf id lhs rhs) = potentially $ do
|
||||||
|
(lhs1, op1, rhs1) <- getExpr lhs
|
||||||
|
(lhs2, op2, rhs2) <- getExpr rhs
|
||||||
|
guard $ op1 == op2 && op1 `elem` ["-ne", "!="]
|
||||||
|
guard $ lhs1 == lhs2 && rhs1 /= rhs2
|
||||||
|
guard . not $ any isGlob [rhs1, rhs2]
|
||||||
|
return $ warn id 2252 "You probably wanted && here, otherwise it's always true."
|
||||||
|
where
|
||||||
|
getExpr x =
|
||||||
|
case x of
|
||||||
|
T_OrIf _ lhs _ -> getExpr lhs -- Fetches x and y in `T_OrIf x (T_OrIf y z)`
|
||||||
|
T_Pipeline _ _ [x] -> getExpr x
|
||||||
|
T_Redirecting _ _ c -> getExpr c
|
||||||
|
T_Condition _ _ c -> getExpr c
|
||||||
|
TC_Binary _ _ op lhs rhs -> return (lhs, op, rhs)
|
||||||
|
_ -> fail ""
|
||||||
|
|
||||||
checkOrNeq _ _ = return ()
|
checkOrNeq _ _ = return ()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue