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..550e37954221 --- /dev/null +++ b/cpp/ql/lib/ext/bslx.model.yml @@ -0,0 +1,145 @@ +# 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 string/array output buffer. + # Scalar getters (getLength, getVersion, getInt*, getUint*, getFloat*) are deliberately + # not modeled as outputs: most queries sanitize taint through integers, so such rows + # would add nothing. Their fluent `ReturnValue[*]` rows below are still modeled. + - ["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 string/array output buffer. + # Scalar getters (getLength, getVersion, getInt*, getUint*, getFloat*) are deliberately + # not modeled as outputs: most queries sanitize taint through integers, so such rows + # would add nothing. Their fluent `ReturnValue[*]` rows below are still modeled. + - ["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..fa3599e239c1 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/bslx.cpp @@ -0,0 +1,258 @@ + +// --- 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_no_flow() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + int x = 0; + stream.getInt32(x); + sink(x); // no flow: scalar outputs are deliberately not modeled +} + +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; + bsl::string out; + stream.getInt32(a).getString(out); + sink(*out.data()); // $ ir +} + +void test_ByteInStream_reset() { + BloombergLP::bslx::ByteInStream stream; + std::string data = std::string(source()); + stream.reset(data.data(), data.size()); + bsl::string out; + stream.getString(out); + sink(*out.data()); // $ ir +} + +void test_GenericInStream_flow() { + std::string data = std::string(source()); + MyStreamBuf *sb = (MyStreamBuf *)data.data(); + BloombergLP::bslx::GenericInStream stream(sb); + bsl::string out; + stream.getString(out); + sink(*out.data()); // $ ir +} + +void test_GenericInStream_getInt32_no_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); // no flow: scalar outputs are deliberately not modeled +} + +void test_bdexStreamIn() { + std::string data = std::string(source()); + BloombergLP::bslx::ByteInStream stream(data.data(), data.size()); + bsl::string obj; + BloombergLP::bslx::InStreamFunctions::bdexStreamIn(stream, obj); + sink(*obj.data()); // $ 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 ee6d7539cc0a..4558593f1e38 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -102,23 +102,31 @@ models | 101 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (Blob *,int,const char *,int); ; Argument[*2]; Argument[*0]; taint; manual | | 102 | Summary: BloombergLP::bdlbb; BlobUtil; true; copy; (char *,const Blob &,int,int); ; Argument[*1]; Argument[*0]; taint; manual | | 103 | Summary: BloombergLP::bdlbb; BlobUtil; true; getContiguousRangeOrCopy; ; ; Argument[*1]; ReturnValue[*]; taint; manual | -| 104 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1..2]; ReturnValue; taint; manual | -| 105 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | -| 106 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1..2]; ReturnValue; taint; manual | -| 107 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | -| 108 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1..2]; ReturnValue; taint; manual | -| 109 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | -| 110 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1..2]; ReturnValue; taint; manual | -| 111 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | -| 112 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0..1]; ReturnValue; taint; manual | -| 113 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | -| 114 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0..1]; ReturnValue; taint; manual | -| 115 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | -| 116 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0..1]; ReturnValue; taint; manual | -| 117 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | -| 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | -| 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | -| 120 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 104 | Summary: BloombergLP::bslx::InStreamFunctions; ; false; bdexStreamIn; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 105 | Summary: BloombergLP::bslx; ByteInStream; true; ByteInStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 106 | Summary: BloombergLP::bslx; ByteInStream; true; getArrayInt8; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 107 | Summary: BloombergLP::bslx; ByteInStream; true; getInt32; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 108 | Summary: BloombergLP::bslx; ByteInStream; true; getString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 109 | Summary: BloombergLP::bslx; ByteInStream; true; reset; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 110 | Summary: BloombergLP::bslx; GenericInStream; true; GenericInStream; ; ; Argument[*0]; Argument[-1]; taint; manual | +| 111 | Summary: BloombergLP::bslx; GenericInStream; true; getString; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 112 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 113 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 114 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags); ; Argument[*1..2]; ReturnValue; taint; manual | +| 115 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,const string &,const string &,flags,error_code &); ; Argument[*1..2]; ReturnValue; taint; manual | +| 116 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view); ; Argument[1..2]; ReturnValue; taint; manual | +| 117 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | +| 118 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags); ; Argument[1..2]; ReturnValue; taint; manual | +| 119 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const InternetProtocol &,string_view,string_view,flags,error_code &); ; Argument[1..2]; ReturnValue; taint; manual | +| 120 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 121 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 122 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags); ; Argument[*0..1]; ReturnValue; taint; manual | +| 123 | Summary: boost::asio::ip; basic_resolver; false; resolve; (const string &,const string &,flags,error_code &); ; Argument[*0..1]; ReturnValue; taint; manual | +| 124 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view); ; Argument[0..1]; ReturnValue; taint; manual | +| 125 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | +| 126 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags); ; Argument[0..1]; ReturnValue; taint; manual | +| 127 | Summary: boost::asio::ip; basic_resolver; false; resolve; (string_view,string_view,flags,error_code &); ; Argument[0..1]; ReturnValue; taint; manual | +| 128 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:133:7:133:17 | recv_buffer | provenance | Src:MaD:56 | | asio_streams.cpp:129:34:129:44 | read_until output argument | asio_streams.cpp:135:29:135:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | @@ -127,7 +135,7 @@ edges | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | | | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:143:7:143:17 | send_buffer | provenance | | | asio_streams.cpp:142:44:142:62 | call to buffer | asio_streams.cpp:145:29:145:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:120 | +| asio_streams.cpp:142:64:142:71 | *send_str | asio_streams.cpp:142:44:142:62 | call to buffer | provenance | MaD:128 | | asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:161:24:161:27 | *host | provenance | TaintFunction | | asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:162:24:162:27 | *host | provenance | TaintFunction | | asio_streams.cpp:156:19:156:26 | call to source | asio_streams.cpp:163:24:163:27 | *host | provenance | TaintFunction | @@ -144,22 +152,22 @@ edges | asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:177:34:177:42 | host_view | provenance | TaintFunction | | asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:178:34:178:42 | host_view | provenance | TaintFunction | | asio_streams.cpp:158:29:158:36 | call to source | asio_streams.cpp:179:34:179:42 | host_view | provenance | TaintFunction | -| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:112 | -| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | provenance | MaD:113 | -| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:114 | -| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:115 | -| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:116 | -| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | provenance | MaD:117 | -| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | provenance | MaD:118 | -| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | provenance | MaD:119 | -| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | provenance | MaD:104 | -| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | provenance | MaD:105 | -| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | provenance | MaD:106 | -| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | provenance | MaD:107 | -| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | provenance | MaD:108 | -| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:109 | -| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:110 | -| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:161:24:161:27 | *host | asio_streams.cpp:161:16:161:22 | call to resolve | provenance | MaD:120 | +| asio_streams.cpp:162:24:162:27 | *host | asio_streams.cpp:162:16:162:22 | call to resolve | provenance | MaD:121 | +| asio_streams.cpp:163:24:163:27 | *host | asio_streams.cpp:163:16:163:22 | call to resolve | provenance | MaD:122 | +| asio_streams.cpp:164:24:164:27 | *host | asio_streams.cpp:164:16:164:22 | call to resolve | provenance | MaD:123 | +| asio_streams.cpp:166:24:166:32 | host_view | asio_streams.cpp:166:16:166:22 | call to resolve | provenance | MaD:124 | +| asio_streams.cpp:167:24:167:32 | host_view | asio_streams.cpp:167:16:167:22 | call to resolve | provenance | MaD:125 | +| asio_streams.cpp:168:24:168:32 | host_view | asio_streams.cpp:168:16:168:22 | call to resolve | provenance | MaD:126 | +| asio_streams.cpp:169:24:169:32 | host_view | asio_streams.cpp:169:16:169:22 | call to resolve | provenance | MaD:127 | +| asio_streams.cpp:171:34:171:37 | *host | asio_streams.cpp:171:16:171:22 | call to resolve | provenance | MaD:112 | +| asio_streams.cpp:172:34:172:37 | *host | asio_streams.cpp:172:16:172:22 | call to resolve | provenance | MaD:113 | +| asio_streams.cpp:173:34:173:37 | *host | asio_streams.cpp:173:16:173:22 | call to resolve | provenance | MaD:114 | +| asio_streams.cpp:174:34:174:37 | *host | asio_streams.cpp:174:16:174:22 | call to resolve | provenance | MaD:115 | +| asio_streams.cpp:176:34:176:42 | host_view | asio_streams.cpp:176:16:176:22 | call to resolve | provenance | MaD:116 | +| asio_streams.cpp:177:34:177:42 | host_view | asio_streams.cpp:177:16:177:22 | call to resolve | provenance | MaD:117 | +| asio_streams.cpp:178:34:178:42 | host_view | asio_streams.cpp:178:16:178:22 | call to resolve | provenance | MaD:118 | +| asio_streams.cpp:179:34:179:42 | host_view | asio_streams.cpp:179:16:179:22 | call to resolve | provenance | MaD:119 | | asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:192:30:192:36 | *service | provenance | TaintFunction | | asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:193:30:193:36 | *service | provenance | TaintFunction | | asio_streams.cpp:188:22:188:29 | call to source | asio_streams.cpp:194:30:194:36 | *service | provenance | TaintFunction | @@ -176,22 +184,22 @@ edges | asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:208:45:208:56 | service_view | provenance | TaintFunction | | asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:209:45:209:56 | service_view | provenance | TaintFunction | | asio_streams.cpp:190:32:190:39 | call to source | asio_streams.cpp:210:45:210:56 | service_view | provenance | TaintFunction | -| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:112 | -| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | provenance | MaD:113 | -| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:114 | -| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:115 | -| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:116 | -| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | provenance | MaD:117 | -| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | provenance | MaD:118 | -| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | provenance | MaD:119 | -| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | provenance | MaD:104 | -| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | provenance | MaD:105 | -| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | provenance | MaD:106 | -| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | provenance | MaD:107 | -| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | provenance | MaD:108 | -| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | provenance | MaD:109 | -| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | provenance | MaD:110 | -| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | provenance | MaD:111 | +| asio_streams.cpp:192:30:192:36 | *service | asio_streams.cpp:192:16:192:22 | call to resolve | provenance | MaD:120 | +| asio_streams.cpp:193:30:193:36 | *service | asio_streams.cpp:193:16:193:22 | call to resolve | provenance | MaD:121 | +| asio_streams.cpp:194:30:194:36 | *service | asio_streams.cpp:194:16:194:22 | call to resolve | provenance | MaD:122 | +| asio_streams.cpp:195:30:195:36 | *service | asio_streams.cpp:195:16:195:22 | call to resolve | provenance | MaD:123 | +| asio_streams.cpp:197:35:197:46 | service_view | asio_streams.cpp:197:16:197:22 | call to resolve | provenance | MaD:124 | +| asio_streams.cpp:198:35:198:46 | service_view | asio_streams.cpp:198:16:198:22 | call to resolve | provenance | MaD:125 | +| asio_streams.cpp:199:35:199:46 | service_view | asio_streams.cpp:199:16:199:22 | call to resolve | provenance | MaD:126 | +| asio_streams.cpp:200:35:200:46 | service_view | asio_streams.cpp:200:16:200:22 | call to resolve | provenance | MaD:127 | +| asio_streams.cpp:202:40:202:46 | *service | asio_streams.cpp:202:16:202:22 | call to resolve | provenance | MaD:112 | +| asio_streams.cpp:203:40:203:46 | *service | asio_streams.cpp:203:16:203:22 | call to resolve | provenance | MaD:113 | +| asio_streams.cpp:204:40:204:46 | *service | asio_streams.cpp:204:16:204:22 | call to resolve | provenance | MaD:114 | +| asio_streams.cpp:205:40:205:46 | *service | asio_streams.cpp:205:16:205:22 | call to resolve | provenance | MaD:115 | +| asio_streams.cpp:207:45:207:56 | service_view | asio_streams.cpp:207:16:207:22 | call to resolve | provenance | MaD:116 | +| asio_streams.cpp:208:45:208:56 | service_view | asio_streams.cpp:208:16:208:22 | call to resolve | provenance | MaD:117 | +| asio_streams.cpp:209:45:209:56 | service_view | asio_streams.cpp:209:16:209:22 | call to resolve | provenance | MaD:118 | +| asio_streams.cpp:210:45:210:56 | service_view | asio_streams.cpp:210:16:210:22 | call to resolve | provenance | MaD:119 | | 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 | | @@ -263,6 +271,39 @@ edges | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | provenance | MaD:100 | | bdlbb.cpp:96:37:96:39 | copy output argument | bdlbb.cpp:97:7:97:10 | * ... | provenance | | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | provenance | MaD:102 | +| 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:105 | +| bslx.cpp:152:2:152:7 | *stream | bslx.cpp:152:22:152:24 | getArrayInt8 output argument | provenance | MaD:106 | +| 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:105 | +| bslx.cpp:160:2:160:7 | *stream | bslx.cpp:160:19:160:21 | getString output argument | provenance | MaD:108 | +| 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:105 | +| bslx.cpp:169:2:169:7 | *stream | bslx.cpp:169:17:169:20 | *call to getInt32 | provenance | MaD:107 | +| bslx.cpp:169:17:169:20 | *call to getInt32 | bslx.cpp:169:31:169:33 | getString output argument | provenance | MaD:108 | +| bslx.cpp:169:31:169:33 | getString output argument | bslx.cpp:170:7:170:17 | * ... | provenance | TaintFunction | +| 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:109 | +| bslx.cpp:178:2:178:7 | *stream | bslx.cpp:178:19:178:21 | getString output argument | provenance | MaD:108 | +| bslx.cpp:178:19:178:21 | getString output argument | bslx.cpp:179:7:179:17 | * ... | provenance | TaintFunction | +| 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:110 | +| bslx.cpp:187:2:187:7 | *stream | bslx.cpp:187:19:187:21 | getString output argument | provenance | MaD:111 | +| bslx.cpp:187:19:187:21 | getString output argument | bslx.cpp:188:7:188:17 | * ... | provenance | TaintFunction | +| bslx.cpp:201:33:201:40 | call to source | bslx.cpp:202:46:202:49 | *call to data | provenance | TaintFunction | +| bslx.cpp:202:34:202:39 | call to ByteInStream | bslx.cpp:204:53:204:58 | *stream | provenance | | +| bslx.cpp:202:46:202:49 | *call to data | bslx.cpp:202:34:202:39 | call to ByteInStream | provenance | MaD:105 | +| bslx.cpp:204:53:204:58 | *stream | bslx.cpp:204:61:204:63 | bdexStreamIn output argument | provenance | MaD:104 | +| bslx.cpp:204:61:204:63 | bdexStreamIn output argument | bslx.cpp:205:7:205:17 | * ... | provenance | TaintFunction | | 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 | @@ -765,6 +806,44 @@ nodes | bdlbb.cpp:96:37:96:39 | copy output argument | semmle.label | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | semmle.label | *dst | | bdlbb.cpp:97:7:97:10 | * ... | semmle.label | * ... | +| 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:31:169:33 | getString output argument | semmle.label | getString output argument | +| bslx.cpp:170:7:170:17 | * ... | semmle.label | * ... | +| 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:19:178:21 | getString output argument | semmle.label | getString output argument | +| bslx.cpp:179:7:179:17 | * ... | semmle.label | * ... | +| 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:19:187:21 | getString output argument | semmle.label | getString output argument | +| bslx.cpp:188:7:188:17 | * ... | semmle.label | * ... | +| bslx.cpp:201:33:201:40 | call to source | semmle.label | call to source | +| bslx.cpp:202:34:202:39 | call to ByteInStream | semmle.label | call to ByteInStream | +| bslx.cpp:202:46:202:49 | *call to data | semmle.label | *call to data | +| bslx.cpp:204:53:204:58 | *stream | semmle.label | *stream | +| bslx.cpp:204:61:204:63 | bdexStreamIn output argument | semmle.label | bdexStreamIn output argument | +| bslx.cpp:205:7:205:17 | * ... | semmle.label | * ... | | 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 04d300ecbc81..a53e7f5bdc82 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/steps.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/steps.expected @@ -82,6 +82,145 @@ | bdlbb.cpp:92:48:92:51 | *call to data | bdlbb.cpp:92:37:92:40 | copy output argument | | bdlbb.cpp:94:46:94:48 | *src | bdlbb.cpp:94:37:94:40 | copy output argument | | bdlbb.cpp:96:42:96:44 | *dst | bdlbb.cpp:96:37:96:39 | copy output argument | +| 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: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:17:169:20 | *call to getInt32 | bslx.cpp:169:30:169:35 | *call to getString | +| bslx.cpp:169:17:169:20 | *call to getInt32 | bslx.cpp:169:31:169:33 | getString 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:18:178:23 | *call to getString | +| bslx.cpp:178:2:178:7 | *stream | bslx.cpp:178:19:178:21 | getString 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:18:187:23 | *call to getString | +| bslx.cpp:187:2:187:7 | *stream | bslx.cpp:187:19:187:21 | getString output argument | +| bslx.cpp:194:57:194:58 | *sb | bslx.cpp:194:50:194:55 | call to GenericInStream | +| bslx.cpp:196:2:196:7 | *stream | bslx.cpp:196:17:196:20 | *call to getInt32 | +| bslx.cpp:202:46:202:49 | *call to data | bslx.cpp:202:34:202:39 | call to ByteInStream | +| bslx.cpp:204:53:204:58 | *stream | bslx.cpp:204:52:204:65 | *call to bdexStreamIn | +| bslx.cpp:204:53:204:58 | *stream | bslx.cpp:204:61:204:63 | bdexStreamIn output argument | +| bslx.cpp:232:2:232:7 | *stream | bslx.cpp:232:18:232:21 | *call to getLength | +| bslx.cpp:232:18:232:21 | *call to getLength | bslx.cpp:232:32:232:35 | *call to getVersion | +| bslx.cpp:232:32:232:35 | *call to getVersion | bslx.cpp:232:43:232:46 | *call to getInt8 | +| bslx.cpp:232:43:232:46 | *call to getInt8 | bslx.cpp:232:55:232:59 | *call to getUint8 | +| bslx.cpp:232:55:232:59 | *call to getUint8 | bslx.cpp:232:68:232:71 | *call to getInt16 | +| bslx.cpp:232:68:232:71 | *call to getInt16 | bslx.cpp:232:81:232:85 | *call to getUint16 | +| bslx.cpp:232:81:232:85 | *call to getUint16 | bslx.cpp:232:94:232:97 | *call to getInt24 | +| bslx.cpp:232:94:232:97 | *call to getInt24 | bslx.cpp:232:107:232:111 | *call to getUint24 | +| bslx.cpp:232:107:232:111 | *call to getUint24 | bslx.cpp:232:120:232:123 | *call to getInt32 | +| bslx.cpp:232:120:232:123 | *call to getInt32 | bslx.cpp:232:133:232:137 | *call to getUint32 | +| bslx.cpp:232:133:232:137 | *call to getUint32 | bslx.cpp:232:146:232:150 | *call to getInt40 | +| bslx.cpp:232:146:232:150 | *call to getInt40 | bslx.cpp:232:160:232:165 | *call to getUint40 | +| bslx.cpp:232:160:232:165 | *call to getUint40 | bslx.cpp:232:174:232:178 | *call to getInt48 | +| bslx.cpp:232:174:232:178 | *call to getInt48 | bslx.cpp:232:188:232:193 | *call to getUint48 | +| bslx.cpp:232:188:232:193 | *call to getUint48 | bslx.cpp:232:202:232:206 | *call to getInt56 | +| bslx.cpp:232:202:232:206 | *call to getInt56 | bslx.cpp:232:216:232:221 | *call to getUint56 | +| bslx.cpp:232:216:232:221 | *call to getUint56 | bslx.cpp:232:230:232:234 | *call to getInt64 | +| bslx.cpp:232:230:232:234 | *call to getInt64 | bslx.cpp:232:244:232:249 | *call to getUint64 | +| bslx.cpp:232:244:232:249 | *call to getUint64 | bslx.cpp:232:260:232:263 | *call to getFloat32 | +| bslx.cpp:232:260:232:263 | *call to getFloat32 | bslx.cpp:232:274:232:277 | *call to getFloat64 | +| bslx.cpp:232:274:232:277 | *call to getFloat64 | bslx.cpp:232:287:232:292 | *call to getString | +| bslx.cpp:232:274:232:277 | *call to getFloat64 | bslx.cpp:232:288:232:290 | getString output argument | +| bslx.cpp:232:287:232:292 | *call to getString | bslx.cpp:232:305:232:315 | *call to getArrayInt8 | +| bslx.cpp:232:287:232:292 | *call to getString | bslx.cpp:232:306:232:309 | getArrayInt8 output argument | +| bslx.cpp:232:305:232:315 | *call to getArrayInt8 | bslx.cpp:232:329:232:340 | *call to getArrayUint8 | +| bslx.cpp:232:305:232:315 | *call to getArrayInt8 | bslx.cpp:232:330:232:334 | getArrayUint8 output argument | +| bslx.cpp:232:329:232:340 | *call to getArrayUint8 | bslx.cpp:232:354:232:364 | *call to getArrayInt16 | +| bslx.cpp:232:329:232:340 | *call to getArrayUint8 | bslx.cpp:232:355:232:358 | getArrayInt16 output argument | +| bslx.cpp:232:354:232:364 | *call to getArrayInt16 | bslx.cpp:232:379:232:390 | *call to getArrayUint16 | +| bslx.cpp:232:354:232:364 | *call to getArrayInt16 | bslx.cpp:232:380:232:384 | getArrayUint16 output argument | +| bslx.cpp:232:379:232:390 | *call to getArrayUint16 | bslx.cpp:232:404:232:414 | *call to getArrayInt24 | +| bslx.cpp:232:379:232:390 | *call to getArrayUint16 | bslx.cpp:232:405:232:408 | getArrayInt24 output argument | +| bslx.cpp:232:404:232:414 | *call to getArrayInt24 | bslx.cpp:232:429:232:440 | *call to getArrayUint24 | +| bslx.cpp:232:404:232:414 | *call to getArrayInt24 | bslx.cpp:232:430:232:434 | getArrayUint24 output argument | +| bslx.cpp:232:429:232:440 | *call to getArrayUint24 | bslx.cpp:232:454:232:464 | *call to getArrayInt32 | +| bslx.cpp:232:429:232:440 | *call to getArrayUint24 | bslx.cpp:232:455:232:458 | getArrayInt32 output argument | +| bslx.cpp:232:454:232:464 | *call to getArrayInt32 | bslx.cpp:232:479:232:490 | *call to getArrayUint32 | +| bslx.cpp:232:454:232:464 | *call to getArrayInt32 | bslx.cpp:232:480:232:484 | getArrayUint32 output argument | +| bslx.cpp:232:479:232:490 | *call to getArrayUint32 | bslx.cpp:232:504:232:515 | *call to getArrayInt40 | +| bslx.cpp:232:479:232:490 | *call to getArrayUint32 | bslx.cpp:232:505:232:509 | getArrayInt40 output argument | +| bslx.cpp:232:504:232:515 | *call to getArrayInt40 | bslx.cpp:232:530:232:542 | *call to getArrayUint40 | +| bslx.cpp:232:504:232:515 | *call to getArrayInt40 | bslx.cpp:232:531:232:536 | getArrayUint40 output argument | +| bslx.cpp:232:530:232:542 | *call to getArrayUint40 | bslx.cpp:232:556:232:567 | *call to getArrayInt48 | +| bslx.cpp:232:530:232:542 | *call to getArrayUint40 | bslx.cpp:232:557:232:561 | getArrayInt48 output argument | +| bslx.cpp:232:556:232:567 | *call to getArrayInt48 | bslx.cpp:232:582:232:594 | *call to getArrayUint48 | +| bslx.cpp:232:556:232:567 | *call to getArrayInt48 | bslx.cpp:232:583:232:588 | getArrayUint48 output argument | +| bslx.cpp:232:582:232:594 | *call to getArrayUint48 | bslx.cpp:232:608:232:619 | *call to getArrayInt56 | +| bslx.cpp:232:582:232:594 | *call to getArrayUint48 | bslx.cpp:232:609:232:613 | getArrayInt56 output argument | +| bslx.cpp:232:608:232:619 | *call to getArrayInt56 | bslx.cpp:232:634:232:646 | *call to getArrayUint56 | +| bslx.cpp:232:608:232:619 | *call to getArrayInt56 | bslx.cpp:232:635:232:640 | getArrayUint56 output argument | +| bslx.cpp:232:634:232:646 | *call to getArrayUint56 | bslx.cpp:232:660:232:671 | *call to getArrayInt64 | +| bslx.cpp:232:634:232:646 | *call to getArrayUint56 | bslx.cpp:232:661:232:665 | getArrayInt64 output argument | +| bslx.cpp:232:660:232:671 | *call to getArrayInt64 | bslx.cpp:232:686:232:698 | *call to getArrayUint64 | +| bslx.cpp:232:660:232:671 | *call to getArrayInt64 | bslx.cpp:232:687:232:692 | getArrayUint64 output argument | +| bslx.cpp:232:686:232:698 | *call to getArrayUint64 | bslx.cpp:232:714:232:724 | *call to getArrayFloat32 | +| bslx.cpp:232:686:232:698 | *call to getArrayUint64 | bslx.cpp:232:715:232:718 | getArrayFloat32 output argument | +| bslx.cpp:232:714:232:724 | *call to getArrayFloat32 | bslx.cpp:232:740:232:750 | *call to getArrayFloat64 | +| bslx.cpp:232:714:232:724 | *call to getArrayFloat32 | bslx.cpp:232:741:232:744 | getArrayFloat64 output argument | +| bslx.cpp:257:2:257:7 | *stream | bslx.cpp:257:18:257:21 | *call to getLength | +| bslx.cpp:257:18:257:21 | *call to getLength | bslx.cpp:257:32:257:35 | *call to getVersion | +| bslx.cpp:257:32:257:35 | *call to getVersion | bslx.cpp:257:43:257:46 | *call to getInt8 | +| bslx.cpp:257:43:257:46 | *call to getInt8 | bslx.cpp:257:55:257:59 | *call to getUint8 | +| bslx.cpp:257:55:257:59 | *call to getUint8 | bslx.cpp:257:68:257:71 | *call to getInt16 | +| bslx.cpp:257:68:257:71 | *call to getInt16 | bslx.cpp:257:81:257:85 | *call to getUint16 | +| bslx.cpp:257:81:257:85 | *call to getUint16 | bslx.cpp:257:94:257:97 | *call to getInt24 | +| bslx.cpp:257:94:257:97 | *call to getInt24 | bslx.cpp:257:107:257:111 | *call to getUint24 | +| bslx.cpp:257:107:257:111 | *call to getUint24 | bslx.cpp:257:120:257:123 | *call to getInt32 | +| bslx.cpp:257:120:257:123 | *call to getInt32 | bslx.cpp:257:133:257:137 | *call to getUint32 | +| bslx.cpp:257:133:257:137 | *call to getUint32 | bslx.cpp:257:146:257:150 | *call to getInt40 | +| bslx.cpp:257:146:257:150 | *call to getInt40 | bslx.cpp:257:160:257:165 | *call to getUint40 | +| bslx.cpp:257:160:257:165 | *call to getUint40 | bslx.cpp:257:174:257:178 | *call to getInt48 | +| bslx.cpp:257:174:257:178 | *call to getInt48 | bslx.cpp:257:188:257:193 | *call to getUint48 | +| bslx.cpp:257:188:257:193 | *call to getUint48 | bslx.cpp:257:202:257:206 | *call to getInt56 | +| bslx.cpp:257:202:257:206 | *call to getInt56 | bslx.cpp:257:216:257:221 | *call to getUint56 | +| bslx.cpp:257:216:257:221 | *call to getUint56 | bslx.cpp:257:230:257:234 | *call to getInt64 | +| bslx.cpp:257:230:257:234 | *call to getInt64 | bslx.cpp:257:244:257:249 | *call to getUint64 | +| bslx.cpp:257:244:257:249 | *call to getUint64 | bslx.cpp:257:260:257:263 | *call to getFloat32 | +| bslx.cpp:257:260:257:263 | *call to getFloat32 | bslx.cpp:257:274:257:277 | *call to getFloat64 | +| bslx.cpp:257:274:257:277 | *call to getFloat64 | bslx.cpp:257:287:257:292 | *call to getString | +| bslx.cpp:257:274:257:277 | *call to getFloat64 | bslx.cpp:257:288:257:290 | getString output argument | +| bslx.cpp:257:287:257:292 | *call to getString | bslx.cpp:257:305:257:315 | *call to getArrayInt8 | +| bslx.cpp:257:287:257:292 | *call to getString | bslx.cpp:257:306:257:309 | getArrayInt8 output argument | +| bslx.cpp:257:305:257:315 | *call to getArrayInt8 | bslx.cpp:257:329:257:340 | *call to getArrayUint8 | +| bslx.cpp:257:305:257:315 | *call to getArrayInt8 | bslx.cpp:257:330:257:334 | getArrayUint8 output argument | +| bslx.cpp:257:329:257:340 | *call to getArrayUint8 | bslx.cpp:257:354:257:364 | *call to getArrayInt16 | +| bslx.cpp:257:329:257:340 | *call to getArrayUint8 | bslx.cpp:257:355:257:358 | getArrayInt16 output argument | +| bslx.cpp:257:354:257:364 | *call to getArrayInt16 | bslx.cpp:257:379:257:390 | *call to getArrayUint16 | +| bslx.cpp:257:354:257:364 | *call to getArrayInt16 | bslx.cpp:257:380:257:384 | getArrayUint16 output argument | +| bslx.cpp:257:379:257:390 | *call to getArrayUint16 | bslx.cpp:257:404:257:414 | *call to getArrayInt24 | +| bslx.cpp:257:379:257:390 | *call to getArrayUint16 | bslx.cpp:257:405:257:408 | getArrayInt24 output argument | +| bslx.cpp:257:404:257:414 | *call to getArrayInt24 | bslx.cpp:257:429:257:440 | *call to getArrayUint24 | +| bslx.cpp:257:404:257:414 | *call to getArrayInt24 | bslx.cpp:257:430:257:434 | getArrayUint24 output argument | +| bslx.cpp:257:429:257:440 | *call to getArrayUint24 | bslx.cpp:257:454:257:464 | *call to getArrayInt32 | +| bslx.cpp:257:429:257:440 | *call to getArrayUint24 | bslx.cpp:257:455:257:458 | getArrayInt32 output argument | +| bslx.cpp:257:454:257:464 | *call to getArrayInt32 | bslx.cpp:257:479:257:490 | *call to getArrayUint32 | +| bslx.cpp:257:454:257:464 | *call to getArrayInt32 | bslx.cpp:257:480:257:484 | getArrayUint32 output argument | +| bslx.cpp:257:479:257:490 | *call to getArrayUint32 | bslx.cpp:257:504:257:515 | *call to getArrayInt40 | +| bslx.cpp:257:479:257:490 | *call to getArrayUint32 | bslx.cpp:257:505:257:509 | getArrayInt40 output argument | +| bslx.cpp:257:504:257:515 | *call to getArrayInt40 | bslx.cpp:257:530:257:542 | *call to getArrayUint40 | +| bslx.cpp:257:504:257:515 | *call to getArrayInt40 | bslx.cpp:257:531:257:536 | getArrayUint40 output argument | +| bslx.cpp:257:530:257:542 | *call to getArrayUint40 | bslx.cpp:257:556:257:567 | *call to getArrayInt48 | +| bslx.cpp:257:530:257:542 | *call to getArrayUint40 | bslx.cpp:257:557:257:561 | getArrayInt48 output argument | +| bslx.cpp:257:556:257:567 | *call to getArrayInt48 | bslx.cpp:257:582:257:594 | *call to getArrayUint48 | +| bslx.cpp:257:556:257:567 | *call to getArrayInt48 | bslx.cpp:257:583:257:588 | getArrayUint48 output argument | +| bslx.cpp:257:582:257:594 | *call to getArrayUint48 | bslx.cpp:257:608:257:619 | *call to getArrayInt56 | +| bslx.cpp:257:582:257:594 | *call to getArrayUint48 | bslx.cpp:257:609:257:613 | getArrayInt56 output argument | +| bslx.cpp:257:608:257:619 | *call to getArrayInt56 | bslx.cpp:257:634:257:646 | *call to getArrayUint56 | +| bslx.cpp:257:608:257:619 | *call to getArrayInt56 | bslx.cpp:257:635:257:640 | getArrayUint56 output argument | +| bslx.cpp:257:634:257:646 | *call to getArrayUint56 | bslx.cpp:257:660:257:671 | *call to getArrayInt64 | +| bslx.cpp:257:634:257:646 | *call to getArrayUint56 | bslx.cpp:257:661:257:665 | getArrayInt64 output argument | +| bslx.cpp:257:660:257:671 | *call to getArrayInt64 | bslx.cpp:257:686:257:698 | *call to getArrayUint64 | +| bslx.cpp:257:660:257:671 | *call to getArrayInt64 | bslx.cpp:257:687:257:692 | getArrayUint64 output argument | +| bslx.cpp:257:686:257:698 | *call to getArrayUint64 | bslx.cpp:257:714:257:724 | *call to getArrayFloat32 | +| bslx.cpp:257:686:257:698 | *call to getArrayUint64 | bslx.cpp:257:715:257:718 | getArrayFloat32 output argument | +| bslx.cpp:257:714:257:724 | *call to getArrayFloat32 | bslx.cpp:257:740:257:750 | *call to getArrayFloat64 | +| bslx.cpp:257:714:257:724 | *call to getArrayFloat32 | bslx.cpp:257:741:257: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 |