github / github/codeql

[Python] tsg-parser fails to extract generic base class relations

Đang mở
#22,298 2 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ả

Working with typed base classes in Python (see #22291) I realised that the toolchain seems to drop generic base classes (e.g. `list[int]` in `class Bar(list[int]):`) at some point. That is, in the example code
```
class Foo(list): pass

class Bar(list[int]): pass
```
CodeQL knows the `Foo` -> `list` relation but not the `Bar` -> `list[int]` relation.

---------

As far as I could trace it, the relation is already lost in the `tsg-python` parser. Using the v2.26.2 toolchain, the source code `class Bar(list): pass` produces the following `tsg-python` output (assignment nodes removed for brevity):
```
node 4
_kind: "Name"
_location: [0, 10, 0, 14]
ctx: "load"
variable: "list"
node 5
_kind: "ClassExpr"
_location: [0, 0, 0, 21]
_location_end: [0, 16]
inner_scope: [graph node 6]
name: "Bar"
edge 5 -> 4
bases: 0
node 6
_kind: "Class"
_location: [0, 0, 0, 21]
_location_end: [0, 16]
name: "Bar"
edge 6 -> 1
body: 0
```
Now if the code is extended for a generic subscription as `class Bar(list[int]): pass` produces the following `tsg-python` output (assignment nodes removed for brevity):
```
node 4
_kind: "Name"
_location: [0, 10, 0, 14]
ctx: "load"
variable: "list"
node 5
_kind: "Name"
_location: [0, 15, 0, 18]
ctx: "load"
variable: "int"
node 6
_kind: "Subscript"
_location: [0, 10, 0, 19]
ctx: "load"
index: [graph node 5]
value: [graph node 4]
node 7
_kind: "ClassExpr"
_location: [0, 0, 0, 26]
_location_end: [0, 21]
inner_scope: [graph node 8]
name: "Bar"
node 8
_kind: "Class"
_location: [0, 0, 0, 26]
_location_end: [0, 21]
name: "Bar"
edge 8 -> 1
body: 0
```
Notice that the type subscription is parsed (nodes `4`, `5`, `6`) but the `edge n -> m` node for the `bases: 0` relation is absent.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Start by reproducing the v2.26.2 tsg-python output for `class Bar(list[int]): pass`, then trace how the parser handles the `Subscript` node when constructing class bases. Done means the generic base produces a `bases` edge and CodeQL recognizes the `Bar` -> `list[int]` relation, while the existing non-generic case remains intact.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
python
Lĩnh vực
compilers
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
55/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.