Open
Description
The controls
predicate from GuardCondition
does not detect influence across function boundaries. Is this intended behavior?
Here is the code for my example. Influence from condition
in line 23 is detected but not from line 14.
Similarly the influence on call()
in line 30 is detected but not on line 8.
#include <exception>
void call()
{
}
void call_wrapper()
{
call(); // not detected as controlled
}
void check_condition(bool condition)
{
if (condition) // not detected as controlling
{
throw std::exception();
}
}
void my_fn(bool outer, bool condition)
{
if (condition) // detected as controlling
{
throw std::exception();
}
check_condition(condition);
call(); // detected as controlled
call_wrapper();
}
import cpp
import semmle.code.cpp.controlflow.IRGuards
from Variable v, VariableAccess va, GuardCondition cond, Call c, int line
where
c.getTarget().getName() = "call" and
va.getTarget() = v and
v.getName() = "condition" and
cond.getAChild*() = va and
cond.controls(c.getBasicBlock(), _) and
line = va.getLocation().getStartLine()
select v, va, cond, c, line
| v | va | cond | c | line |
+-----------+-----------+-----------+--------------+------+
| condition | condition | condition | call to call | 23 |
CodeQL version: 2.19.3