diff --git a/python/ql/lib/semmle/python/dataflow/new/FlowSummary.qll b/python/ql/lib/semmle/python/dataflow/new/FlowSummary.qll index 14b4b6d4796..5e82700bd0e 100644 --- a/python/ql/lib/semmle/python/dataflow/new/FlowSummary.qll +++ b/python/ql/lib/semmle/python/dataflow/new/FlowSummary.qll @@ -28,6 +28,27 @@ module SummaryComponent { /** Gets a summary component that represents a list element. */ SummaryComponent listElement() { result = content(any(ListElementContent c)) } + /** Gets a summary component that represents a set element. */ + SummaryComponent setElement() { result = content(any(SetElementContent c)) } + + /** Gets a summary component that represents a tuple element. */ + SummaryComponent tupleElement(int index) { + exists(TupleElementContent c | c.getIndex() = index and result = content(c)) + } + + /** Gets a summary component that represents a dictionary element. */ + SummaryComponent dictionaryElement(string key) { + exists(DictionaryElementContent c | c.getKey() = key and result = content(c)) + } + + /** Gets a summary component that represents a dictionary element at any key. */ + SummaryComponent dictionaryElementAny() { result = content(any(DictionaryElementAnyContent c)) } + + /** Gets a summary component that represents an attribute element. */ + SummaryComponent attribute(string attr) { + exists(AttributeContent c | c.getAttribute() = attr and result = content(c)) + } + /** Gets a summary component that represents the return value of a call. */ SummaryComponent return() { result = SC::return(any(ReturnKind rk)) } } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImplSpecific.qll b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImplSpecific.qll index 9c62b37245f..67a047d8843 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImplSpecific.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImplSpecific.qll @@ -105,6 +105,27 @@ predicate neutralSummaryElement(FlowSummary::SummarizedCallable c, string proven SummaryComponent interpretComponentSpecific(AccessPathToken c) { c = "ListElement" and result = FlowSummary::SummaryComponent::listElement() + or + c = "SetElement" and + result = FlowSummary::SummaryComponent::setElement() + or + exists(int index | + c.getAnArgument("TupleElement") = index.toString() and + result = FlowSummary::SummaryComponent::tupleElement(index) + ) + or + exists(string key | + c.getAnArgument("DictionaryElement") = key and + result = FlowSummary::SummaryComponent::dictionaryElement(key) + ) + or + c = "DictionaryElementAny" and + result = FlowSummary::SummaryComponent::dictionaryElementAny() + or + exists(string attr | + c.getAnArgument("Attribute") = attr and + result = FlowSummary::SummaryComponent::attribute(attr) + ) } /** Gets the textual representation of a summary component in the format used for flow summaries. */