diff --git a/python/ql/src/Statements/SideEffectInAssert.py b/python/ql/src/Statements/SideEffectInAssert.py index 4aba0adc8de..f5a5cbdf807 100644 --- a/python/ql/src/Statements/SideEffectInAssert.py +++ b/python/ql/src/Statements/SideEffectInAssert.py @@ -1 +1 @@ -assert(subprocess.call(['run-backup']) == 0) +assert subprocess.call(['run-backup']) == 0 diff --git a/python/ql/src/Statements/SideEffectInAssert.ql b/python/ql/src/Statements/SideEffectInAssert.ql index faf10defcd1..a8ed146b16e 100644 --- a/python/ql/src/Statements/SideEffectInAssert.ql +++ b/python/ql/src/Statements/SideEffectInAssert.ql @@ -28,6 +28,14 @@ predicate func_with_side_effects(Expr e) { ) } +predicate call_with_side_effect(Call e) { + e.getAFlowNode() = Value::named("subprocess.call").getACall() + or + e.getAFlowNode() = Value::named("subprocess.check_call").getACall() + or + e.getAFlowNode() = Value::named("subprocess.check_output").getACall() +} + predicate probable_side_effect(Expr e) { // Only consider explicit yields, not artificial ones in comprehensions e instanceof Yield and not exists(Comp c | c.contains(e)) @@ -35,6 +43,8 @@ predicate probable_side_effect(Expr e) { e instanceof YieldFrom or e instanceof Call and func_with_side_effects(e.(Call).getFunc()) + or + e instanceof Call and call_with_side_effect(e) } from Assert a, Expr e diff --git a/python/ql/test/query-tests/Statements/asserts/SideEffectInAssert.expected b/python/ql/test/query-tests/Statements/asserts/SideEffectInAssert.expected index 4f46cff1e76..f7425a3a429 100644 --- a/python/ql/test/query-tests/Statements/asserts/SideEffectInAssert.expected +++ b/python/ql/test/query-tests/Statements/asserts/SideEffectInAssert.expected @@ -1,2 +1,3 @@ | assert.py:5:5:5:20 | Assert | This 'assert' statement contains $@ which may have side effects. | assert.py:5:13:5:19 | Yield | an expression | | assert.py:8:5:8:22 | Assert | This 'assert' statement contains $@ which may have side effects. | assert.py:8:12:8:22 | Attribute() | an expression | +| assert.py:20:1:20:43 | Assert | This 'assert' statement contains $@ which may have side effects. | assert.py:20:8:20:38 | Attribute() | an expression | diff --git a/python/ql/test/query-tests/Statements/asserts/assert.py b/python/ql/test/query-tests/Statements/asserts/assert.py index 854fffa3382..d6c1e27daba 100644 --- a/python/ql/test/query-tests/Statements/asserts/assert.py +++ b/python/ql/test/query-tests/Statements/asserts/assert.py @@ -16,8 +16,8 @@ def assert_tuple(x, y): assert () assert (x, y) - - +import subprocess +assert subprocess.call(['run-backup']) == 0 # TODO: FN @@ -103,4 +103,4 @@ def error_assert_in_intermediate_branch(x): elif yks(x): pass else: - pass \ No newline at end of file + pass