@@ -9,62 +9,7 @@ private import semmle.python.types.Builtins
99private 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
9743module 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 */
116116module PointsTo {
117117
@@ -2091,18 +2091,23 @@ cached module Types {
20912091
20922092module 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