From 07747b30fbc8db92cfc359da411f12c21920a4ff Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sat, 15 Aug 2015 22:42:06 -0700 Subject: [PATCH] Warn about undefined behavior of test -a and -o. --- ShellCheck/Analytics.hs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index 77c7f05..436974a 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -1280,15 +1280,25 @@ checkDoubleBracketOperators _ _ = return () prop_checkConditionalAndOrs1 = verify checkConditionalAndOrs "[ foo && bar ]" prop_checkConditionalAndOrs2 = verify checkConditionalAndOrs "[[ foo -o bar ]]" prop_checkConditionalAndOrs3 = verifyNot checkConditionalAndOrs "[[ foo || bar ]]" -checkConditionalAndOrs _ (TC_And id SingleBracket "&&" _ _) = - err id 2107 "You can't use && inside [..]. Use -a instead." -checkConditionalAndOrs _ (TC_And id DoubleBracket "-a" _ _) = - err id 2108 "In [[..]], use && instead of -a." -checkConditionalAndOrs _ (TC_Or id SingleBracket "||" _ _) = - err id 2109 "You can't use || inside [..]. Use -o instead." -checkConditionalAndOrs _ (TC_Or id DoubleBracket "-o" _ _) = - err id 2110 "In [[..]], use || instead of -o." -checkConditionalAndOrs _ _ = return () +prop_checkConditionalAndOrs4 = verify checkConditionalAndOrs "[ foo -a bar ]" +prop_checkConditionalAndOrs5 = verify checkConditionalAndOrs "[ -z 3 -o a = b ]" +checkConditionalAndOrs _ t = + case t of + (TC_And id SingleBracket "&&" _ _) -> + err id 2107 "Instead of [ a && b ], use [ a ] && [ b ]." + (TC_And id DoubleBracket "-a" _ _) -> + err id 2108 "In [[..]], use && instead of -a." + (TC_Or id SingleBracket "||" _ _) -> + err id 2109 "Instead of [ a || b ], use [ a ] || [ b ]." + (TC_Or id DoubleBracket "-o" _ _) -> + err id 2110 "In [[..]], use || instead of -o." + + (TC_And id SingleBracket "-a" _ _) -> + warn id 2166 "Prefer [ p ] && [ q ] as [ p -a q ] is not well defined." + (TC_Or id SingleBracket "-o" _ _) -> + warn id 2166 "Prefer [ p ] || [ q ] as [ p -o q ] is not well defined." + + otherwise -> return () prop_checkQuotedCondRegex1 = verify checkQuotedCondRegex "[[ $foo =~ \"bar\" ]]" prop_checkQuotedCondRegex2 = verify checkQuotedCondRegex "[[ $foo =~ 'cow' ]]"