Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit dbf0b98

Browse files
committed
C++: Add some test cases involving function pointers.
1 parent f649939 commit dbf0b98

3 files changed

Lines changed: 41 additions & 1 deletion

File tree

cpp/ql/test/library-tests/dataflow/models-as-data/FlowSummaryNode.expected

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,15 @@
1212
| tests.cpp:181:6:181:20 | [summary] to write: ReturnValue in madSelfToReturn | ReturnNode | madSelfToReturn | madSelfToReturn |
1313
| tests.cpp:209:7:209:30 | [summary param] this in namespaceMadSelfToReturn | ParameterNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn |
1414
| tests.cpp:209:7:209:30 | [summary] to write: ReturnValue in namespaceMadSelfToReturn | ReturnNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn |
15+
| tests.cpp:285:5:285:29 | [summary param] 0 in madCallArg0ReturnToReturn | ParameterNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn |
16+
| tests.cpp:285:5:285:29 | [summary] read: Argument[0].Parameter[this] in madCallArg0ReturnToReturn | | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn |
17+
| tests.cpp:285:5:285:29 | [summary] read: Argument[0].ReturnValue in madCallArg0ReturnToReturn | | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn |
18+
| tests.cpp:285:5:285:29 | [summary] to write: Argument[0].Parameter[this] in madCallArg0ReturnToReturn | ArgumentNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn |
19+
| tests.cpp:285:5:285:29 | [summary] to write: ReturnValue in madCallArg0ReturnToReturn | ReturnNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn |
20+
| tests.cpp:287:6:287:25 | [summary param] 0 in madCallArg0WithValue | ParameterNode | madCallArg0WithValue | madCallArg0WithValue |
21+
| tests.cpp:287:6:287:25 | [summary param] 1 in madCallArg0WithValue | ParameterNode | madCallArg0WithValue | madCallArg0WithValue |
22+
| tests.cpp:287:6:287:25 | [summary] read: Argument[0].Parameter[0] in madCallArg0WithValue | | madCallArg0WithValue | madCallArg0WithValue |
23+
| tests.cpp:287:6:287:25 | [summary] read: Argument[0].Parameter[this] in madCallArg0WithValue | | madCallArg0WithValue | madCallArg0WithValue |
24+
| tests.cpp:287:6:287:25 | [summary] to write: Argument[0].Parameter[0] in madCallArg0WithValue | ArgumentNode | madCallArg0WithValue | madCallArg0WithValue |
25+
| tests.cpp:287:6:287:25 | [summary] to write: Argument[0].Parameter[this] in madCallArg0WithValue | ArgumentNode | madCallArg0WithValue | madCallArg0WithValue |
26+
| tests.cpp:287:6:287:25 | [summary] to write: Argument[1] in madCallArg0WithValue | | madCallArg0WithValue | madCallArg0WithValue |

cpp/ql/test/library-tests/dataflow/models-as-data/testModels.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ private class TestSummaries extends SummaryModelCsv {
7171
";MyClass;true;madArg0ToField;;;Argument[0];Argument[-1].val;taint",
7272
";MyClass;true;madFieldToReturn;;;Argument[-1].val;ReturnValue;taint",
7373
"MyNamespace;MyClass;true;namespaceMadSelfToReturn;;;Argument[-1];ReturnValue;taint",
74+
";;false;madCallArg0ReturnToReturn;;;Argument[0].ReturnValue;ReturnValue;value",
75+
";;false;madCallArg0ReturnToReturnFirst;;;Argument[0].ReturnValue;ReturnValue.first;value",
76+
";;false;madCallArg0WithValue;;;Argument[1];Argument[0].Parameter[0];value",
7477
]
7578
}
7679
}

cpp/ql/test/library-tests/dataflow/models-as-data/tests.cpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void madSinkParam0(int x) { // $ interpretElement
106106
x = source(); // $ MISSING: ir
107107
}
108108

109-
// --- MAD summaries ---
109+
// --- global MAD summaries ---
110110

111111
struct MyContainer {
112112
int value;
@@ -274,3 +274,28 @@ void test_class_members() {
274274
mc6.madArg0ToField(source());
275275
sink(mc6.madFieldToReturn()); // $ MISSING: ir
276276
}
277+
278+
// --- MAD cases involving function pointers ---
279+
280+
struct intPair {
281+
int first;
282+
int second;
283+
};
284+
285+
int madCallArg0ReturnToReturn(int (*fun_ptr)()); // $ interpretElement
286+
intPair madCallArg0ReturnToReturnFirst(int (*fun_ptr)()); // $ interpretElement
287+
void madCallArg0WithValue(void (*fun_ptr)(int), int value); // $ interpretElement
288+
289+
int getTainted() { return source(); }
290+
void useValue(int x) { sink(x); }
291+
292+
void test_function_pointers() {
293+
sink(madCallArg0ReturnToReturn(&notASource));
294+
sink(madCallArg0ReturnToReturn(&getTainted)); // $ MISSING: ir
295+
sink(madCallArg0ReturnToReturn(&source)); // $ MISSING: ir
296+
sink(madCallArg0ReturnToReturnFirst(&source).first); // $ MISSING: ir
297+
sink(madCallArg0ReturnToReturnFirst(&source).second);
298+
madCallArg0WithValue(&useValue, 0);
299+
madCallArg0WithValue(&useValue, source()); // $ MISSING: ir
300+
madCallArg0WithValue(&sink, source()); // $ MISSING: ir
301+
}

0 commit comments

Comments
 (0)