Skip to content

Commit eb217e8

Browse files
Copilotdotysan
andcommitted
Fix SC2317 false positive on return ||: when script is not sourced
Co-authored-by: dotysan <5060170+dotysan@users.noreply.github.com>
1 parent c4081e1 commit eb217e8

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

src/ShellCheck/Analytics.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5049,6 +5049,9 @@ prop_checkCommandIsUnreachable2 = verify checkCommandIsUnreachable "die() { exit
50495049
prop_checkCommandIsUnreachable3 = verifyNot checkCommandIsUnreachable "foo; bar || exit; baz"
50505050
prop_checkCommandIsUnreachable4 = verifyNot checkCommandIsUnreachable "f() { foo; }; # Maybe sourced"
50515051
prop_checkCommandIsUnreachable5 = verify checkCommandIsUnreachable "f() { foo; }; exit # Not sourced"
5052+
prop_checkCommandIsUnreachable6 = verifyNot checkCommandIsUnreachable "return || :; echo 'reachable'"
5053+
prop_checkCommandIsUnreachable7 = verifyNot checkCommandIsUnreachable "return; echo 'reachable when not in function'"
5054+
prop_checkCommandIsUnreachable8 = verify checkCommandIsUnreachable "f() { return; echo unreachable; }"
50525055
checkCommandIsUnreachable params t =
50535056
case t of
50545057
T_Pipeline {} -> sequence_ $ do

src/ShellCheck/CFG.hs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -983,13 +983,20 @@ handleCommand cmd vars args literalCmd = do
983983

984984
handleReturn = do
985985
returnTarget <- reader cfReturnTarget
986-
case returnTarget of
987-
Nothing -> error $ pleaseReport "missing return target"
988-
Just target -> do
986+
isFunction <- reader cfIsFunction
987+
case (returnTarget, isFunction) of
988+
(Nothing, _) -> error $ pleaseReport "missing return target"
989+
(Just target, True) -> do
990+
-- In a function: return actually returns, making subsequent code unreachable
989991
ret <- newNode CFStructuralNode
990992
link ret target CFEFlow
991993
unreachable <- newNode CFUnreachable
992994
return $ Range ret unreachable
995+
(Just _, False) -> do
996+
-- Not in a function: return will fail and execution continues
997+
-- Treat it like a regular command that sets exit code
998+
ret <- newNodeRange $ CFSetExitCode (getId cmd)
999+
return ret
9931000

9941001
handleUnset (cmd NE.:| args) = do
9951002
case () of

0 commit comments

Comments
 (0)