Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8e2d6c4

Browse files
committed
Python points-to: Simplify logic w.r.t. comparisons.
1 parent 6689994 commit 8e2d6c4

9 files changed

Lines changed: 32 additions & 37 deletions

File tree

python/ql/src/semmle/python/objects/Callables.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class PythonFunctionObjectInternal extends CallableObjectInternal, TPythonFuncti
7575
result = TBuiltinClassObject(Builtin::special("FunctionType"))
7676
}
7777

78-
override boolean testableForEquality() { result = true }
78+
override predicate notTestableForEquality() { none() }
7979

8080
override Builtin getBuiltin() {
8181
none()
@@ -190,7 +190,7 @@ class BuiltinFunctionObjectInternal extends CallableObjectInternal, TBuiltinFunc
190190
result = TBuiltinClassObject(this.getBuiltin().getClass())
191191
}
192192

193-
override boolean testableForEquality() { result = true }
193+
override predicate notTestableForEquality() { none() }
194194

195195
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) { none() }
196196

@@ -299,7 +299,7 @@ class BuiltinMethodObjectInternal extends CallableObjectInternal, TBuiltinMethod
299299
none()
300300
}
301301

302-
override boolean testableForEquality() { result = true }
302+
override predicate notTestableForEquality() { none() }
303303

304304
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) { none() }
305305

@@ -400,7 +400,7 @@ class BoundMethodObjectInternal extends CallableObjectInternal, TBoundMethod {
400400
none()
401401
}
402402

403-
override boolean testableForEquality() { result = false }
403+
override predicate notTestableForEquality() { any() }
404404

405405
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) {
406406
this.getFunction().callResult(callee, obj, origin)

python/ql/src/semmle/python/objects/Classes.qll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class PythonClassObjectInternal extends ClassObjectInternal, TPythonClassObject
148148
none()
149149
}
150150

151-
override boolean testableForEquality() { result = true }
151+
override predicate notTestableForEquality() { none() }
152152

153153
override predicate functionAndOffset(CallableObjectInternal function, int offset) {
154154
this.lookup("__init__", function, _) and offset = 1
@@ -206,7 +206,7 @@ class BuiltinClassObjectInternal extends ClassObjectInternal, TBuiltinClassObjec
206206
none()
207207
}
208208

209-
override boolean testableForEquality() { result = true }
209+
override predicate notTestableForEquality() { none() }
210210

211211
}
212212

@@ -229,7 +229,7 @@ class UnknownClassInternal extends ClassObjectInternal, TUnknownClass {
229229
none()
230230
}
231231

232-
override boolean testableForEquality() { result = false }
232+
override predicate notTestableForEquality() { any() }
233233

234234
override Builtin getBuiltin() {
235235
result = Builtin::unknownType()
@@ -278,7 +278,7 @@ class TypeInternal extends ClassObjectInternal, TType {
278278
none()
279279
}
280280

281-
override boolean testableForEquality() { result = true }
281+
override predicate notTestableForEquality() { none() }
282282

283283
override Builtin getBuiltin() {
284284
result = Builtin::special("type")
@@ -353,7 +353,7 @@ class DynamicallyCreatedClass extends ClassObjectInternal, TDynamicClass {
353353
none()
354354
}
355355

356-
override boolean testableForEquality() { result = true }
356+
override predicate notTestableForEquality() { none() }
357357

358358
override ClassDecl getClassDeclaration() { none() }
359359

python/ql/src/semmle/python/objects/Constants.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ abstract class ConstantObjectInternal extends ObjectInternal {
2020

2121
override boolean isClass() { result = false }
2222

23-
override boolean testableForEquality() { result = true }
23+
override predicate notTestableForEquality() { none() }
2424

2525
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) {
2626
// Constants aren't callable

python/ql/src/semmle/python/objects/Descriptors.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class PropertyInternal extends ObjectInternal, TProperty {
4747

4848
override ObjectInternal getClass() { result = ObjectInternal::property() }
4949

50-
override boolean testableForEquality() { result = true }
50+
override predicate notTestableForEquality() { none() }
5151

5252
override Builtin getBuiltin() { none() }
5353

@@ -120,7 +120,7 @@ class ClassMethodObjectInternal extends ObjectInternal, TClassMethod {
120120

121121
override ObjectInternal getClass() { result = ObjectInternal::classMethod() }
122122

123-
override boolean testableForEquality() { result = true }
123+
override predicate notTestableForEquality() { none() }
124124

125125
override Builtin getBuiltin() { none() }
126126

@@ -199,7 +199,7 @@ class StaticMethodObjectInternal extends ObjectInternal, TStaticMethod {
199199

200200
override ObjectInternal getClass() { result = ObjectInternal::builtin("staticmethod") }
201201

202-
override boolean testableForEquality() { result = true }
202+
override predicate notTestableForEquality() { none() }
203203

204204
override Builtin getBuiltin() { none() }
205205

python/ql/src/semmle/python/objects/Instances.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class SpecificInstanceInternal extends TSpecificInstance, InstanceObject {
7373

7474
override boolean isClass() { result = false }
7575

76-
override boolean testableForEquality() { result = true }
76+
override predicate notTestableForEquality() { none() }
7777

7878
override ObjectInternal getClass() {
7979
this = TSpecificInstance(_, result, _)
@@ -180,7 +180,7 @@ class SelfInstanceInternal extends TSelfInstance, InstanceObject {
180180

181181
override boolean isClass() { result = false }
182182

183-
override boolean testableForEquality() { result = false }
183+
override predicate notTestableForEquality() { any() }
184184

185185
override ObjectInternal getClass() {
186186
this = TSelfInstance(_, _, result)
@@ -275,7 +275,7 @@ class UnknownInstanceInternal extends TUnknownInstance, ObjectInternal {
275275

276276
override boolean isClass() { result = false }
277277

278-
override boolean testableForEquality() { result = false }
278+
override predicate notTestableForEquality() { any() }
279279

280280
override ObjectInternal getClass() {
281281
this = TUnknownInstance(result)
@@ -398,7 +398,7 @@ class SuperInstance extends TSuperInstance, ObjectInternal {
398398
result = ObjectInternal::superType()
399399
}
400400

401-
override boolean testableForEquality() { result = false }
401+
override predicate notTestableForEquality() { any() }
402402

403403
override Builtin getBuiltin() { none() }
404404

python/ql/src/semmle/python/objects/Modules.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ abstract class ModuleObjectInternal extends ObjectInternal {
2828

2929
override boolean isClass() { result = false }
3030

31-
override boolean testableForEquality() { result = true }
31+
override predicate notTestableForEquality() { none() }
3232

3333
override boolean booleanValue() {
3434
result = true
@@ -377,7 +377,7 @@ class AbsentModuleAttributeObjectInternal extends ObjectInternal, TAbsentModuleA
377377

378378
override boolean isClass() { result = maybe() }
379379

380-
override boolean testableForEquality() { result = false }
380+
override predicate notTestableForEquality() { any() }
381381

382382
override boolean booleanValue() {
383383
result = maybe()

python/ql/src/semmle/python/objects/ObjectInternal.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class ObjectInternal extends TObject {
4848
* equality tests on it.
4949
* For example, `None` or `int` can be, but `int()` or an unknown string cannot.
5050
*/
51-
abstract boolean testableForEquality();
51+
abstract predicate notTestableForEquality();
5252

5353
/** Gets the `Builtin` for this object, if any.
5454
* Objects (except unknown and undefined values) should attempt to return
@@ -193,7 +193,7 @@ class BuiltinOpaqueObjectInternal extends ObjectInternal, TBuiltinOpaqueObject {
193193
none()
194194
}
195195

196-
override boolean testableForEquality() { result = false }
196+
override predicate notTestableForEquality() { any() }
197197

198198
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) {
199199
none()
@@ -267,7 +267,7 @@ class UnknownInternal extends ObjectInternal, TUnknown {
267267
none()
268268
}
269269

270-
override boolean testableForEquality() { result = false }
270+
override predicate notTestableForEquality() { any() }
271271

272272
override Builtin getBuiltin() {
273273
result = Builtin::unknown()
@@ -333,7 +333,7 @@ class UndefinedInternal extends ObjectInternal, TUndefined {
333333

334334
override boolean isClass() { result = false }
335335

336-
override boolean testableForEquality() { result = false }
336+
override predicate notTestableForEquality() { any() }
337337

338338
override ObjectInternal getClass() {
339339
none()

python/ql/src/semmle/python/objects/Sequences.qll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ abstract class TupleObjectInternal extends SequenceObjectInternal {
5656
* truth or false in comparisons. For example, `None` or `int` can be, but `int()`
5757
* or an unknown string cannot.
5858
*/
59-
override boolean testableForEquality() { result = true }
59+
override predicate notTestableForEquality() { none() }
6060

6161
/** Holds if `obj` is the result of calling `this` and `origin` is
6262
* the origin of `obj`.
@@ -174,9 +174,7 @@ class SysVersionInfoObjectInternal extends TSysVersionInfo, SequenceObjectIntern
174174
result.getBuiltin() = this.getClassDeclaration()
175175
}
176176

177-
override boolean testableForEquality() {
178-
result = true
179-
}
177+
override predicate notTestableForEquality() { none() }
180178

181179
/** Gets the `Builtin` for this object, if any.
182180
* Objects (except unknown and undefined values) should attempt to return

python/ql/src/semmle/python/pointsto/PointsTo.qll

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,16 +1262,13 @@ module Expressions {
12621262
exists(ObjectInternal other, boolean sense |
12631263
equalityTest(comp, context, operand, opvalue, other, sense)
12641264
|
1265-
opvalue.testableForEquality() = true and other.testableForEquality() = true and
1266-
(
1267-
other = opvalue and result = sense
1268-
or
1269-
other != opvalue and result = sense.booleanNot()
1270-
)
1265+
other = opvalue and result = sense
1266+
or
1267+
other != opvalue and result = sense.booleanNot()
12711268
or
1272-
opvalue.testableForEquality() = false and result = maybe()
1269+
opvalue.notTestableForEquality() and result = maybe()
12731270
or
1274-
other.testableForEquality() = false and result = maybe()
1271+
other.notTestableForEquality() and result = maybe()
12751272
)
12761273
}
12771274

@@ -1295,9 +1292,9 @@ module Expressions {
12951292
or
12961293
compare(val, other) = 1 and result = sense.booleanNot()
12971294
or
1298-
val.testableForEquality() = false and result = maybe()
1295+
val.notTestableForEquality() and result = maybe()
12991296
or
1300-
other.testableForEquality() = false and result = maybe()
1297+
other.notTestableForEquality() and result = maybe()
13011298
)
13021299
}
13031300

0 commit comments

Comments
 (0)