github / github/codeql

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

Đang mở
#18,099 5 bình luận 0 reaction 0 người được giao Xem trên GitHub
question
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

Mở 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

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.