Python: type-track through dict-updates

This commit is contained in:
Rasmus Wriedt Larsen
2024-02-23 14:51:38 +01:00
parent 73fe596753
commit dac2b57bb0
4 changed files with 16 additions and 4 deletions

View File

@@ -648,6 +648,8 @@ predicate storeStepCommon(Node nodeFrom, ContentSet c, Node nodeTo) {
tupleStoreStep(nodeFrom, c, nodeTo)
or
dictStoreStep(nodeFrom, c, nodeTo)
or
moreDictStoreSteps(nodeFrom, c, nodeTo)
}
/**
@@ -661,8 +663,6 @@ predicate storeStep(Node nodeFrom, ContentSet c, Node nodeTo) {
or
setStoreStep(nodeFrom, c, nodeTo)
or
moreDictStoreSteps(nodeFrom, c, nodeTo)
or
comprehensionStoreStep(nodeFrom, c, nodeTo)
or
iterableUnpackingStoreStep(nodeFrom, c, nodeTo)

View File

@@ -175,7 +175,18 @@ module TypeTrackingInput implements Shared::TypeTrackingInput {
nodeTo = a.getObject()
)
or
DataFlowPrivate::storeStepCommon(nodeFrom, content, nodeTo)
// type-tracking doesn't really handle PostUpdateNodes, so for some assignment steps
// like `my_dict["foo"] = foo` the data-flow step targets the PostUpdateNode for
// `my_dict`, where we want to translate that into a type-tracking step that targets
// the normal/non-PostUpdateNode for `my_dict`.
exists(DataFlowPublic::Node storeTarget |
DataFlowPrivate::storeStepCommon(nodeFrom, content, storeTarget)
|
not storeTarget instanceof DataFlowPrivate::SyntheticPostUpdateNode and
nodeTo = storeTarget
or
nodeTo = storeTarget.(DataFlowPrivate::SyntheticPostUpdateNode).getPreUpdateNode()
)
or
TypeTrackerSummaryFlow::basicStoreStep(nodeFrom, nodeTo, content)
}