From aafde4d18d0ff4864e2e192af4e01a3057ceba7a Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 18 Dec 2023 13:46:12 +0100 Subject: [PATCH] C++: Fix joins in 'cpp/use-after-free'. --- cpp/ql/src/Critical/UseAfterFree.ql | 44 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/cpp/ql/src/Critical/UseAfterFree.ql b/cpp/ql/src/Critical/UseAfterFree.ql index 228761de5c0..4b27369074c 100644 --- a/cpp/ql/src/Critical/UseAfterFree.ql +++ b/cpp/ql/src/Critical/UseAfterFree.ql @@ -101,35 +101,43 @@ module ParameterSinks { ) } - private CallInstruction getAnAlwaysReachedCallInstruction(IRFunction f) { - result.getBlock().postDominates(f.getEntryBlock()) + private CallInstruction getAnAlwaysReachedCallInstruction() { + exists(IRFunction f | result.getBlock().postDominates(f.getEntryBlock())) } pragma[nomagic] - predicate callHasTargetAndArgument(Function f, int i, CallInstruction call, Instruction argument) { - call.getStaticCallTarget() = f and - call.getArgument(i) = argument + private predicate callHasTargetAndArgument(Function f, int i, Instruction argument) { + exists(CallInstruction call | + call.getStaticCallTarget() = f and + call.getArgument(i) = argument and + call = getAnAlwaysReachedCallInstruction() + ) } pragma[nomagic] - predicate initializeParameterInFunction(Function f, int i, InitializeParameterInstruction init) { - pragma[only_bind_out](init.getEnclosingFunction()) = f and - init.hasIndex(i) + private predicate initializeParameterInFunction(Function f, int i) { + exists(InitializeParameterInstruction init | + pragma[only_bind_out](init.getEnclosingFunction()) = f and + init.hasIndex(i) and + init = getAnAlwaysDereferencedParameter() + ) + } + + pragma[nomagic] + private predicate alwaysDereferencedArgumentHasValueNumber(ValueNumber vn) { + exists(int i, Function f, Instruction argument | + callHasTargetAndArgument(f, i, argument) and + initializeParameterInFunction(pragma[only_bind_into](f), pragma[only_bind_into](i)) and + vn.getAnInstruction() = argument + ) } InitializeParameterInstruction getAnAlwaysDereferencedParameter() { result = getAnAlwaysDereferencedParameter0() or - exists( - CallInstruction call, int i, InitializeParameterInstruction p, Instruction argument, - Function f - | - callHasTargetAndArgument(f, i, call, argument) and - initializeParameterInFunction(f, i, p) and - p = getAnAlwaysDereferencedParameter() and - result = - pragma[only_bind_out](pragma[only_bind_into](valueNumber(argument)).getAnInstruction()) and - call = getAnAlwaysReachedCallInstruction(_) + exists(ValueNumber vn | + alwaysDereferencedArgumentHasValueNumber(vn) and + vn.getAnInstruction() = result ) } }