From bf43475ff7ca4a292e8b45e5087f8ebd637ed270 Mon Sep 17 00:00:00 2001 From: Jonas Jensen Date: Tue, 10 Mar 2020 16:52:03 +0100 Subject: [PATCH] C++: Unroll recursion in inStaticInitializer This gets rid of some slow recursive magic. On Wireshark, this improves the timing of the involved predicates from m#Variable::runtimeExprInStaticInitializer#b ..................... 3.1s (executed 86 times) Variable::runtimeExprInStaticInitializer#b#antijoin_rhs .......... 1.6s Variable::runtimeExprInStaticInitializer#b ....................... 985ms (executed 6 times) Variable::runtimeExprInStaticInitializer#b#loop_invariant_prefix . 845ms #Expr::Expr::getParent_dispred#fbPlus ............................ 3.6s (executed 86 times) #Expr::Expr::getParent_dispred#fbPlus_10#join_rhs ................ 988ms to Variable::runtimeExprInStaticInitializer#f#antijoin_rhs . 1.8s Variable::runtimeExprInStaticInitializer#f .............. 1.1s (executed 6 times) Variable::inStaticInitializer#f ......................... 3.2s (executed 86 times) --- cpp/ql/src/semmle/code/cpp/Variable.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpp/ql/src/semmle/code/cpp/Variable.qll b/cpp/ql/src/semmle/code/cpp/Variable.qll index 0a4c55ba138..ddf362e96d0 100644 --- a/cpp/ql/src/semmle/code/cpp/Variable.qll +++ b/cpp/ql/src/semmle/code/cpp/Variable.qll @@ -404,7 +404,9 @@ private predicate runtimeExprInStaticInitializer(Expr e) { /** Holds if `e` is part of the initializer of a `StaticStorageDurationVariable`. */ private predicate inStaticInitializer(Expr e) { - exists(StaticStorageDurationVariable var | e.getParent+() = var.getInitializer()) + exists(StaticStorageDurationVariable var | e = var.getInitializer().getExpr()) + or + inStaticInitializer(e.getParent()) } /**