From 03c3ef9528ab60a62fd987de02ea6ff444c227de Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 23 Jun 2026 19:47:13 +0100 Subject: [PATCH] C++: Add tests with missing reverse flow. --- .../dataflow/external-models/flow.ext.yml | 5 +++- .../dataflow/external-models/sinks.expected | 2 ++ .../dataflow/external-models/sources.expected | 2 ++ .../dataflow/external-models/test.cpp | 24 +++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 76d649152bd..92c76ca2566 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -21,4 +21,7 @@ extensions: - ["", "", False, "callWithNonTypeTemplate", "(const T &)", "", "Argument[*0]", "ReturnValue", "value", "manual"] - ["", "TemplateClass1", False, "templateFunction", "(T,U)", "", "Argument[0]", "ReturnValue", "value", "manual"] - ["", "TemplateClass1", True, "templateFunction2", "(U,V)", "", "Argument[1]", "ReturnValue", "value", "manual"] - - ["", "TemplateClass2", True, "function", "(U,T)", "", "Argument[1]", "ReturnValue", "value", "manual"] \ No newline at end of file + - ["", "TemplateClass2", True, "function", "(U,T)", "", "Argument[1]", "ReturnValue", "value", "manual"] + - ["", "ReverseFlow", True, "get_ptr", "", "", "ReturnValue[*]", "Argument[-1].Field[value]", "value", "manual"] + - ["", "MyString", True, "operator[]", "", "", "ReturnValue[*]", "Argument[-1]", "taint", "manual"] + - ["", "MyString", True, "operator[]", "", "", "Argument[-1]", "ReturnValue[*]", "taint", "manual"] \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 03a0d442c1c..98b0eff8757 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -19,3 +19,5 @@ | test.cpp:149:10:149:10 | z | test-sink | | test.cpp:158:10:158:10 | z | test-sink | | test.cpp:173:10:173:10 | y | test-sink | +| test.cpp:190:11:190:11 | x | test-sink | +| test.cpp:196:11:196:11 | c | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 4040cff4fd2..6b6c05e989b 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -13,6 +13,8 @@ | test.cpp:146:10:146:18 | call to ymlSource | local | | test.cpp:155:10:155:18 | call to ymlSource | local | | test.cpp:170:10:170:18 | call to ymlSource | local | +| test.cpp:188:18:188:26 | call to ymlSource | local | +| test.cpp:194:10:194:20 | call to ymlSource | local | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 01bf6cc4093..3d572cd0920 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -171,4 +171,28 @@ void test_class1() { Class1 c; auto y = c.templateFunction3(0UL, x); ymlSink(y); // $ ir +} + +struct ReverseFlow { + int value; + int& get_ptr(); +}; + +struct MyString { + char& operator[](unsigned); +}; + +void test_reverse_flow(unsigned i, unsigned j) { + { + ReverseFlow rf; + rf.get_ptr() = ymlSource(); + int x = rf.value; + ymlSink(x); // $ MISSING: ir + } + { + MyString s; + s[i] = ymlSource(); + char c = s[j]; + ymlSink(c); // $ MISSING: ir + } } \ No newline at end of file