Skip to content

Commit f70e7d7

Browse files
authored
Merge pull request #1604 from markshannon/python-performance-fixes
Python: Performance improvements to points-to.
2 parents 1fdce43 + 71d353f commit f70e7d7

File tree

1 file changed

+75
-70
lines changed

1 file changed

+75
-70
lines changed

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

Lines changed: 75 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -9,62 +9,7 @@ private import semmle.python.types.Builtins
99
private import semmle.python.types.Extensions
1010

1111
/* Use this version for speed */
12-
//library class CfgOrigin extends @py_object {
13-
//
14-
// string toString() {
15-
// /* Not to be displayed */
16-
// none()
17-
// }
18-
//
19-
// /** Get a `ControlFlowNode` from `this` or `here`.
20-
// * If `this` is a ControlFlowNode then use that, otherwise fall back on `here`
21-
// */
22-
// pragma[inline]
23-
// ControlFlowNode asCfgNodeOrHere(ControlFlowNode here) {
24-
// result = this
25-
// or
26-
// not this instanceof ControlFlowNode and result = here
27-
// }
28-
//
29-
// ControlFlowNode toCfgNode() {
30-
// result = this
31-
// }
32-
//
33-
// pragma[inline]
34-
// CfgOrigin fix(ControlFlowNode here) {
35-
// if this = Builtin::unknown() then
36-
// result = here
37-
// else
38-
// result = this
39-
// }
40-
//
41-
//}
42-
//
43-
//module CfgOrigin {
44-
//
45-
// CfgOrigin fromCfgNode(ControlFlowNode f) {
46-
// result = f
47-
// }
48-
//
49-
// CfgOrigin unknown() {
50-
// result = Builtin::unknown()
51-
// }
52-
//
53-
// CfgOrigin fromObject(ObjectInternal obj) {
54-
// obj.isBuiltin() and result = unknown()
55-
// or
56-
// result = obj.getOrigin()
57-
// }
58-
//
59-
//}
60-
61-
/* Use this version for stronger type-checking */
62-
private newtype TCfgOrigin =
63-
TUnknownOrigin()
64-
or
65-
TFlowNodeOrigin(ControlFlowNode f)
66-
67-
library class CfgOrigin extends TCfgOrigin {
12+
library class CfgOrigin extends @py_object {
6813

6914
string toString() {
7015
/* Not to be displayed */
@@ -76,42 +21,97 @@ library class CfgOrigin extends TCfgOrigin {
7621
*/
7722
pragma[inline]
7823
ControlFlowNode asCfgNodeOrHere(ControlFlowNode here) {
79-
this = TUnknownOrigin() and result = here
24+
result = this
8025
or
81-
this = TFlowNodeOrigin(result)
26+
not this instanceof ControlFlowNode and result = here
8227
}
8328

8429
ControlFlowNode toCfgNode() {
85-
this = TFlowNodeOrigin(result)
30+
result = this
8631
}
8732

8833
pragma[inline]
8934
CfgOrigin fix(ControlFlowNode here) {
90-
this = TUnknownOrigin() and result = TFlowNodeOrigin(here)
91-
or
92-
not this = TUnknownOrigin() and result = this
35+
if this = Builtin::unknown() then
36+
result = here
37+
else
38+
result = this
9339
}
9440

9541
}
9642

9743
module CfgOrigin {
9844

9945
CfgOrigin fromCfgNode(ControlFlowNode f) {
100-
result = TFlowNodeOrigin(f)
46+
result = f
10147
}
10248

10349
CfgOrigin unknown() {
104-
result = TUnknownOrigin()
50+
result = Builtin::unknown()
10551
}
10652

10753
CfgOrigin fromObject(ObjectInternal obj) {
10854
obj.isBuiltin() and result = unknown()
10955
or
110-
result = fromCfgNode(obj.getOrigin())
56+
result = obj.getOrigin()
11157
}
11258

11359
}
11460

61+
/* Use this version for stronger type-checking */
62+
//private newtype TCfgOrigin =
63+
// TUnknownOrigin()
64+
// or
65+
// TFlowNodeOrigin(ControlFlowNode f)
66+
//
67+
//library class CfgOrigin extends TCfgOrigin {
68+
//
69+
// string toString() {
70+
// /* Not to be displayed */
71+
// none()
72+
// }
73+
//
74+
// /** Get a `ControlFlowNode` from `this` or `here`.
75+
// * If `this` is a ControlFlowNode then use that, otherwise fall back on `here`
76+
// */
77+
// pragma[inline]
78+
// ControlFlowNode asCfgNodeOrHere(ControlFlowNode here) {
79+
// this = TUnknownOrigin() and result = here
80+
// or
81+
// this = TFlowNodeOrigin(result)
82+
// }
83+
//
84+
// ControlFlowNode toCfgNode() {
85+
// this = TFlowNodeOrigin(result)
86+
// }
87+
//
88+
// pragma[inline]
89+
// CfgOrigin fix(ControlFlowNode here) {
90+
// this = TUnknownOrigin() and result = TFlowNodeOrigin(here)
91+
// or
92+
// not this = TUnknownOrigin() and result = this
93+
// }
94+
//
95+
//}
96+
//
97+
//module CfgOrigin {
98+
//
99+
// CfgOrigin fromCfgNode(ControlFlowNode f) {
100+
// result = TFlowNodeOrigin(f)
101+
// }
102+
//
103+
// CfgOrigin unknown() {
104+
// result = TUnknownOrigin()
105+
// }
106+
//
107+
// CfgOrigin fromObject(ObjectInternal obj) {
108+
// obj.isBuiltin() and result = unknown()
109+
// or
110+
// result = fromCfgNode(obj.getOrigin())
111+
// }
112+
//
113+
//}
114+
115115
/* The API */
116116
module PointsTo {
117117

@@ -2091,18 +2091,23 @@ cached module Types {
20912091

20922092
module AttributePointsTo {
20932093

2094+
pragma [noinline]
20942095
predicate pointsTo(ControlFlowNode f, Context context, ObjectInternal value, ControlFlowNode origin) {
20952096
exists(EssaVariable var, string name, CfgOrigin orig |
2096-
f.isLoad() and
2097-
var.getASourceUse() = f.(AttrNode).getObject(name)
2098-
or
2099-
Expressions::getattr_call(f, var.getASourceUse(), context, _, name)
2100-
|
2097+
getsVariableAttribute(f, var, name) and
21012098
variableAttributePointsTo(var, context, name, value, orig) and
21022099
origin = orig.asCfgNodeOrHere(f)
21032100
)
21042101
}
21052102

2103+
pragma [noinline]
2104+
private predicate getsVariableAttribute(ControlFlowNode f, EssaVariable var, string name) {
2105+
Expressions::getattr_call(f, var.getASourceUse(), _, _, name)
2106+
or
2107+
f.isLoad() and var.getASourceUse() = f.(AttrNode).getObject(name)
2108+
}
2109+
2110+
pragma [nomagic]
21062111
predicate variableAttributePointsTo(EssaVariable var, Context context, string name, ObjectInternal value, CfgOrigin origin) {
21072112
definitionAttributePointsTo(var.getDefinition(), context, name, value, origin)
21082113
or

0 commit comments

Comments
 (0)