From a82e606e8d18e03ff18072a064b42cc8413c0fc6 Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Fri, 31 Jan 2020 14:49:25 +0100 Subject: [PATCH] Don't trigger SC2154 (unassigned var) in `-n`/`-z` expressions #1583 --- src/ShellCheck/Analytics.hs | 10 ++++++++++ src/ShellCheck/AnalyzerLib.hs | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs index 582b8cd..cf952f5 100644 --- a/src/ShellCheck/Analytics.hs +++ b/src/ShellCheck/Analytics.hs @@ -2191,6 +2191,16 @@ prop_checkUnassignedReferences37= verifyNotTree checkUnassignedReferences "var=h prop_checkUnassignedReferences38= verifyTree (checkUnassignedReferences' True) "echo $VAR" prop_checkUnassignedReferences39= verifyNotTree checkUnassignedReferences "builtin export var=4; echo $var" +prop_checkUnassignedReferences_minusNPlain = verifyNotTree checkUnassignedReferences "if [ -n \"$x\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZPlain = verifyNotTree checkUnassignedReferences "if [ -z \"$x\" ]; then echo \"\"; fi" +prop_checkUnassignedReferences_minusNBraced = verifyNotTree checkUnassignedReferences "if [ -n \"${x}\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZBraced = verifyNotTree checkUnassignedReferences "if [ -z \"${x}\" ]; then echo \"\"; fi" +prop_checkUnassignedReferences_minusNDefault = verifyNotTree checkUnassignedReferences "if [ -n \"${x:-}\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZDefault = verifyNotTree checkUnassignedReferences "if [ -z \"${x:-}\" ]; then echo \"\"; fi" + +prop_checkUnassignedReferences_minusZInsteadOfN = verifyTree checkUnassignedReferences "if [ -z \"$x\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZInsteadOfNBraced = verifyTree checkUnassignedReferences "if [ -z \"${x}\" ]; then echo $x; fi" + checkUnassignedReferences = checkUnassignedReferences' False checkUnassignedReferences' includeGlobals params t = warnings where diff --git a/src/ShellCheck/AnalyzerLib.hs b/src/ShellCheck/AnalyzerLib.hs index 590889c..b5e740a 100644 --- a/src/ShellCheck/AnalyzerLib.hs +++ b/src/ShellCheck/AnalyzerLib.hs @@ -510,6 +510,9 @@ getModifiedVariables t = guard . not . null $ str return (t, token, str, DataString SourceChecked) + TC_Unary _ _ "-n" (T_NormalWord _ [T_DoubleQuoted _ [db@(T_DollarBraced _ _ _)]]) -> + [(t, t, getBracedReference (bracedString db), DataString SourceChecked)] + T_DollarBraced _ _ l -> maybeToList $ do let string = bracedString t let modifier = getBracedModifier string @@ -719,7 +722,9 @@ getOffsetReferences mods = fromMaybe [] $ do getReferencedVariables parents t = case t of T_DollarBraced id _ l -> let str = bracedString t in - (t, t, getBracedReference str) : + if isMinusZTest t + then [] + else (t, t, getBracedReference str) : map (\x -> (l, l, x)) ( getIndexReferences str ++ getOffsetReferences (getBracedModifier str)) @@ -774,6 +779,10 @@ getReferencedVariables parents t = this: TA_Assignment _ "=" lhs _ :_ -> lhs == t _ -> False + isMinusZTest t = case getPath parents t of + _ : T_DoubleQuoted _ [_] : T_NormalWord _ [_] : TC_Unary _ SingleBracket "-z" _ : _ -> True + _ -> False + dataTypeFrom defaultType v = (case v of T_Array {} -> DataArray; _ -> defaultType) $ SourceFrom [v]