C#: Improve performance of always[Not]NullMethod()

This commit is contained in:
Tom Hvitved
2019-05-29 09:34:54 +02:00
parent 0ee5fe88d9
commit 428ad72694

View File

@@ -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)
)
}