From cb76951ad23616b971493674eea0170864bddbc4 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sat, 24 Nov 2018 22:56:22 -0800 Subject: [PATCH] Add warnings for 'exit' similar to 'return' (fixes #1388) --- CHANGELOG.md | 3 +++ src/ShellCheck/Checks/Commands.hs | 24 +++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22e3207..947e456 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,17 @@ ### Added - Command line option --severity/-S for filtering by minimum severity - Command line option --wiki-link-count/-W for showing wiki links +- SC2152/SC2151: Warn about bad `exit` values like `1234` and `"foo"` - SC2236/SC2237: Suggest -n/-z instead of ! -z/-n - SC2238: Warn when redirecting to a known command name, e.g. ls > rm - SC2239: Warn if the shebang is not an absolute path, e.g. #!bin/sh - SC2240: Warn when passing additional arguments to dot (.) in sh/dash - SC1133: Better diagnostics when starting a line with |/||/&& + ### Changed - Most warnings now have useful end positions - SC1117 about unknown double-quoted escape sequences has been retired + ### Fixed - SC2021 no longer triggers for equivalence classes like '[=e=]' - SC2221/SC2222 no longer mistriggers on fall-through case branches diff --git a/src/ShellCheck/Checks/Commands.hs b/src/ShellCheck/Checks/Commands.hs index fbbb67a..f4ead5b 100644 --- a/src/ShellCheck/Checks/Commands.hs +++ b/src/ShellCheck/Checks/Commands.hs @@ -61,6 +61,7 @@ commandChecks = [ ,checkGrepRe ,checkTrapQuotes ,checkReturn + ,checkExit ,checkFindExecWithSingleArgument ,checkUnusedEchoEscapes ,checkInjectableFindSh @@ -281,15 +282,28 @@ prop_checkReturn4 = verifyNot checkReturn "return $((a|b))" prop_checkReturn5 = verify checkReturn "return -1" prop_checkReturn6 = verify checkReturn "return 1000" prop_checkReturn7 = verify checkReturn "return 'hello world'" -checkReturn = CommandCheck (Exactly "return") (f . arguments) +checkReturn = CommandCheck (Exactly "return") (returnOrExit + (\c -> err c 2151 "Only one integer 0-255 can be returned. Use stdout for other data.") + (\c -> err c 2152 "Can only return 0-255. Other data should be written to stdout.")) + +prop_checkExit1 = verifyNot checkExit "exit" +prop_checkExit2 = verifyNot checkExit "exit 1" +prop_checkExit3 = verifyNot checkExit "exit $var" +prop_checkExit4 = verifyNot checkExit "exit $((a|b))" +prop_checkExit5 = verify checkExit "exit -1" +prop_checkExit6 = verify checkExit "exit 1000" +prop_checkExit7 = verify checkExit "exit 'hello world'" +checkExit = CommandCheck (Exactly "exit") (returnOrExit + (\c -> err c 2241 "The exit status can only be one integer 0-255. Use stdout for other data.") + (\c -> err c 2242 "Can only exit with status 0-255. Other data should be written to stdout/stderr.")) + +returnOrExit multi invalid = (f . arguments) where f (first:second:_) = - err (getId second) 2151 - "Only one integer 0-255 can be returned. Use stdout for other data." + multi (getId first) f [value] = when (isInvalid $ literal value) $ - err (getId value) 2152 - "Can only return 0-255. Other data should be written to stdout." + invalid (getId value) f _ = return () isInvalid s = s == "" || any (not . isDigit) s || length s > 5