Python points-to: Simplify logic w.r.t. comparisons.

This commit is contained in:
Mark Shannon
2019-05-30 17:32:03 +01:00
parent 6689994285
commit 8e2d6c4fc6
9 changed files with 32 additions and 37 deletions

View File

@@ -75,7 +75,7 @@ class PythonFunctionObjectInternal extends CallableObjectInternal, TPythonFuncti
result = TBuiltinClassObject(Builtin::special("FunctionType"))
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override Builtin getBuiltin() {
none()
@@ -190,7 +190,7 @@ class BuiltinFunctionObjectInternal extends CallableObjectInternal, TBuiltinFunc
result = TBuiltinClassObject(this.getBuiltin().getClass())
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) { none() }
@@ -299,7 +299,7 @@ class BuiltinMethodObjectInternal extends CallableObjectInternal, TBuiltinMethod
none()
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) { none() }
@@ -400,7 +400,7 @@ class BoundMethodObjectInternal extends CallableObjectInternal, TBoundMethod {
none()
}
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) {
this.getFunction().callResult(callee, obj, origin)

View File

@@ -148,7 +148,7 @@ class PythonClassObjectInternal extends ClassObjectInternal, TPythonClassObject
none()
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override predicate functionAndOffset(CallableObjectInternal function, int offset) {
this.lookup("__init__", function, _) and offset = 1
@@ -206,7 +206,7 @@ class BuiltinClassObjectInternal extends ClassObjectInternal, TBuiltinClassObjec
none()
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
}
@@ -229,7 +229,7 @@ class UnknownClassInternal extends ClassObjectInternal, TUnknownClass {
none()
}
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override Builtin getBuiltin() {
result = Builtin::unknownType()
@@ -278,7 +278,7 @@ class TypeInternal extends ClassObjectInternal, TType {
none()
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override Builtin getBuiltin() {
result = Builtin::special("type")
@@ -353,7 +353,7 @@ class DynamicallyCreatedClass extends ClassObjectInternal, TDynamicClass {
none()
}
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override ClassDecl getClassDeclaration() { none() }

View File

@@ -20,7 +20,7 @@ abstract class ConstantObjectInternal extends ObjectInternal {
override boolean isClass() { result = false }
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) {
// Constants aren't callable

View File

@@ -47,7 +47,7 @@ class PropertyInternal extends ObjectInternal, TProperty {
override ObjectInternal getClass() { result = ObjectInternal::property() }
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override Builtin getBuiltin() { none() }
@@ -120,7 +120,7 @@ class ClassMethodObjectInternal extends ObjectInternal, TClassMethod {
override ObjectInternal getClass() { result = ObjectInternal::classMethod() }
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override Builtin getBuiltin() { none() }
@@ -199,7 +199,7 @@ class StaticMethodObjectInternal extends ObjectInternal, TStaticMethod {
override ObjectInternal getClass() { result = ObjectInternal::builtin("staticmethod") }
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override Builtin getBuiltin() { none() }

View File

@@ -73,7 +73,7 @@ class SpecificInstanceInternal extends TSpecificInstance, InstanceObject {
override boolean isClass() { result = false }
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override ObjectInternal getClass() {
this = TSpecificInstance(_, result, _)
@@ -180,7 +180,7 @@ class SelfInstanceInternal extends TSelfInstance, InstanceObject {
override boolean isClass() { result = false }
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override ObjectInternal getClass() {
this = TSelfInstance(_, _, result)
@@ -275,7 +275,7 @@ class UnknownInstanceInternal extends TUnknownInstance, ObjectInternal {
override boolean isClass() { result = false }
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override ObjectInternal getClass() {
this = TUnknownInstance(result)
@@ -398,7 +398,7 @@ class SuperInstance extends TSuperInstance, ObjectInternal {
result = ObjectInternal::superType()
}
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override Builtin getBuiltin() { none() }

View File

@@ -28,7 +28,7 @@ abstract class ModuleObjectInternal extends ObjectInternal {
override boolean isClass() { result = false }
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
override boolean booleanValue() {
result = true
@@ -377,7 +377,7 @@ class AbsentModuleAttributeObjectInternal extends ObjectInternal, TAbsentModuleA
override boolean isClass() { result = maybe() }
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override boolean booleanValue() {
result = maybe()

View File

@@ -48,7 +48,7 @@ class ObjectInternal extends TObject {
* equality tests on it.
* For example, `None` or `int` can be, but `int()` or an unknown string cannot.
*/
abstract boolean testableForEquality();
abstract predicate notTestableForEquality();
/** Gets the `Builtin` for this object, if any.
* Objects (except unknown and undefined values) should attempt to return
@@ -193,7 +193,7 @@ class BuiltinOpaqueObjectInternal extends ObjectInternal, TBuiltinOpaqueObject {
none()
}
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) {
none()
@@ -267,7 +267,7 @@ class UnknownInternal extends ObjectInternal, TUnknown {
none()
}
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override Builtin getBuiltin() {
result = Builtin::unknown()
@@ -333,7 +333,7 @@ class UndefinedInternal extends ObjectInternal, TUndefined {
override boolean isClass() { result = false }
override boolean testableForEquality() { result = false }
override predicate notTestableForEquality() { any() }
override ObjectInternal getClass() {
none()

View File

@@ -56,7 +56,7 @@ abstract class TupleObjectInternal extends SequenceObjectInternal {
* truth or false in comparisons. For example, `None` or `int` can be, but `int()`
* or an unknown string cannot.
*/
override boolean testableForEquality() { result = true }
override predicate notTestableForEquality() { none() }
/** Holds if `obj` is the result of calling `this` and `origin` is
* the origin of `obj`.
@@ -174,9 +174,7 @@ class SysVersionInfoObjectInternal extends TSysVersionInfo, SequenceObjectIntern
result.getBuiltin() = this.getClassDeclaration()
}
override boolean testableForEquality() {
result = true
}
override predicate notTestableForEquality() { none() }
/** Gets the `Builtin` for this object, if any.
* Objects (except unknown and undefined values) should attempt to return

View File

@@ -1262,16 +1262,13 @@ module Expressions {
exists(ObjectInternal other, boolean sense |
equalityTest(comp, context, operand, opvalue, other, sense)
|
opvalue.testableForEquality() = true and other.testableForEquality() = true and
(
other = opvalue and result = sense
or
other != opvalue and result = sense.booleanNot()
)
other = opvalue and result = sense
or
opvalue.testableForEquality() = false and result = maybe()
other != opvalue and result = sense.booleanNot()
or
other.testableForEquality() = false and result = maybe()
opvalue.notTestableForEquality() and result = maybe()
or
other.notTestableForEquality() and result = maybe()
)
}
@@ -1295,9 +1292,9 @@ module Expressions {
or
compare(val, other) = 1 and result = sense.booleanNot()
or
val.testableForEquality() = false and result = maybe()
val.notTestableForEquality() and result = maybe()
or
other.testableForEquality() = false and result = maybe()
other.notTestableForEquality() and result = maybe()
)
}