diff --git a/dlint/linters/bad_subprocess_use.py b/dlint/linters/bad_subprocess_use.py index 2bd518c..6fc29fb 100644 --- a/dlint/linters/bad_subprocess_use.py +++ b/dlint/linters/bad_subprocess_use.py @@ -30,30 +30,36 @@ class BadSubprocessUseLinter(bad_kwarg_use.BadKwargUseLinter): @property def kwargs(self): + def present_and_not_false(call, kwarg_name): + return ( + tree.kwarg_present(call, kwarg_name) + and not tree.kwarg_false(call, kwarg_name) + ) + return [ { "module_path": "subprocess.call", "kwarg_name": "shell", - "predicate": tree.kwarg_present, + "predicate": present_and_not_false, }, { "module_path": "subprocess.check_call", "kwarg_name": "shell", - "predicate": tree.kwarg_present, + "predicate": present_and_not_false, }, { "module_path": "subprocess.check_output", "kwarg_name": "shell", - "predicate": tree.kwarg_present, + "predicate": present_and_not_false, }, { "module_path": "subprocess.Popen", "kwarg_name": "shell", - "predicate": tree.kwarg_present, + "predicate": present_and_not_false, }, { "module_path": "subprocess.run", "kwarg_name": "shell", - "predicate": tree.kwarg_present, - } + "predicate": present_and_not_false, + }, ] diff --git a/tests/test_bad_subprocess_use.py b/tests/test_bad_subprocess_use.py index c91a71b..41ecc53 100644 --- a/tests/test_bad_subprocess_use.py +++ b/tests/test_bad_subprocess_use.py @@ -19,11 +19,14 @@ def test_bad_subprocess_usage(self): """ import subprocess + command = "/bin/echo" + subprocess.call(shell=True) subprocess.check_call(shell=True) subprocess.check_output(shell=True) subprocess.Popen(shell=True) subprocess.run(shell=True) + subprocess.run(command,shell=True) """ ) @@ -33,27 +36,32 @@ def test_bad_subprocess_usage(self): result = linter.get_results() expected = [ dlint.linters.base.Flake8Result( - lineno=4, + lineno=6, col_offset=0, message=dlint.linters.BadSubprocessUseLinter._error_tmpl ), dlint.linters.base.Flake8Result( - lineno=5, + lineno=7, col_offset=0, message=dlint.linters.BadSubprocessUseLinter._error_tmpl ), dlint.linters.base.Flake8Result( - lineno=6, + lineno=8, col_offset=0, message=dlint.linters.BadSubprocessUseLinter._error_tmpl ), dlint.linters.base.Flake8Result( - lineno=7, + lineno=9, col_offset=0, message=dlint.linters.BadSubprocessUseLinter._error_tmpl ), dlint.linters.base.Flake8Result( - lineno=8, + lineno=10, + col_offset=0, + message=dlint.linters.BadSubprocessUseLinter._error_tmpl + ), + dlint.linters.base.Flake8Result( + lineno=11, col_offset=0, message=dlint.linters.BadSubprocessUseLinter._error_tmpl ), @@ -61,6 +69,31 @@ def test_bad_subprocess_usage(self): assert result == expected + def test_subprocess_usage(self): + python_node = self.get_ast_node( + """ + import subprocess + + command = "/bin/echo" + + subprocess.call(command) + subprocess.call(shell=False) + subprocess.check_call(shell=False) + subprocess.check_output(shell=False) + subprocess.Popen(shell=False) + subprocess.run(command) + subprocess.run(shell=False) + """ + ) + + linter = dlint.linters.BadSubprocessUseLinter() + linter.visit(python_node) + + result = linter.get_results() + expected = [] + + assert result == expected + if __name__ == "__main__": unittest.main()