mirror of
https://github.com/github/codeql.git
synced 2025-12-20 10:46:30 +01:00
Python: Filter _before_ the cartesian product
It's always a sad thing to see a good plan go wrong:
86860032 ~0% {4} r26 = JOIN r19 WITH DataFlowPublic::TupleElementContent#class#ff CARTESIAN PRODUCT OUTPUT Lhs.0 'nodeFrom', Lhs.1 'nodeTo', Rhs.0, Rhs.1
129256 ~3% {4} r27 = SELECT r26 ON In.3 <= 7
129256 ~0% {3} r28 = SCAN r27 OUTPUT In.0 'nodeFrom', In.2 'c', In.1 'nodeTo'
Happily, now it looks like this:
129256 ~0% {3} r20 = JOIN r19 WITH DataFlowPrivate::small_tuple#f CARTESIAN PRODUCT OUTPUT Lhs.0 'nodeFrom', Rhs.0, Lhs.1 'nodeTo'
This commit is contained in:
@@ -1517,10 +1517,13 @@ predicate forReadStep(CfgNode nodeFrom, Content c, Node nodeTo) {
|
||||
or
|
||||
c instanceof SetElementContent
|
||||
or
|
||||
c.(TupleElementContent).getIndex() <= 7
|
||||
c = small_tuple()
|
||||
)
|
||||
}
|
||||
|
||||
pragma[noinline]
|
||||
TupleElementContent small_tuple() { result.getIndex() <= 7 }
|
||||
|
||||
/**
|
||||
* Holds if `nodeTo` is a read of an attribute (corresponding to `c`) of the object in `nodeFrom`.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user