mirror of
https://github.com/github/codeql.git
synced 2026-04-29 10:45:15 +02:00
C#: Improve performance of always[Not]NullMethod()
This commit is contained in:
@@ -30,6 +30,11 @@ private module Cached {
|
||||
}
|
||||
import Cached
|
||||
|
||||
pragma[noinline]
|
||||
private predicate alwaysNullVariableUpdate(VariableUpdate vu) {
|
||||
forex(Expr src | src = vu.getSource() | alwaysNullExpr(src))
|
||||
}
|
||||
|
||||
/** Holds if expression `expr` always evaluates to `null`. */
|
||||
private predicate alwaysNullExpr(Expr expr) {
|
||||
expr instanceof NullLiteral
|
||||
@@ -37,10 +42,15 @@ private predicate alwaysNullExpr(Expr expr) {
|
||||
alwaysNullMethod(expr.(StaticCall).getTarget())
|
||||
or
|
||||
forex(VariableUpdate vu | DefUse::variableUpdateUse(_, vu, expr) |
|
||||
forex(Expr src | src = vu.getSource() | alwaysNullExpr(src))
|
||||
alwaysNullVariableUpdate(vu)
|
||||
)
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
private predicate alwaysNotNullVariableUpdate(VariableUpdate vu) {
|
||||
forex(Expr src | src = vu.getSource() | alwaysNotNullExpr(src))
|
||||
}
|
||||
|
||||
/** Holds if expression `expr` always evaluates to non-null. */
|
||||
private predicate alwaysNotNullExpr(Expr expr) {
|
||||
expr instanceof Opcodes::Newobj
|
||||
@@ -50,6 +60,6 @@ private predicate alwaysNotNullExpr(Expr expr) {
|
||||
alwaysNotNullMethod(expr.(StaticCall).getTarget())
|
||||
or
|
||||
forex(VariableUpdate vu | DefUse::variableUpdateUse(_, vu, expr) |
|
||||
forex(Expr src | src = vu.getSource() | alwaysNotNullExpr(src))
|
||||
alwaysNotNullVariableUpdate(vu)
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user