From ad27014d2acc9426bc8e0c9592bb983dab08f26c Mon Sep 17 00:00:00 2001 From: AkshayK Date: Thu, 27 Aug 2026 12:05:20 -0400 Subject: [PATCH] cpp: model BDE bslx in-stream deserialization taint flow Add flow summaries for the BDE byte-stream deserializers in BloombergLP::bslx: - ByteInStream and GenericInStream: constructing (or, for ByteInStream, reset-ing) from a buffer/streambuf taints the stream, and every get* method propagates that taint into its output variable. get* returns *this, so a fluent row keeps chained calls tainted. - InStreamFunctions::bdexStreamIn: the generic BDEX entry point that populates any bdex-compatible object from a stream, modeled as stream -> object. Not a duplicate of the bsl.* container models or the std/bsl QL models, which cover only the bsl standard-library-alike types; the bslx BDE namespace had no coverage. Verified with a BloombergLP::bslx-shaped stub in the dataflow external-models harness. --- .../change-notes/2026-08-27-bslx-models.md | 4 + cpp/ql/lib/ext/bslx.model.yml | 179 +++++++++++++ .../dataflow/external-models/bslx.cpp | 249 ++++++++++++++++++ .../dataflow/external-models/flow.expected | 95 ++++++- .../dataflow/external-models/steps.expected | 179 +++++++++++++ 5 files changed, 704 insertions(+), 2 deletions(-) create mode 100644 cpp/ql/lib/change-notes/2026-08-27-bslx-models.md create mode 100644 cpp/ql/lib/ext/bslx.model.yml create mode 100644 cpp/ql/test/library-tests/dataflow/external-models/bslx.cpp diff --git a/cpp/ql/lib/change-notes/2026-08-27-bslx-models.md b/cpp/ql/lib/change-notes/2026-08-27-bslx-models.md new file mode 100644 index 000000000000..f0905e0ddf41 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-27-bslx-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added taint flow summaries for the BDE `bslx` byte-stream deserializers `BloombergLP::bslx::ByteInStream`, `BloombergLP::bslx::GenericInStream`, and `BloombergLP::bslx::InStreamFunctions::bdexStreamIn`, so that data read from a `bslx` in-stream is tracked as tainted. diff --git a/cpp/ql/lib/ext/bslx.model.yml b/cpp/ql/lib/ext/bslx.model.yml new file mode 100644 index 000000000000..f92de8b43df3 --- /dev/null +++ b/cpp/ql/lib/ext/bslx.model.yml @@ -0,0 +1,179 @@ +# Model of the BDE `bslx` byte-stream deserializers (BloombergLP::bslx). +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: summaryModel + data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance + # === bslx::ByteInStream: concrete byte-array in-stream === + # Taint in: the source buffer/streambuf taints the stream (`this`). + # Note: MaD taint is additive, so `reset` cannot clear taint from a previously + # tainted stream; a stream reset with a clean buffer keeps any earlier taint. + - ["BloombergLP::bslx", "ByteInStream", true, "ByteInStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "reset", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + # Taint out: the stream (`this`) taints the deserialized output variable/buffer. + - ["BloombergLP::bslx", "ByteInStream", true, "getLength", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getVersion", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getFloat32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getFloat64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayFloat32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayFloat64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + # Fluent interface: each get* returns `*this`, keeping the returned stream tainted. + - ["BloombergLP::bslx", "ByteInStream", true, "getLength", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getVersion", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getInt64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getUint64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getFloat32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getFloat64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getString", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayInt64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayUint64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayFloat32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "ByteInStream", true, "getArrayFloat64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + # === bslx::GenericInStream: streambuf-backed in-stream === + # Taint in: the source buffer/streambuf taints the stream (`this`). + - ["BloombergLP::bslx", "GenericInStream", true, "GenericInStream", "", "", "Argument[*0]", "Argument[-1]", "taint", "manual"] + # Taint out: the stream (`this`) taints the deserialized output variable/buffer. + - ["BloombergLP::bslx", "GenericInStream", true, "getLength", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getVersion", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getFloat32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getFloat64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getString", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint8", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint16", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint24", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint40", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint48", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint56", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayFloat32", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayFloat64", "", "", "Argument[-1]", "Argument[*0]", "taint", "manual"] + # Fluent interface: each get* returns `*this`, keeping the returned stream tainted. + - ["BloombergLP::bslx", "GenericInStream", true, "getLength", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getVersion", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getInt64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getUint64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getFloat32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getFloat64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getString", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint8", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint16", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint24", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint40", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint48", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint56", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayInt64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayUint64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayFloat32", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + - ["BloombergLP::bslx", "GenericInStream", true, "getArrayFloat64", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] + # === bslx::InStreamFunctions::bdexStreamIn: generic BDEX deserialization === + # Free function template; `InStreamFunctions` is a namespace, so `type` is empty. + - ["BloombergLP::bslx::InStreamFunctions", "", false, "bdexStreamIn", "", "", "Argument[*0]", "Argument[*1]", "taint", "manual"] + - ["BloombergLP::bslx::InStreamFunctions", "", false, "bdexStreamIn", "", "", "Argument[*0]", "ReturnValue[*]", "taint", "manual"] diff --git a/cpp/ql/test/library-tests/dataflow/external-models/bslx.cpp b/cpp/ql/test/library-tests/dataflow/external-models/bslx.cpp new file mode 100644 index 000000000000..b7d47c3ec8a9 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/bslx.cpp @@ -0,0 +1,249 @@ + +// --- stub library headers --- + +namespace std { + typedef unsigned long size_t; + template class allocator {}; + template struct char_traits {}; + template, class Allocator = allocator > + class basic_string { + public: + basic_string(); + basic_string(const charT* s, const Allocator& a = Allocator()); + const charT* data() const; + size_t size() const; + }; + typedef basic_string string; +} + +// BDE spells the standard string as `bsl::string`; alias it onto the stub above. +namespace bsl { + using std::string; +} + +// BDE wraps every package-group namespace in `BloombergLP`; this stub reproduces that. +namespace BloombergLP { +namespace bsls { + // `bsls::Types` provides the fixed-width integer aliases used by the stream API. + struct Types { + typedef long long Int64; + typedef unsigned long long Uint64; + }; +} +namespace bslx { + class ByteInStream { + public: + ByteInStream(); + ByteInStream(const char *buffer, std::size_t numBytes); + void reset(const char *buffer, std::size_t numBytes); + ByteInStream &getLength(int &variable); + ByteInStream &getVersion(int &variable); + ByteInStream &getInt8(char &variable); + ByteInStream &getUint8(unsigned char &variable); + ByteInStream &getInt16(short &variable); + ByteInStream &getUint16(unsigned short &variable); + ByteInStream &getInt24(int &variable); + ByteInStream &getUint24(unsigned int &variable); + ByteInStream &getInt32(int &variable); + ByteInStream &getUint32(unsigned int &variable); + ByteInStream &getInt40(bsls::Types::Int64 &variable); + ByteInStream &getUint40(bsls::Types::Uint64 &variable); + ByteInStream &getInt48(bsls::Types::Int64 &variable); + ByteInStream &getUint48(bsls::Types::Uint64 &variable); + ByteInStream &getInt56(bsls::Types::Int64 &variable); + ByteInStream &getUint56(bsls::Types::Uint64 &variable); + ByteInStream &getInt64(bsls::Types::Int64 &variable); + ByteInStream &getUint64(bsls::Types::Uint64 &variable); + ByteInStream &getFloat32(float &variable); + ByteInStream &getFloat64(double &variable); + ByteInStream &getString(bsl::string &variable); + ByteInStream &getArrayInt8(char *variables, int numVariables); + ByteInStream &getArrayUint8(unsigned char *variables, int numVariables); + ByteInStream &getArrayInt16(short *variables, int numVariables); + ByteInStream &getArrayUint16(unsigned short *variables, int numVariables); + ByteInStream &getArrayInt24(int *variables, int numVariables); + ByteInStream &getArrayUint24(unsigned int *variables, int numVariables); + ByteInStream &getArrayInt32(int *variables, int numVariables); + ByteInStream &getArrayUint32(unsigned int *variables, int numVariables); + ByteInStream &getArrayInt40(bsls::Types::Int64 *variables, int numVariables); + ByteInStream &getArrayUint40(bsls::Types::Uint64 *variables, int numVariables); + ByteInStream &getArrayInt48(bsls::Types::Int64 *variables, int numVariables); + ByteInStream &getArrayUint48(bsls::Types::Uint64 *variables, int numVariables); + ByteInStream &getArrayInt56(bsls::Types::Int64 *variables, int numVariables); + ByteInStream &getArrayUint56(bsls::Types::Uint64 *variables, int numVariables); + ByteInStream &getArrayInt64(bsls::Types::Int64 *variables, int numVariables); + ByteInStream &getArrayUint64(bsls::Types::Uint64 *variables, int numVariables); + ByteInStream &getArrayFloat32(float *variables, int numVariables); + ByteInStream &getArrayFloat64(double *variables, int numVariables); + }; + + template + class GenericInStream { + public: + GenericInStream(STREAMBUF *streamBuf); + GenericInStream &getLength(int &variable); + GenericInStream &getVersion(int &variable); + GenericInStream &getInt8(char &variable); + GenericInStream &getUint8(unsigned char &variable); + GenericInStream &getInt16(short &variable); + GenericInStream &getUint16(unsigned short &variable); + GenericInStream &getInt24(int &variable); + GenericInStream &getUint24(unsigned int &variable); + GenericInStream &getInt32(int &variable); + GenericInStream &getUint32(unsigned int &variable); + GenericInStream &getInt40(bsls::Types::Int64 &variable); + GenericInStream &getUint40(bsls::Types::Uint64 &variable); + GenericInStream &getInt48(bsls::Types::Int64 &variable); + GenericInStream &getUint48(bsls::Types::Uint64 &variable); + GenericInStream &getInt56(bsls::Types::Int64 &variable); + GenericInStream &getUint56(bsls::Types::Uint64 &variable); + GenericInStream &getInt64(bsls::Types::Int64 &variable); + GenericInStream &getUint64(bsls::Types::Uint64 &variable); + GenericInStream &getFloat32(float &variable); + GenericInStream &getFloat64(double &variable); + GenericInStream &getString(bsl::string &variable); + GenericInStream &getArrayInt8(char *variables, int numVariables); + GenericInStream &getArrayUint8(unsigned char *variables, int numVariables); + GenericInStream &getArrayInt16(short *variables, int numVariables); + GenericInStream &getArrayUint16(unsigned short *variables, int numVariables); + GenericInStream &getArrayInt24(int *variables, int numVariables); + GenericInStream &getArrayUint24(unsigned int *variables, int numVariables); + GenericInStream &getArrayInt32(int *variables, int numVariables); + GenericInStream &getArrayUint32(unsigned int *variables, int numVariables); + GenericInStream &getArrayInt40(bsls::Types::Int64 *variables, int numVariables); + GenericInStream &getArrayUint40(bsls::Types::Uint64 *variables, int numVariables); + GenericInStream &getArrayInt48(bsls::Types::Int64 *variables, int numVariables); + GenericInStream &getArrayUint48(bsls::Types::Uint64 *variables, int numVariables); + GenericInStream &getArrayInt56(bsls::Types::Int64 *variables, int numVariables); + GenericInStream &getArrayUint56(bsls::Types::Uint64 *variables, int numVariables); + GenericInStream &getArrayInt64(bsls::Types::Int64 *variables, int numVariables); + GenericInStream &getArrayUint64(bsls::Types::Uint64 *variables, int numVariables); + GenericInStream &getArrayFloat32(float *variables, int numVariables); + GenericInStream &getArrayFloat64(double *variables, int numVariables); + }; + + namespace InStreamFunctions { + template + STREAM &bdexStreamIn(STREAM &stream, TYPE &variable); + } +} +} + +struct MyStreamBuf {}; + +char *source(); +void sink(int); +void sink(char); + +// --- flow tests (source -> sink) --- + +void test_ByteInStream_getInt32() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + int x = 0; + stream.getInt32(x); + sink(x); // $ ir +} + +void test_ByteInStream_getArrayInt8() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + char buf[16]; + stream.getArrayInt8(buf, 16); + sink(*buf); // $ ir +} + +void test_ByteInStream_getString() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + std::string out; + stream.getString(out); + sink(*out.data()); // $ ir +} + +void test_ByteInStream_chained() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + int a = 0; + int b = 0; + stream.getInt32(a).getInt32(b); + sink(b); // $ ir +} + +void test_ByteInStream_reset() { + BloombergLP::bslx::ByteInStream stream; + std::string data = std::string(source()); + stream.reset(data.data(), data.size()); + int x = 0; + stream.getInt32(x); + sink(x); // $ ir +} + +void test_GenericInStream_flow() { + std::string data = std::string(source()); + MyStreamBuf *sb = (MyStreamBuf *)data.data(); + BloombergLP::bslx::GenericInStream stream(sb); + int x = 0; + stream.getInt32(x); + sink(x); // $ ir +} + +void test_bdexStreamIn() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + int obj = 0; + BloombergLP::bslx::InStreamFunctions::bdexStreamIn(stream, obj); + sink(obj); // $ ir +} + +// --- coverage: call every modeled getter so steps.ql verifies each row is consumed --- + +void coverage_ByteInStream(BloombergLP::bslx::ByteInStream &stream) { + int i = 0; + unsigned int ui = 0; + char c = 0; + unsigned char uc = 0; + short s = 0; + unsigned short us = 0; + BloombergLP::bsls::Types::Int64 ll = 0; + BloombergLP::bsls::Types::Uint64 ull = 0; + float f = 0; + double d = 0; + bsl::string str; + char cbuf[16]; + unsigned char ucbuf[16]; + short sbuf[16]; + unsigned short usbuf[16]; + int ibuf[16]; + unsigned int uibuf[16]; + BloombergLP::bsls::Types::Int64 llbuf[16]; + BloombergLP::bsls::Types::Uint64 ullbuf[16]; + float fbuf[16]; + double dbuf[16]; + stream.getLength(i).getVersion(i).getInt8(c).getUint8(uc).getInt16(s).getUint16(us).getInt24(i).getUint24(ui).getInt32(i).getUint32(ui).getInt40(ll).getUint40(ull).getInt48(ll).getUint48(ull).getInt56(ll).getUint56(ull).getInt64(ll).getUint64(ull).getFloat32(f).getFloat64(d).getString(str).getArrayInt8(cbuf, 16).getArrayUint8(ucbuf, 16).getArrayInt16(sbuf, 16).getArrayUint16(usbuf, 16).getArrayInt24(ibuf, 16).getArrayUint24(uibuf, 16).getArrayInt32(ibuf, 16).getArrayUint32(uibuf, 16).getArrayInt40(llbuf, 16).getArrayUint40(ullbuf, 16).getArrayInt48(llbuf, 16).getArrayUint48(ullbuf, 16).getArrayInt56(llbuf, 16).getArrayUint56(ullbuf, 16).getArrayInt64(llbuf, 16).getArrayUint64(ullbuf, 16).getArrayFloat32(fbuf, 16).getArrayFloat64(dbuf, 16); +} + +void coverage_GenericInStream(BloombergLP::bslx::GenericInStream &stream) { + int i = 0; + unsigned int ui = 0; + char c = 0; + unsigned char uc = 0; + short s = 0; + unsigned short us = 0; + BloombergLP::bsls::Types::Int64 ll = 0; + BloombergLP::bsls::Types::Uint64 ull = 0; + float f = 0; + double d = 0; + bsl::string str; + char cbuf[16]; + unsigned char ucbuf[16]; + short sbuf[16]; + unsigned short usbuf[16]; + int ibuf[16]; + unsigned int uibuf[16]; + BloombergLP::bsls::Types::Int64 llbuf[16]; + BloombergLP::bsls::Types::Uint64 ullbuf[16]; + float fbuf[16]; + double dbuf[16]; + stream.getLength(i).getVersion(i).getInt8(c).getUint8(uc).getInt16(s).getUint16(us).getInt24(i).getUint24(ui).getInt32(i).getUint32(ui).getInt40(ll).getUint40(ull).getInt48(ll).getUint48(ull).getInt56(ll).getUint56(ull).getInt64(ll).getUint64(ull).getFloat32(f).getFloat64(d).getString(str).getArrayInt8(cbuf, 16).getArrayUint8(ucbuf, 16).getArrayInt16(sbuf, 16).getArrayUint16(usbuf, 16).getArrayInt24(ibuf, 16).getArrayUint24(uibuf, 16).getArrayInt32(ibuf, 16).getArrayUint32(uibuf, 16).getArrayInt40(llbuf, 16).getArrayUint40(ullbuf, 16).getArrayInt48(llbuf, 16).getArrayUint48(ullbuf, 16).getArrayInt56(llbuf, 16).getArrayUint56(ullbuf, 16).getArrayInt64(llbuf, 16).getArrayUint64(ullbuf, 16).getArrayFloat32(fbuf, 16).getArrayFloat64(dbuf, 16); +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index b6f5f4a4452f..592a12867b28 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -95,7 +95,16 @@ models | 94 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | | 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | | 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 97 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 97 | Summary: BloombergLP::bslx::InStreamFunctions; ; false; bdexStreamIn; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 98 | Summary: BloombergLP::bslx; ByteInStream; true; ByteInStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 99 | Summary: BloombergLP::bslx; ByteInStream; true; getArrayInt8; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 100 | Summary: BloombergLP::bslx; ByteInStream; true; getInt32; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 101 | Summary: BloombergLP::bslx; ByteInStream; true; getInt32; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 102 | Summary: BloombergLP::bslx; ByteInStream; true; getString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 103 | Summary: BloombergLP::bslx; ByteInStream; true; reset; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 104 | Summary: BloombergLP::bslx; GenericInStream; true; GenericInStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 105 | Summary: BloombergLP::bslx; GenericInStream; true; getInt32; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 106 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -104,7 +113,7 @@ edges | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:97 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:106 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | @@ -144,6 +153,44 @@ edges | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | +| bslx.cpp:141:33:141:40 | call to source | bslx.cpp:142:46:142:49 | *call to data | provenance | TaintFunction | +| bslx.cpp:142:34:142:39 | call to ByteInStream | bslx.cpp:144:2:144:7 | *stream | provenance | | +| bslx.cpp:142:46:142:49 | *call to data | bslx.cpp:142:34:142:39 | call to ByteInStream | provenance | MaD:98 | +| bslx.cpp:144:2:144:7 | *stream | bslx.cpp:144:18:144:18 | getInt32 output argument | provenance | MaD:100 | +| bslx.cpp:144:18:144:18 | getInt32 output argument | bslx.cpp:145:7:145:7 | x | provenance | | +| bslx.cpp:149:33:149:40 | call to source | bslx.cpp:150:46:150:49 | *call to data | provenance | TaintFunction | +| bslx.cpp:150:34:150:39 | call to ByteInStream | bslx.cpp:152:2:152:7 | *stream | provenance | | +| bslx.cpp:150:46:150:49 | *call to data | bslx.cpp:150:34:150:39 | call to ByteInStream | provenance | MaD:98 | +| bslx.cpp:152:2:152:7 | *stream | bslx.cpp:152:22:152:24 | getArrayInt8 output argument | provenance | MaD:99 | +| bslx.cpp:152:22:152:24 | getArrayInt8 output argument | bslx.cpp:153:7:153:10 | * ... | provenance | | +| bslx.cpp:157:33:157:40 | call to source | bslx.cpp:158:46:158:49 | *call to data | provenance | TaintFunction | +| bslx.cpp:158:34:158:39 | call to ByteInStream | bslx.cpp:160:2:160:7 | *stream | provenance | | +| bslx.cpp:158:46:158:49 | *call to data | bslx.cpp:158:34:158:39 | call to ByteInStream | provenance | MaD:98 | +| bslx.cpp:160:2:160:7 | *stream | bslx.cpp:160:19:160:21 | getString output argument | provenance | MaD:102 | +| bslx.cpp:160:19:160:21 | getString output argument | bslx.cpp:161:7:161:17 | * ... | provenance | TaintFunction | +| bslx.cpp:165:33:165:40 | call to source | bslx.cpp:166:46:166:49 | *call to data | provenance | TaintFunction | +| bslx.cpp:166:34:166:39 | call to ByteInStream | bslx.cpp:169:2:169:7 | *stream | provenance | | +| bslx.cpp:166:46:166:49 | *call to data | bslx.cpp:166:34:166:39 | call to ByteInStream | provenance | MaD:98 | +| bslx.cpp:169:2:169:7 | *stream | bslx.cpp:169:17:169:20 | *call to getInt32 | provenance | MaD:101 | +| bslx.cpp:169:17:169:20 | *call to getInt32 | bslx.cpp:169:30:169:30 | getInt32 output argument | provenance | MaD:100 | +| bslx.cpp:169:30:169:30 | getInt32 output argument | bslx.cpp:170:7:170:7 | b | provenance | | +| bslx.cpp:175:33:175:40 | call to source | bslx.cpp:176:20:176:23 | *call to data | provenance | TaintFunction | +| bslx.cpp:176:2:176:7 | reset output argument | bslx.cpp:178:2:178:7 | *stream | provenance | | +| bslx.cpp:176:20:176:23 | *call to data | bslx.cpp:176:2:176:7 | reset output argument | provenance | MaD:103 | +| bslx.cpp:178:2:178:7 | *stream | bslx.cpp:178:18:178:18 | getInt32 output argument | provenance | MaD:100 | +| bslx.cpp:178:18:178:18 | getInt32 output argument | bslx.cpp:179:7:179:7 | x | provenance | | +| bslx.cpp:183:33:183:40 | call to source | bslx.cpp:184:20:184:45 | *call to data | provenance | TaintFunction | +| bslx.cpp:184:20:184:45 | *call to data | bslx.cpp:185:57:185:58 | *sb | provenance | | +| bslx.cpp:184:20:184:45 | *call to data | bslx.cpp:187:2:187:7 | *stream | provenance | TaintFunction | +| bslx.cpp:185:50:185:55 | call to GenericInStream | bslx.cpp:187:2:187:7 | *stream | provenance | | +| bslx.cpp:185:57:185:58 | *sb | bslx.cpp:185:50:185:55 | call to GenericInStream | provenance | MaD:104 | +| bslx.cpp:187:2:187:7 | *stream | bslx.cpp:187:18:187:18 | getInt32 output argument | provenance | MaD:105 | +| bslx.cpp:187:18:187:18 | getInt32 output argument | bslx.cpp:188:7:188:7 | x | provenance | | +| bslx.cpp:192:33:192:40 | call to source | bslx.cpp:193:46:193:49 | *call to data | provenance | TaintFunction | +| bslx.cpp:193:34:193:39 | call to ByteInStream | bslx.cpp:195:53:195:58 | *stream | provenance | | +| bslx.cpp:193:46:193:49 | *call to data | bslx.cpp:193:34:193:39 | call to ByteInStream | provenance | MaD:98 | +| bslx.cpp:195:53:195:58 | *stream | bslx.cpp:195:61:195:63 | bdexStreamIn output argument | provenance | MaD:97 | +| bslx.cpp:195:61:195:63 | bdexStreamIn output argument | bslx.cpp:196:7:196:9 | obj | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | @@ -532,6 +579,50 @@ nodes | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | | azure.cpp:295:10:295:20 | contentType | semmle.label | contentType | +| bslx.cpp:141:33:141:40 | call to source | semmle.label | call to source | +| bslx.cpp:142:34:142:39 | call to ByteInStream | semmle.label | call to ByteInStream | +| bslx.cpp:142:46:142:49 | *call to data | semmle.label | *call to data | +| bslx.cpp:144:2:144:7 | *stream | semmle.label | *stream | +| bslx.cpp:144:18:144:18 | getInt32 output argument | semmle.label | getInt32 output argument | +| bslx.cpp:145:7:145:7 | x | semmle.label | x | +| bslx.cpp:149:33:149:40 | call to source | semmle.label | call to source | +| bslx.cpp:150:34:150:39 | call to ByteInStream | semmle.label | call to ByteInStream | +| bslx.cpp:150:46:150:49 | *call to data | semmle.label | *call to data | +| bslx.cpp:152:2:152:7 | *stream | semmle.label | *stream | +| bslx.cpp:152:22:152:24 | getArrayInt8 output argument | semmle.label | getArrayInt8 output argument | +| bslx.cpp:153:7:153:10 | * ... | semmle.label | * ... | +| bslx.cpp:157:33:157:40 | call to source | semmle.label | call to source | +| bslx.cpp:158:34:158:39 | call to ByteInStream | semmle.label | call to ByteInStream | +| bslx.cpp:158:46:158:49 | *call to data | semmle.label | *call to data | +| bslx.cpp:160:2:160:7 | *stream | semmle.label | *stream | +| bslx.cpp:160:19:160:21 | getString output argument | semmle.label | getString output argument | +| bslx.cpp:161:7:161:17 | * ... | semmle.label | * ... | +| bslx.cpp:165:33:165:40 | call to source | semmle.label | call to source | +| bslx.cpp:166:34:166:39 | call to ByteInStream | semmle.label | call to ByteInStream | +| bslx.cpp:166:46:166:49 | *call to data | semmle.label | *call to data | +| bslx.cpp:169:2:169:7 | *stream | semmle.label | *stream | +| bslx.cpp:169:17:169:20 | *call to getInt32 | semmle.label | *call to getInt32 | +| bslx.cpp:169:30:169:30 | getInt32 output argument | semmle.label | getInt32 output argument | +| bslx.cpp:170:7:170:7 | b | semmle.label | b | +| bslx.cpp:175:33:175:40 | call to source | semmle.label | call to source | +| bslx.cpp:176:2:176:7 | reset output argument | semmle.label | reset output argument | +| bslx.cpp:176:20:176:23 | *call to data | semmle.label | *call to data | +| bslx.cpp:178:2:178:7 | *stream | semmle.label | *stream | +| bslx.cpp:178:18:178:18 | getInt32 output argument | semmle.label | getInt32 output argument | +| bslx.cpp:179:7:179:7 | x | semmle.label | x | +| bslx.cpp:183:33:183:40 | call to source | semmle.label | call to source | +| bslx.cpp:184:20:184:45 | *call to data | semmle.label | *call to data | +| bslx.cpp:185:50:185:55 | call to GenericInStream | semmle.label | call to GenericInStream | +| bslx.cpp:185:57:185:58 | *sb | semmle.label | *sb | +| bslx.cpp:187:2:187:7 | *stream | semmle.label | *stream | +| bslx.cpp:187:18:187:18 | getInt32 output argument | semmle.label | getInt32 output argument | +| bslx.cpp:188:7:188:7 | x | semmle.label | x | +| bslx.cpp:192:33:192:40 | call to source | semmle.label | call to source | +| bslx.cpp:193:34:193:39 | call to ByteInStream | semmle.label | call to ByteInStream | +| bslx.cpp:193:46:193:49 | *call to data | semmle.label | *call to data | +| bslx.cpp:195:53:195:58 | *stream | semmle.label | *stream | +| bslx.cpp:195:61:195:63 | bdexStreamIn output argument | semmle.label | bdexStreamIn output argument | +| bslx.cpp:196:7:196:9 | obj | semmle.label | obj | | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | semmle.label | *ymlStepGenerated_with_body | | test.cpp:7:47:7:52 | value2 | semmle.label | value2 | | test.cpp:7:64:7:69 | value2 | semmle.label | value2 | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected index 0fe13460cfbf..ed2a3afdd1f5 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -4,6 +4,185 @@ | azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | | azure.cpp:287:79:287:98 | call to string | azure.cpp:287:62:287:99 | call to Url | | azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | +| bslx.cpp:142:46:142:49 | *call to data | bslx.cpp:142:34:142:39 | call to ByteInStream | +| bslx.cpp:144:2:144:7 | *stream | bslx.cpp:144:17:144:20 | *call to getInt32 | +| bslx.cpp:144:2:144:7 | *stream | bslx.cpp:144:18:144:18 | getInt32 output argument | +| bslx.cpp:150:46:150:49 | *call to data | bslx.cpp:150:34:150:39 | call to ByteInStream | +| bslx.cpp:152:2:152:7 | *stream | bslx.cpp:152:21:152:30 | *call to getArrayInt8 | +| bslx.cpp:152:2:152:7 | *stream | bslx.cpp:152:22:152:24 | getArrayInt8 output argument | +| bslx.cpp:158:46:158:49 | *call to data | bslx.cpp:158:34:158:39 | call to ByteInStream | +| bslx.cpp:160:2:160:7 | *stream | bslx.cpp:160:18:160:23 | *call to getString | +| bslx.cpp:160:2:160:7 | *stream | bslx.cpp:160:19:160:21 | getString output argument | +| bslx.cpp:166:46:166:49 | *call to data | bslx.cpp:166:34:166:39 | call to ByteInStream | +| bslx.cpp:169:2:169:7 | *stream | bslx.cpp:169:17:169:20 | *call to getInt32 | +| bslx.cpp:169:2:169:7 | *stream | bslx.cpp:169:18:169:18 | getInt32 output argument | +| bslx.cpp:169:17:169:20 | *call to getInt32 | bslx.cpp:169:29:169:32 | *call to getInt32 | +| bslx.cpp:169:17:169:20 | *call to getInt32 | bslx.cpp:169:30:169:30 | getInt32 output argument | +| bslx.cpp:176:20:176:23 | *call to data | bslx.cpp:176:2:176:7 | reset output argument | +| bslx.cpp:178:2:178:7 | *stream | bslx.cpp:178:17:178:20 | *call to getInt32 | +| bslx.cpp:178:2:178:7 | *stream | bslx.cpp:178:18:178:18 | getInt32 output argument | +| bslx.cpp:185:57:185:58 | *sb | bslx.cpp:185:50:185:55 | call to GenericInStream | +| bslx.cpp:187:2:187:7 | *stream | bslx.cpp:187:17:187:20 | *call to getInt32 | +| bslx.cpp:187:2:187:7 | *stream | bslx.cpp:187:18:187:18 | getInt32 output argument | +| bslx.cpp:193:46:193:49 | *call to data | bslx.cpp:193:34:193:39 | call to ByteInStream | +| bslx.cpp:195:53:195:58 | *stream | bslx.cpp:195:52:195:65 | *call to bdexStreamIn | +| bslx.cpp:195:53:195:58 | *stream | bslx.cpp:195:61:195:63 | bdexStreamIn output argument | +| bslx.cpp:223:2:223:7 | *stream | bslx.cpp:223:18:223:21 | *call to getLength | +| bslx.cpp:223:2:223:7 | *stream | bslx.cpp:223:19:223:19 | getLength output argument | +| bslx.cpp:223:18:223:21 | *call to getLength | bslx.cpp:223:32:223:35 | *call to getVersion | +| bslx.cpp:223:18:223:21 | *call to getLength | bslx.cpp:223:33:223:33 | getVersion output argument | +| bslx.cpp:223:32:223:35 | *call to getVersion | bslx.cpp:223:43:223:46 | *call to getInt8 | +| bslx.cpp:223:32:223:35 | *call to getVersion | bslx.cpp:223:44:223:44 | getInt8 output argument | +| bslx.cpp:223:43:223:46 | *call to getInt8 | bslx.cpp:223:55:223:59 | *call to getUint8 | +| bslx.cpp:223:43:223:46 | *call to getInt8 | bslx.cpp:223:56:223:57 | getUint8 output argument | +| bslx.cpp:223:55:223:59 | *call to getUint8 | bslx.cpp:223:68:223:71 | *call to getInt16 | +| bslx.cpp:223:55:223:59 | *call to getUint8 | bslx.cpp:223:69:223:69 | getInt16 output argument | +| bslx.cpp:223:68:223:71 | *call to getInt16 | bslx.cpp:223:81:223:85 | *call to getUint16 | +| bslx.cpp:223:68:223:71 | *call to getInt16 | bslx.cpp:223:82:223:83 | getUint16 output argument | +| bslx.cpp:223:81:223:85 | *call to getUint16 | bslx.cpp:223:94:223:97 | *call to getInt24 | +| bslx.cpp:223:81:223:85 | *call to getUint16 | bslx.cpp:223:95:223:95 | getInt24 output argument | +| bslx.cpp:223:94:223:97 | *call to getInt24 | bslx.cpp:223:107:223:111 | *call to getUint24 | +| bslx.cpp:223:94:223:97 | *call to getInt24 | bslx.cpp:223:108:223:109 | getUint24 output argument | +| bslx.cpp:223:107:223:111 | *call to getUint24 | bslx.cpp:223:120:223:123 | *call to getInt32 | +| bslx.cpp:223:107:223:111 | *call to getUint24 | bslx.cpp:223:121:223:121 | getInt32 output argument | +| bslx.cpp:223:120:223:123 | *call to getInt32 | bslx.cpp:223:133:223:137 | *call to getUint32 | +| bslx.cpp:223:120:223:123 | *call to getInt32 | bslx.cpp:223:134:223:135 | getUint32 output argument | +| bslx.cpp:223:133:223:137 | *call to getUint32 | bslx.cpp:223:146:223:150 | *call to getInt40 | +| bslx.cpp:223:133:223:137 | *call to getUint32 | bslx.cpp:223:147:223:148 | getInt40 output argument | +| bslx.cpp:223:146:223:150 | *call to getInt40 | bslx.cpp:223:160:223:165 | *call to getUint40 | +| bslx.cpp:223:146:223:150 | *call to getInt40 | bslx.cpp:223:161:223:163 | getUint40 output argument | +| bslx.cpp:223:160:223:165 | *call to getUint40 | bslx.cpp:223:174:223:178 | *call to getInt48 | +| bslx.cpp:223:160:223:165 | *call to getUint40 | bslx.cpp:223:175:223:176 | getInt48 output argument | +| bslx.cpp:223:174:223:178 | *call to getInt48 | bslx.cpp:223:188:223:193 | *call to getUint48 | +| bslx.cpp:223:174:223:178 | *call to getInt48 | bslx.cpp:223:189:223:191 | getUint48 output argument | +| bslx.cpp:223:188:223:193 | *call to getUint48 | bslx.cpp:223:202:223:206 | *call to getInt56 | +| bslx.cpp:223:188:223:193 | *call to getUint48 | bslx.cpp:223:203:223:204 | getInt56 output argument | +| bslx.cpp:223:202:223:206 | *call to getInt56 | bslx.cpp:223:216:223:221 | *call to getUint56 | +| bslx.cpp:223:202:223:206 | *call to getInt56 | bslx.cpp:223:217:223:219 | getUint56 output argument | +| bslx.cpp:223:216:223:221 | *call to getUint56 | bslx.cpp:223:230:223:234 | *call to getInt64 | +| bslx.cpp:223:216:223:221 | *call to getUint56 | bslx.cpp:223:231:223:232 | getInt64 output argument | +| bslx.cpp:223:230:223:234 | *call to getInt64 | bslx.cpp:223:244:223:249 | *call to getUint64 | +| bslx.cpp:223:230:223:234 | *call to getInt64 | bslx.cpp:223:245:223:247 | getUint64 output argument | +| bslx.cpp:223:244:223:249 | *call to getUint64 | bslx.cpp:223:260:223:263 | *call to getFloat32 | +| bslx.cpp:223:244:223:249 | *call to getUint64 | bslx.cpp:223:261:223:261 | getFloat32 output argument | +| bslx.cpp:223:260:223:263 | *call to getFloat32 | bslx.cpp:223:274:223:277 | *call to getFloat64 | +| bslx.cpp:223:260:223:263 | *call to getFloat32 | bslx.cpp:223:275:223:275 | getFloat64 output argument | +| bslx.cpp:223:274:223:277 | *call to getFloat64 | bslx.cpp:223:287:223:292 | *call to getString | +| bslx.cpp:223:274:223:277 | *call to getFloat64 | bslx.cpp:223:288:223:290 | getString output argument | +| bslx.cpp:223:287:223:292 | *call to getString | bslx.cpp:223:305:223:315 | *call to getArrayInt8 | +| bslx.cpp:223:287:223:292 | *call to getString | bslx.cpp:223:306:223:309 | getArrayInt8 output argument | +| bslx.cpp:223:305:223:315 | *call to getArrayInt8 | bslx.cpp:223:329:223:340 | *call to getArrayUint8 | +| bslx.cpp:223:305:223:315 | *call to getArrayInt8 | bslx.cpp:223:330:223:334 | getArrayUint8 output argument | +| bslx.cpp:223:329:223:340 | *call to getArrayUint8 | bslx.cpp:223:354:223:364 | *call to getArrayInt16 | +| bslx.cpp:223:329:223:340 | *call to getArrayUint8 | bslx.cpp:223:355:223:358 | getArrayInt16 output argument | +| bslx.cpp:223:354:223:364 | *call to getArrayInt16 | bslx.cpp:223:379:223:390 | *call to getArrayUint16 | +| bslx.cpp:223:354:223:364 | *call to getArrayInt16 | bslx.cpp:223:380:223:384 | getArrayUint16 output argument | +| bslx.cpp:223:379:223:390 | *call to getArrayUint16 | bslx.cpp:223:404:223:414 | *call to getArrayInt24 | +| bslx.cpp:223:379:223:390 | *call to getArrayUint16 | bslx.cpp:223:405:223:408 | getArrayInt24 output argument | +| bslx.cpp:223:404:223:414 | *call to getArrayInt24 | bslx.cpp:223:429:223:440 | *call to getArrayUint24 | +| bslx.cpp:223:404:223:414 | *call to getArrayInt24 | bslx.cpp:223:430:223:434 | getArrayUint24 output argument | +| bslx.cpp:223:429:223:440 | *call to getArrayUint24 | bslx.cpp:223:454:223:464 | *call to getArrayInt32 | +| bslx.cpp:223:429:223:440 | *call to getArrayUint24 | bslx.cpp:223:455:223:458 | getArrayInt32 output argument | +| bslx.cpp:223:454:223:464 | *call to getArrayInt32 | bslx.cpp:223:479:223:490 | *call to getArrayUint32 | +| bslx.cpp:223:454:223:464 | *call to getArrayInt32 | bslx.cpp:223:480:223:484 | getArrayUint32 output argument | +| bslx.cpp:223:479:223:490 | *call to getArrayUint32 | bslx.cpp:223:504:223:515 | *call to getArrayInt40 | +| bslx.cpp:223:479:223:490 | *call to getArrayUint32 | bslx.cpp:223:505:223:509 | getArrayInt40 output argument | +| bslx.cpp:223:504:223:515 | *call to getArrayInt40 | bslx.cpp:223:530:223:542 | *call to getArrayUint40 | +| bslx.cpp:223:504:223:515 | *call to getArrayInt40 | bslx.cpp:223:531:223:536 | getArrayUint40 output argument | +| bslx.cpp:223:530:223:542 | *call to getArrayUint40 | bslx.cpp:223:556:223:567 | *call to getArrayInt48 | +| bslx.cpp:223:530:223:542 | *call to getArrayUint40 | bslx.cpp:223:557:223:561 | getArrayInt48 output argument | +| bslx.cpp:223:556:223:567 | *call to getArrayInt48 | bslx.cpp:223:582:223:594 | *call to getArrayUint48 | +| bslx.cpp:223:556:223:567 | *call to getArrayInt48 | bslx.cpp:223:583:223:588 | getArrayUint48 output argument | +| bslx.cpp:223:582:223:594 | *call to getArrayUint48 | bslx.cpp:223:608:223:619 | *call to getArrayInt56 | +| bslx.cpp:223:582:223:594 | *call to getArrayUint48 | bslx.cpp:223:609:223:613 | getArrayInt56 output argument | +| bslx.cpp:223:608:223:619 | *call to getArrayInt56 | bslx.cpp:223:634:223:646 | *call to getArrayUint56 | +| bslx.cpp:223:608:223:619 | *call to getArrayInt56 | bslx.cpp:223:635:223:640 | getArrayUint56 output argument | +| bslx.cpp:223:634:223:646 | *call to getArrayUint56 | bslx.cpp:223:660:223:671 | *call to getArrayInt64 | +| bslx.cpp:223:634:223:646 | *call to getArrayUint56 | bslx.cpp:223:661:223:665 | getArrayInt64 output argument | +| bslx.cpp:223:660:223:671 | *call to getArrayInt64 | bslx.cpp:223:686:223:698 | *call to getArrayUint64 | +| bslx.cpp:223:660:223:671 | *call to getArrayInt64 | bslx.cpp:223:687:223:692 | getArrayUint64 output argument | +| bslx.cpp:223:686:223:698 | *call to getArrayUint64 | bslx.cpp:223:714:223:724 | *call to getArrayFloat32 | +| bslx.cpp:223:686:223:698 | *call to getArrayUint64 | bslx.cpp:223:715:223:718 | getArrayFloat32 output argument | +| bslx.cpp:223:714:223:724 | *call to getArrayFloat32 | bslx.cpp:223:740:223:750 | *call to getArrayFloat64 | +| bslx.cpp:223:714:223:724 | *call to getArrayFloat32 | bslx.cpp:223:741:223:744 | getArrayFloat64 output argument | +| bslx.cpp:248:2:248:7 | *stream | bslx.cpp:248:18:248:21 | *call to getLength | +| bslx.cpp:248:2:248:7 | *stream | bslx.cpp:248:19:248:19 | getLength output argument | +| bslx.cpp:248:18:248:21 | *call to getLength | bslx.cpp:248:32:248:35 | *call to getVersion | +| bslx.cpp:248:18:248:21 | *call to getLength | bslx.cpp:248:33:248:33 | getVersion output argument | +| bslx.cpp:248:32:248:35 | *call to getVersion | bslx.cpp:248:43:248:46 | *call to getInt8 | +| bslx.cpp:248:32:248:35 | *call to getVersion | bslx.cpp:248:44:248:44 | getInt8 output argument | +| bslx.cpp:248:43:248:46 | *call to getInt8 | bslx.cpp:248:55:248:59 | *call to getUint8 | +| bslx.cpp:248:43:248:46 | *call to getInt8 | bslx.cpp:248:56:248:57 | getUint8 output argument | +| bslx.cpp:248:55:248:59 | *call to getUint8 | bslx.cpp:248:68:248:71 | *call to getInt16 | +| bslx.cpp:248:55:248:59 | *call to getUint8 | bslx.cpp:248:69:248:69 | getInt16 output argument | +| bslx.cpp:248:68:248:71 | *call to getInt16 | bslx.cpp:248:81:248:85 | *call to getUint16 | +| bslx.cpp:248:68:248:71 | *call to getInt16 | bslx.cpp:248:82:248:83 | getUint16 output argument | +| bslx.cpp:248:81:248:85 | *call to getUint16 | bslx.cpp:248:94:248:97 | *call to getInt24 | +| bslx.cpp:248:81:248:85 | *call to getUint16 | bslx.cpp:248:95:248:95 | getInt24 output argument | +| bslx.cpp:248:94:248:97 | *call to getInt24 | bslx.cpp:248:107:248:111 | *call to getUint24 | +| bslx.cpp:248:94:248:97 | *call to getInt24 | bslx.cpp:248:108:248:109 | getUint24 output argument | +| bslx.cpp:248:107:248:111 | *call to getUint24 | bslx.cpp:248:120:248:123 | *call to getInt32 | +| bslx.cpp:248:107:248:111 | *call to getUint24 | bslx.cpp:248:121:248:121 | getInt32 output argument | +| bslx.cpp:248:120:248:123 | *call to getInt32 | bslx.cpp:248:133:248:137 | *call to getUint32 | +| bslx.cpp:248:120:248:123 | *call to getInt32 | bslx.cpp:248:134:248:135 | getUint32 output argument | +| bslx.cpp:248:133:248:137 | *call to getUint32 | bslx.cpp:248:146:248:150 | *call to getInt40 | +| bslx.cpp:248:133:248:137 | *call to getUint32 | bslx.cpp:248:147:248:148 | getInt40 output argument | +| bslx.cpp:248:146:248:150 | *call to getInt40 | bslx.cpp:248:160:248:165 | *call to getUint40 | +| bslx.cpp:248:146:248:150 | *call to getInt40 | bslx.cpp:248:161:248:163 | getUint40 output argument | +| bslx.cpp:248:160:248:165 | *call to getUint40 | bslx.cpp:248:174:248:178 | *call to getInt48 | +| bslx.cpp:248:160:248:165 | *call to getUint40 | bslx.cpp:248:175:248:176 | getInt48 output argument | +| bslx.cpp:248:174:248:178 | *call to getInt48 | bslx.cpp:248:188:248:193 | *call to getUint48 | +| bslx.cpp:248:174:248:178 | *call to getInt48 | bslx.cpp:248:189:248:191 | getUint48 output argument | +| bslx.cpp:248:188:248:193 | *call to getUint48 | bslx.cpp:248:202:248:206 | *call to getInt56 | +| bslx.cpp:248:188:248:193 | *call to getUint48 | bslx.cpp:248:203:248:204 | getInt56 output argument | +| bslx.cpp:248:202:248:206 | *call to getInt56 | bslx.cpp:248:216:248:221 | *call to getUint56 | +| bslx.cpp:248:202:248:206 | *call to getInt56 | bslx.cpp:248:217:248:219 | getUint56 output argument | +| bslx.cpp:248:216:248:221 | *call to getUint56 | bslx.cpp:248:230:248:234 | *call to getInt64 | +| bslx.cpp:248:216:248:221 | *call to getUint56 | bslx.cpp:248:231:248:232 | getInt64 output argument | +| bslx.cpp:248:230:248:234 | *call to getInt64 | bslx.cpp:248:244:248:249 | *call to getUint64 | +| bslx.cpp:248:230:248:234 | *call to getInt64 | bslx.cpp:248:245:248:247 | getUint64 output argument | +| bslx.cpp:248:244:248:249 | *call to getUint64 | bslx.cpp:248:260:248:263 | *call to getFloat32 | +| bslx.cpp:248:244:248:249 | *call to getUint64 | bslx.cpp:248:261:248:261 | getFloat32 output argument | +| bslx.cpp:248:260:248:263 | *call to getFloat32 | bslx.cpp:248:274:248:277 | *call to getFloat64 | +| bslx.cpp:248:260:248:263 | *call to getFloat32 | bslx.cpp:248:275:248:275 | getFloat64 output argument | +| bslx.cpp:248:274:248:277 | *call to getFloat64 | bslx.cpp:248:287:248:292 | *call to getString | +| bslx.cpp:248:274:248:277 | *call to getFloat64 | bslx.cpp:248:288:248:290 | getString output argument | +| bslx.cpp:248:287:248:292 | *call to getString | bslx.cpp:248:305:248:315 | *call to getArrayInt8 | +| bslx.cpp:248:287:248:292 | *call to getString | bslx.cpp:248:306:248:309 | getArrayInt8 output argument | +| bslx.cpp:248:305:248:315 | *call to getArrayInt8 | bslx.cpp:248:329:248:340 | *call to getArrayUint8 | +| bslx.cpp:248:305:248:315 | *call to getArrayInt8 | bslx.cpp:248:330:248:334 | getArrayUint8 output argument | +| bslx.cpp:248:329:248:340 | *call to getArrayUint8 | bslx.cpp:248:354:248:364 | *call to getArrayInt16 | +| bslx.cpp:248:329:248:340 | *call to getArrayUint8 | bslx.cpp:248:355:248:358 | getArrayInt16 output argument | +| bslx.cpp:248:354:248:364 | *call to getArrayInt16 | bslx.cpp:248:379:248:390 | *call to getArrayUint16 | +| bslx.cpp:248:354:248:364 | *call to getArrayInt16 | bslx.cpp:248:380:248:384 | getArrayUint16 output argument | +| bslx.cpp:248:379:248:390 | *call to getArrayUint16 | bslx.cpp:248:404:248:414 | *call to getArrayInt24 | +| bslx.cpp:248:379:248:390 | *call to getArrayUint16 | bslx.cpp:248:405:248:408 | getArrayInt24 output argument | +| bslx.cpp:248:404:248:414 | *call to getArrayInt24 | bslx.cpp:248:429:248:440 | *call to getArrayUint24 | +| bslx.cpp:248:404:248:414 | *call to getArrayInt24 | bslx.cpp:248:430:248:434 | getArrayUint24 output argument | +| bslx.cpp:248:429:248:440 | *call to getArrayUint24 | bslx.cpp:248:454:248:464 | *call to getArrayInt32 | +| bslx.cpp:248:429:248:440 | *call to getArrayUint24 | bslx.cpp:248:455:248:458 | getArrayInt32 output argument | +| bslx.cpp:248:454:248:464 | *call to getArrayInt32 | bslx.cpp:248:479:248:490 | *call to getArrayUint32 | +| bslx.cpp:248:454:248:464 | *call to getArrayInt32 | bslx.cpp:248:480:248:484 | getArrayUint32 output argument | +| bslx.cpp:248:479:248:490 | *call to getArrayUint32 | bslx.cpp:248:504:248:515 | *call to getArrayInt40 | +| bslx.cpp:248:479:248:490 | *call to getArrayUint32 | bslx.cpp:248:505:248:509 | getArrayInt40 output argument | +| bslx.cpp:248:504:248:515 | *call to getArrayInt40 | bslx.cpp:248:530:248:542 | *call to getArrayUint40 | +| bslx.cpp:248:504:248:515 | *call to getArrayInt40 | bslx.cpp:248:531:248:536 | getArrayUint40 output argument | +| bslx.cpp:248:530:248:542 | *call to getArrayUint40 | bslx.cpp:248:556:248:567 | *call to getArrayInt48 | +| bslx.cpp:248:530:248:542 | *call to getArrayUint40 | bslx.cpp:248:557:248:561 | getArrayInt48 output argument | +| bslx.cpp:248:556:248:567 | *call to getArrayInt48 | bslx.cpp:248:582:248:594 | *call to getArrayUint48 | +| bslx.cpp:248:556:248:567 | *call to getArrayInt48 | bslx.cpp:248:583:248:588 | getArrayUint48 output argument | +| bslx.cpp:248:582:248:594 | *call to getArrayUint48 | bslx.cpp:248:608:248:619 | *call to getArrayInt56 | +| bslx.cpp:248:582:248:594 | *call to getArrayUint48 | bslx.cpp:248:609:248:613 | getArrayInt56 output argument | +| bslx.cpp:248:608:248:619 | *call to getArrayInt56 | bslx.cpp:248:634:248:646 | *call to getArrayUint56 | +| bslx.cpp:248:608:248:619 | *call to getArrayInt56 | bslx.cpp:248:635:248:640 | getArrayUint56 output argument | +| bslx.cpp:248:634:248:646 | *call to getArrayUint56 | bslx.cpp:248:660:248:671 | *call to getArrayInt64 | +| bslx.cpp:248:634:248:646 | *call to getArrayUint56 | bslx.cpp:248:661:248:665 | getArrayInt64 output argument | +| bslx.cpp:248:660:248:671 | *call to getArrayInt64 | bslx.cpp:248:686:248:698 | *call to getArrayUint64 | +| bslx.cpp:248:660:248:671 | *call to getArrayInt64 | bslx.cpp:248:687:248:692 | getArrayUint64 output argument | +| bslx.cpp:248:686:248:698 | *call to getArrayUint64 | bslx.cpp:248:714:248:724 | *call to getArrayFloat32 | +| bslx.cpp:248:686:248:698 | *call to getArrayUint64 | bslx.cpp:248:715:248:718 | getArrayFloat32 output argument | +| bslx.cpp:248:714:248:724 | *call to getArrayFloat32 | bslx.cpp:248:740:248:750 | *call to getArrayFloat64 | +| bslx.cpp:248:714:248:724 | *call to getArrayFloat32 | bslx.cpp:248:741:248:744 | getArrayFloat64 output argument | | test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | | test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | | test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body |