diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs
index b5bac35..e9ea36a 100644
--- a/src/ShellCheck/Analytics.hs
+++ b/src/ShellCheck/Analytics.hs
@@ -2099,6 +2099,8 @@ prop_checkSpacefulnessCfg61 = verify checkSpacefulnessCfg "declare -x X; y=foo$X
 prop_checkSpacefulnessCfg62 = verifyNot checkSpacefulnessCfg "f() { declare -x X; y=foo$X; echo $y; }"
 prop_checkSpacefulnessCfg63 = verify checkSpacefulnessCfg "f && declare -i s; s='x + y'; echo $s"
 prop_checkSpacefulnessCfg64 = verifyNot checkSpacefulnessCfg "declare -i s; s='x + y'; x=$s; echo $x"
+prop_checkSpacefulnessCfg65 = verifyNot checkSpacefulnessCfg "f() { s=$?; echo $s; }; f"
+prop_checkSpacefulnessCfg66 = verifyNot checkSpacefulnessCfg "f() { s=$?; echo $s; }"
 
 checkSpacefulnessCfg = checkSpacefulnessCfg' True
 checkVerboseSpacefulnessCfg = checkSpacefulnessCfg' False
diff --git a/src/ShellCheck/CFGAnalysis.hs b/src/ShellCheck/CFGAnalysis.hs
index 634d354..7b270a8 100644
--- a/src/ShellCheck/CFGAnalysis.hs
+++ b/src/ShellCheck/CFGAnalysis.hs
@@ -1300,8 +1300,7 @@ dataflow ctx entry = do
         outgoing = map snd outgoingL
         isRegular = ((== CFEFlow) . fst)
 
-runRoot ctx entry exit = do
-    let env = createEnvironmentState
+runRoot ctx env entry exit = do
     writeSTRef (cInput ctx) $ env
     writeSTRef (cOutput ctx) $ env
     writeSTRef (cNode ctx) $ entry
@@ -1321,9 +1320,10 @@ analyzeControlFlow params t =
         runST $ f cfg entry exit
   where
     f cfg entry exit = do
+        let env = createEnvironmentState
         ctx <- newCtx $ cfGraph cfg
         -- Do a dataflow analysis starting on the root node
-        exitState <- runRoot ctx entry exit
+        exitState <- runRoot ctx env entry exit
 
         -- All nodes we've touched
         invocations <- readSTRef $ cInvocations ctx
@@ -1336,7 +1336,7 @@ analyzeControlFlow params t =
         let uninvoked = M.difference declaredFunctions invokedNodes
 
         let stragglerInput =
-                exitState {
+                (env `patchState` exitState) {
                     -- We don't want `die() { exit $?; }; echo "Sourced"` to assume $? is always echo
                     sExitCodes = Nothing
                 }