mirror of
https://github.com/github/codeql.git
synced 2025-12-17 17:23:36 +01:00
Python: ObjectAPI to ValueAPI: ReturnValueIgnored: Autoformats
This commit is contained in:
@@ -22,7 +22,9 @@ predicate meaningful_return_value(Expr val) {
|
||||
or
|
||||
val instanceof BooleanLiteral
|
||||
or
|
||||
exists(FunctionValue callee | val = callee.getACall().getNode() and returns_meaningful_value(callee))
|
||||
exists(FunctionValue callee |
|
||||
val = callee.getACall().getNode() and returns_meaningful_value(callee)
|
||||
)
|
||||
or
|
||||
not exists(FunctionValue callee | val = callee.getACall().getNode()) and not val instanceof Name
|
||||
}
|
||||
@@ -34,18 +36,22 @@ predicate used_value(Expr val) {
|
||||
)
|
||||
}
|
||||
|
||||
predicate returns_meaningful_value(FunctionValue f) {
|
||||
not exists(f.getScope().getFallthroughNode())
|
||||
and
|
||||
predicate returns_meaningful_value(FunctionValue f) {
|
||||
not exists(f.getScope().getFallthroughNode()) and
|
||||
(
|
||||
exists(Return ret, Expr val | ret.getScope() = f.getScope() and val = ret.getValue() |
|
||||
meaningful_return_value(val) and
|
||||
not used_value(val)
|
||||
)
|
||||
or
|
||||
/* Is f a builtin function that returns something other than None?
|
||||
* Ignore __import__ as it is often called purely for side effects */
|
||||
f.isBuiltin() and f.(CallableObjectInternal).getAnInferredReturnType() != ClassValue::nonetype() and not f.getName() = "__import__"
|
||||
exists(Return ret, Expr val | ret.getScope() = f.getScope() and val = ret.getValue() |
|
||||
meaningful_return_value(val) and
|
||||
not used_value(val)
|
||||
)
|
||||
or
|
||||
/*
|
||||
* Is f a builtin function that returns something other than None?
|
||||
* Ignore __import__ as it is often called purely for side effects
|
||||
*/
|
||||
|
||||
f.isBuiltin() and
|
||||
f.(CallableObjectInternal).getAnInferredReturnType() != ClassValue::nonetype() and
|
||||
not f.getName() = "__import__"
|
||||
)
|
||||
}
|
||||
|
||||
@@ -59,17 +65,19 @@ predicate wrapped_in_try_except(ExprStmt call) {
|
||||
}
|
||||
|
||||
from ExprStmt call, FunctionValue callee, float percentage_used, int total
|
||||
where call.getValue() = callee.getACall().getNode() and returns_meaningful_value(callee) and
|
||||
not wrapped_in_try_except(call) and
|
||||
exists(int unused |
|
||||
unused = count(ExprStmt e | e.getValue().getAFlowNode() = callee.getACall()) and
|
||||
total = count(callee.getACall()) |
|
||||
percentage_used = (100.0*(total-unused)/total).floor()
|
||||
) and
|
||||
/* Report an alert if we see at least 5 calls and the return value is used in at least 3/4 of those calls. */
|
||||
percentage_used >= 75 and
|
||||
total >= 5
|
||||
|
||||
select call, "Call discards return value of function $@. The result is used in " + percentage_used.toString() + "% of calls.",
|
||||
callee, callee.getName()
|
||||
|
||||
where
|
||||
call.getValue() = callee.getACall().getNode() and
|
||||
returns_meaningful_value(callee) and
|
||||
not wrapped_in_try_except(call) and
|
||||
exists(int unused |
|
||||
unused = count(ExprStmt e | e.getValue().getAFlowNode() = callee.getACall()) and
|
||||
total = count(callee.getACall())
|
||||
|
|
||||
percentage_used = (100.0 * (total - unused) / total).floor()
|
||||
) and
|
||||
/* Report an alert if we see at least 5 calls and the return value is used in at least 3/4 of those calls. */
|
||||
percentage_used >= 75 and
|
||||
total >= 5
|
||||
select call,
|
||||
"Call discards return value of function $@. The result is used in " + percentage_used.toString() +
|
||||
"% of calls.", callee, callee.getName()
|
||||
|
||||
Reference in New Issue
Block a user