From fdd02c94c01b81b78e2dada903ea88e29a39befe Mon Sep 17 00:00:00 2001 From: Gandalf- Date: Sun, 22 Dec 2019 23:11:20 -0800 Subject: [PATCH] Issue 1759 mapfile and process substition https://github.com/koalaman/shellcheck/issues/1759 When a simple process substition is used, this tripped up the getMapfileArray function by making the last argument not a variable --- src/ShellCheck/Analytics.hs | 1 + src/ShellCheck/AnalyzerLib.hs | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs index 582b8cd..d6ea460 100644 --- a/src/ShellCheck/Analytics.hs +++ b/src/ShellCheck/Analytics.hs @@ -2190,6 +2190,7 @@ prop_checkUnassignedReferences36= verifyNotTree checkUnassignedReferences "read prop_checkUnassignedReferences37= verifyNotTree checkUnassignedReferences "var=howdy; printf -v 'array[0]' %s \"$var\"; printf %s \"${array[0]}\";" prop_checkUnassignedReferences38= verifyTree (checkUnassignedReferences' True) "echo $VAR" prop_checkUnassignedReferences39= verifyNotTree checkUnassignedReferences "builtin export var=4; echo $var" +prop_checkUnassignedReferences40= verifyNotTree checkUnassignedReferences "mapfile -t files <(cat); echo \"${files[@]}\"" checkUnassignedReferences = checkUnassignedReferences' False checkUnassignedReferences' includeGlobals params t = warnings diff --git a/src/ShellCheck/AnalyzerLib.hs b/src/ShellCheck/AnalyzerLib.hs index 590889c..1e30c7a 100644 --- a/src/ShellCheck/AnalyzerLib.hs +++ b/src/ShellCheck/AnalyzerLib.hs @@ -670,13 +670,17 @@ getModifiedVariableCommand base@(T_SimpleCommand id cmdPrefix (T_NormalWord _ (T -- mapfile has some curious syntax allowing flags plus 0..n variable names -- where only the first non-option one is used if any. Here we cheat and - -- just get the last one, if it's a variable name. + -- just get the last one, if it's a variable name, and omitting process + -- substitions. getMapfileArray base arguments = do - lastArg <- listToMaybe (reverse arguments) + lastArg <- listToMaybe (filter notProcSub $ reverse arguments) name <- getLiteralString lastArg guard $ isVariableName name return (base, lastArg, name, DataArray SourceExternal) + notProcSub (T_NormalWord _ (T_ProcSub{} :_)) = False + notProcSub _ = True + -- get all the array variables used in read, e.g. read -a arr getReadArrayVariables args = map (getLiteralArray . snd)