You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| test.py:24:5:24:26 | Function meth1 | This method requires 2 positional arguments, whereas overridden $@ requires 1. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:5:5:5:20 | Function meth1 | Base.meth1 | test.py:15:9:15:20 | Attribute() | This call |
2
-
| test.py:27:5:27:20 | Function meth2 | This method requires 1 positional argument, whereas overridden $@ requires 2 positional arguments. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:8:5:8:26 | Function meth2 | Base.meth2 | test.py:18:9:18:21 | Attribute() | This call |
2
+
| test.py:27:5:27:20 | Function meth2 | This method requires 1 positional argument, whereas overridden $@ requires 2. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:8:5:8:26 | Function meth2 | Base.meth2 | test.py:18:9:18:21 | Attribute() | This call |
3
3
| test.py:30:5:30:26 | Function meth3 | This method requires 2 positional arguments, whereas overridden $@ requires 1. | test.py:11:5:11:20 | Function meth3 | Base.meth3 | file://:0:0:0:0 | (none) | This call |
4
4
| test.py:69:5:69:24 | Function meth | This method requires 2 positional arguments, whereas overridden $@ requires 1. | test.py:64:5:64:19 | Function meth | BlameBase.meth | file://:0:0:0:0 | (none) | This call |
5
5
| test.py:74:5:74:24 | Function meth | This method requires 2 positional arguments, whereas overridden $@ requires 1. | test.py:64:5:64:19 | Function meth | BlameBase.meth | file://:0:0:0:0 | (none) | This call |
6
+
| test.py:125:5:125:20 | Function meth1 | This method requires 1 positional argument, whereas overridden $@ may be called with 2. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:82:5:82:25 | Function meth1 | Base2.meth1 | test.py:110:9:110:23 | Attribute() | This call |
7
+
| test.py:131:5:131:31 | Function meth4 | This method requires at least 3 positional arguments, whereas overridden $@ requires at most 2. | test.py:88:5:88:25 | Function meth4 | Base2.meth4 | file://:0:0:0:0 | (none) | This call |
8
+
| test.py:133:5:133:28 | Function meth5 | This method requires at most 3 positional arguments, whereas overridden $@ requires at least 4. | test.py:90:5:90:34 | Function meth5 | Base2.meth5 | file://:0:0:0:0 | (none) | This call |
9
+
| test.py:135:5:135:23 | Function meth6 | This method requires 2 positional arguments, whereas overridden $@ may be called with arbitrarily many. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:92:5:92:28 | Function meth6 | Base2.meth6 | test.py:113:9:113:27 | Attribute() | This call |
10
+
| test.py:137:5:137:28 | Function meth7 | This method requires at least 2 positional arguments, whereas overridden $@ may be called with 1. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:94:5:94:25 | Function meth7 | Base2.meth7 | test.py:114:9:114:20 | Attribute() | This call |
11
+
| test.py:147:5:147:21 | Function meth12 | This method does not accept arbitrary keyword arguments, which overridden $@ does. $@ correctly calls the base method, but does not match the signature of the overriding method. | test.py:104:5:104:31 | Function meth12 | Base2.meth12 | test.py:119:9:119:24 | Attribute() | This call |
Copy file name to clipboardExpand all lines: python/ql/test/query-tests/Functions/overriding/test.py
+72-1Lines changed: 72 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -66,7 +66,7 @@ def meth(self):
66
66
67
67
classCorrect1(BlameBase):
68
68
69
-
defmeth(self, arg): # $Alert[py/inheritance/signature-mismatch] # Has 1 more arg. The incorrect-overriden-method query would alert for the base method in this case.
69
+
defmeth(self, arg): # $Alert[py/inheritance/signature-mismatch] # Has 1 more arg. The incorrect-overridden-method query would alert for the base method in this case.
70
70
pass
71
71
72
72
classCorrect2(BlameBase):
@@ -76,3 +76,74 @@ def meth(self, arg): # $Alert[py/inheritance/signature-mismatch] # Has 1 more ar
76
76
77
77
c=Correct2()
78
78
c.meth("hi")
79
+
80
+
classBase2:
81
+
82
+
defmeth1(self, x=1): pass
83
+
84
+
defmeth2(self, x=1): pass
85
+
86
+
defmeth3(self): pass
87
+
88
+
defmeth4(self, x=1): pass
89
+
90
+
defmeth5(self, x, y, z, w=1): pass
91
+
92
+
defmeth6(self, x, *ys): pass
93
+
94
+
defmeth7(self, *ys): pass
95
+
96
+
defmeth8(self, x, y): pass
97
+
98
+
defmeth9(self, x, y): pass
99
+
100
+
defmeth10(self, x, *, y=3): pass
101
+
102
+
defmeth11(self, x, y): pass
103
+
104
+
defmeth12(self, **kwargs): pass
105
+
106
+
defmeth13(self, /, x): pass
107
+
108
+
defcall_some(self):
109
+
self.meth1()
110
+
self.meth1(x=2)
111
+
self.meth3()
112
+
self.meth3(x=2)
113
+
self.meth6(2, 3, 4)
114
+
self.meth7()
115
+
self.meth8(1,y=3)
116
+
self.meth9(1,2)
117
+
self.meth10(1,y=3)
118
+
self.meth11(1,y=3)
119
+
self.meth12(x=2)
120
+
self.meth13(x=2)
121
+
122
+
123
+
classDerrived2(Base2):
124
+
125
+
defmeth1(self): pass# $Alert[py/inheritance/signature-mismatch] # Weak mismatch (base may be called with 2 args. only alert if mismatching call exists)
126
+
127
+
defmeth2(self): pass# No alert (weak mismatch, but not called)
128
+
129
+
defmeth3(self, x=1): pass# No alert (no mismatch - all base calls are valid for sub)
130
+
131
+
defmeth4(self, x, y, z=1): pass# $Alert[py/inheritance/signature-mismatch] # sub min > base max (strong mismatch)
defmeth6(self, x): pass# $Alert[py/inheritance/signature-mismatch] # weak mismatch (base may be called with 3+ args)
136
+
137
+
defmeth7(self, x, *ys): pass# $Alert[py/inheritance/signature-mismatch] # weak mismatch (base may be called with 1 arg only)
138
+
139
+
defmeth8(self, x, z): pass# $MISSING:Alert[py/inheritance/signature-mismatch] # weak mismatch (base may be called with arg named y), however the call to meth8 that witnesses this is not detected as a valid call to Base2.meth8.
140
+
141
+
defmeth9(self, x, z): pass# No alert (never called with wrong keyword arg)
142
+
143
+
defmeth10(self, x, **kwargs): pass# No alert (y is kw-only arg in base, calls that use it are valid for sub)
144
+
145
+
defmeth11(self, x, z, **kwargs): pass# $MISSING:Alert[py/inheritance/signature-mismatch] # call using y kw-arg is invalid due to not specifying z, but this is not detected. Likely a fairly niche situation.
146
+
147
+
defmeth12(self): pass# $Alert[py/inheritance/signature-mismatch] # call including extra kwarg invalid
148
+
149
+
defmeth13(self, /, y): pass# $MISSING:Alert[py/inheritance/signature-mismatch] # weak mismatch (base may be called with arg named x), however meth13 is incorrectly detected as having 2 minimum positional arguments, whereas x is kw-only; resulting in the witness call not being detected as a valid call to Base2.meth13.
0 commit comments