mirror of
https://github.com/github/codeql.git
synced 2026-02-18 16:03:45 +01:00
Python: type-track through dict-updates
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user