github / github/codeql

[C++] Fails to detect control flow influence of nested “if”

Offen
#18,099 5 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
question
Vorherrschende Sprache
CodeQL
Sterne
10.1k
Forks
2.1k
Ø Merge
2 T. 15 Std.
Gemergte PRs (30 T.)
141

Beschreibung

The `controls` predicate in `GuardCondition` fails to detect a control flow influence from a nested `if`. In the following example the influence from `condition` to `call()` is only revealed in the first `if`, but not in the second.

```cpp
#include

void call()
{
}

void my_fn(bool outer, bool condition)
{

if (condition) // detected
{
throw std::exception();
}

if (outer)
{
if (condition) // not detected
{
throw std::exception();
}
}

call();
}
```

Query I tried:

```ql
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
```

Output I received:

```
| v | va | cond | c | line |
+-----------+-----------+-----------+--------------+------+
| condition | condition | condition | call to call | 10 |
```

I expected to also see an influence from line 17, but none is being found.

CodeQL version: 2.19.3

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.