From 4aca1ff12836f883684bfc684156678dbf84fcd0 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Wed, 28 Mar 2018 08:56:40 -0700 Subject: [PATCH] Warn when printf arg count is not a multiple of format count --- CHANGELOG.md | 1 + src/ShellCheck/Checks/Commands.hs | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7fb5e9..c8efb72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ ### Changed - SC1073: 'else if' is now parsed correctly and not like 'elif' - SC2163: 'export $name' can now be silenced with 'export ${name?}' +- SC2183: Now warns when printf arg count is not a multiple of format count ## v0.4.7 - 2017-12-08 ### Added diff --git a/src/ShellCheck/Checks/Commands.hs b/src/ShellCheck/Checks/Commands.hs index bef491d..4da90f9 100644 --- a/src/ShellCheck/Checks/Commands.hs +++ b/src/ShellCheck/Checks/Commands.hs @@ -511,6 +511,8 @@ prop_checkPrintfVar8 = verifyNot checkPrintfVar "printf '%s %s %s' \"${var[@]}\" prop_checkPrintfVar9 = verifyNot checkPrintfVar "printf '%s %s %s\\n' *.png" prop_checkPrintfVar10= verifyNot checkPrintfVar "printf '%s %s %s' foo bar baz" prop_checkPrintfVar11= verifyNot checkPrintfVar "printf '%(%s%s)T' -1" +prop_checkPrintfVar12= verify checkPrintfVar "printf '%s %s\\n' 1 2 3" +prop_checkPrintfVar13= verifyNot checkPrintfVar "printf '%s %s\\n' 1 2 3 4" checkPrintfVar = CommandCheck (Exactly "printf") (f . arguments) where f (doubledash:rest) | getLiteralString doubledash == Just "--" = f rest f (dashv:var:rest) | getLiteralString dashv == Just "-v" = f rest @@ -536,7 +538,7 @@ checkPrintfVar = CommandCheck (Exactly "printf") (f . arguments) where "This printf format string has no variables. Other arguments are ignored." when (vars > 0 - && length more < vars + && ((length more) `mod` vars /= 0 || null more) && all (not . mayBecomeMultipleArgs) more) $ warn (getId format) 2183 $ "This format string has " ++ show vars ++ " variables, but is passed " ++ show (length more) ++ " arguments."