Merge pull request #1581 from jbj/revert-noTarget-workaround

Revert "C++: Work around extractor issue CPP-383"
This commit is contained in:
ian-semmle 2019-07-11 14:26:15 +01:00 коммит произвёл GitHub
Родитель 59964bd9a4 ee5eaef5e4
Коммит 463547f810
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 1 добавлений и 34 удалений

Просмотреть файл

@ -107,42 +107,9 @@ private predicate loopConditionAlwaysUponEntry(ControlFlowNode loop, Expr condit
)
}
/**
* This relation is the same as the `el instanceof Function`, only obfuscated
* so the optimizer will not understand that any `FunctionCall.getTarget()`
* should be in this relation.
*/
pragma[noinline]
private predicate isFunction(Element el) {
el instanceof Function
or
el.(Expr).getParent() = el
}
/**
* Holds if `fc` is a `FunctionCall` with no return value for `getTarget`. This
* can happen due to extractor issue CPP-383.
*/
pragma[noopt]
private predicate callHasNoTarget(@funbindexpr fc) {
exists(Function f |
funbind(fc, f) and
not isFunction(f)
)
}
// This base case is pulled out to work around QL-796
private predicate potentiallyReturningFunctionCall_base(FunctionCall fc) {
fc.isVirtual()
or
callHasNoTarget(fc)
}
/** A function call that *may* return; if in doubt, we assume it may. */
private predicate potentiallyReturningFunctionCall(FunctionCall fc) {
potentiallyReturningFunctionCall_base(fc)
or
potentiallyReturningFunction(fc.getTarget())
potentiallyReturningFunction(fc.getTarget()) or fc.isVirtual()
}
/** A function that *may* return; if in doubt, we assume it may. */