Skip to content

Commit fcd346c

Browse files
committed
Python: Add flow from default values
to their parameters. This creates data-flow inconsistencies, probably because the default values have incorrect enclosing callables
1 parent 5cecea4 commit fcd346c

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ module EssaFlow {
209209
nodeTo = TKwOverflowNode(call, callable) and
210210
nodeFrom.asCfgNode() = call.getNode().getKwargs().getAFlowNode()
211211
)
212+
or
213+
// Default value for parameter flows to that parameter
214+
defaultValueFlowStep(nodeFrom, nodeTo)
212215
}
213216

214217
predicate useToNextUse(NameNode nodeFrom, NameNode nodeTo) {
@@ -1033,6 +1036,19 @@ predicate kwOverflowStoreStep(CfgNode nodeFrom, DictionaryElementContent c, Node
10331036
)
10341037
}
10351038

1039+
predicate defaultValueFlowStep(CfgNode nodeFrom, CfgNode nodeTo) {
1040+
exists(Function f, Parameter p, ParameterDefinition def |
1041+
// `getArgByName` supports, unlike `getAnArg`, keyword-only parameters
1042+
p = f.getArgByName(_) and
1043+
nodeFrom.asExpr() = p.getDefault() and
1044+
// The following expresses
1045+
// nodeTo.(ParameterNode).getParameter() = p
1046+
// without non-monotonic recursion
1047+
def.getParameter() = p and
1048+
nodeTo.getNode() = def.getDefiningNode()
1049+
)
1050+
}
1051+
10361052
/**
10371053
* Holds if data can flow from `nodeFrom` to `nodeTo` via a read of content `c`.
10381054
*/

0 commit comments

Comments
 (0)