mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Python points-to: Simplify logic w.r.t. comparisons.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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() }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() }
|
||||
|
||||
|
||||
@@ -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() }
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user