[C++] Fails to detect control flow influence of nested “if”
- Ngôn ngữ chính
- CodeQL
- Star
- 10.1k
- Fork
- 2.1k
- Merge trung bình
- 2 ngày 15 giờ
- Pull request đã merge (30 ngày)
- 141
Mô tả
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
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện ví dụ C++ được cung cấp với truy vấn import semmle.code.cpp.controlflow.IRGuards, sau đó đọc GuardCondition và vị từ controls của nó. Công việc hoàn tất khi quyền truy cập điều kiện lồng nhau ở dòng 17 được báo cáo là có ảnh hưởng đến call(), cùng với điều kiện đầu tiên.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- cpp
- Lĩnh vực
- compilers, devtools
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 38/100