mirror of
https://github.com/github/codeql.git
synced 2026-01-05 18:50:23 +01:00
41 lines
1.2 KiB
Plaintext
41 lines
1.2 KiB
Plaintext
/**
|
|
* @name Unnecessary delete statement in function
|
|
* @description Using a 'delete' statement to delete a local variable is
|
|
* unnecessary, because the variable is deleted automatically when
|
|
* the function exits.
|
|
* @kind problem
|
|
* @tags maintainability
|
|
* useless-code
|
|
* @problem.severity warning
|
|
* @sub-severity low
|
|
* @precision high
|
|
* @id py/unnecessary-delete
|
|
*/
|
|
|
|
import python
|
|
|
|
predicate isInsideLoop(AstNode node) {
|
|
node.getParentNode() instanceof While
|
|
or
|
|
node.getParentNode() instanceof For
|
|
or
|
|
exists(AstNode prev | isInsideLoop(prev) | node = prev.getAChildNode())
|
|
}
|
|
|
|
from Delete del, Expr e, Function f
|
|
where
|
|
f.getLastStatement() = del and
|
|
e = del.getATarget() and
|
|
f.containsInScope(e) and
|
|
not e instanceof Subscript and
|
|
not e instanceof Attribute and
|
|
not isInsideLoop(del) and
|
|
// False positive: calling `sys.exc_info` within a function results in a
|
|
// reference cycle, and an explicit call to `del` helps break this cycle.
|
|
not exists(FunctionValue ex |
|
|
ex = Value::named("sys.exc_info") and
|
|
ex.getACall().getScope() = f
|
|
)
|
|
select del, "Unnecessary deletion of local variable $@ in function $@.", e, e.toString(), f,
|
|
f.getName()
|