Skip to content

Commit d3a05b8

Browse files
authored
Python: Fix bad join in MethodCallsiteRefinement
Observed on `FreeCAD/FreeCAD`: ``` Tuple counts for Essa::MethodCallsiteRefinement#24e22a14#f/1@274967ic after 34.5s: 638284 ~0% {2} r1 = SCAN Essa::TEssaNodeRefinement#24e22a14#ffff OUTPUT In.0, In.3 'this' 636521 ~0% {2} r2 = r1 AND NOT Essa::SingleSuccessorGuard#class#24e22a14#f(Lhs.1 'this') 1579493668 ~0% {2} r3 = JOIN r2 WITH SsaDefinitions::SsaSource::method_call_refinement#9197156e#fff ON FIRST 1 OUTPUT Lhs.1 'this', Rhs.2 266673 ~3% {1} r4 = JOIN r3 WITH Essa::EssaNodeRefinement::getDefiningNode#dispred#f0820431#ff ON FIRST 2 OUTPUT Lhs.0 'this' return r4 ``` After a bit of unbinding, we have: ``` Tuple counts for Essa::MethodCallsiteRefinement#24e22a14#f/1@d73d8e27 after 66ms: 215168 ~1% {2} r1 = SCAN Definitions::SsaSourceVariable#class#486534ab#f OUTPUT In.0, In.0 283965 ~2% {2} r2 = JOIN r1 WITH SsaDefinitions::SsaSource::method_call_refinement#9197156e#fff ON FIRST 1 OUTPUT Rhs.2, Lhs.1 401274 ~0% {2} r3 = JOIN r2 WITH Essa::EssaNodeRefinement::getDefiningNode#dispred#f0820431#ff_10#join_rhs ON FIRST 1 OUTPUT Lhs.1, Rhs.1 'this' 266671 ~2% {1} r4 = JOIN r3 WITH Essa::TEssaNodeRefinement#24e22a14#ffff_03#join_rhs ON FIRST 2 OUTPUT Lhs.1 'this' 266671 ~2% {1} r5 = r4 AND NOT Essa::SingleSuccessorGuard#class#24e22a14#f(Lhs.0 'this') return r5 ``` (I'm somewhat confused about the slight difference in tuples, but it's probably just because the compiler moved some stuff around.)
1 parent 60eb341 commit d3a05b8

File tree

1 file changed

+2
-1
lines changed
  • python/ql/lib/semmle/python/essa

1 file changed

+2
-1
lines changed

python/ql/lib/semmle/python/essa/Essa.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,8 @@ class CallsiteRefinement extends EssaNodeRefinement {
764764
/** An implicit (possible) modification of the object referred at a method call */
765765
class MethodCallsiteRefinement extends EssaNodeRefinement {
766766
MethodCallsiteRefinement() {
767-
SsaSource::method_call_refinement(this.getSourceVariable(), _, this.getDefiningNode()) and
767+
SsaSource::method_call_refinement(pragma[only_bind_into](this.getSourceVariable()), _,
768+
this.getDefiningNode()) and
768769
not this instanceof SingleSuccessorGuard
769770
}
770771

0 commit comments

Comments
 (0)