From 9b2019db6b3507d66226e896ba53974bbab27a10 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 16 Feb 2024 13:10:41 +0100 Subject: [PATCH] C++: Accept test changes. --- cpp/ql/test/include/iterator.h | 4 +- .../dataflow/dataflow-tests/BarrierGuard.cpp | 2 +- .../dataflow/dataflow-tests/clang.cpp | 2 +- .../dataflow/dataflow-tests/dispatch.cpp | 12 ++-- .../dataflow/dataflow-tests/example.c | 2 +- .../dataflow/dataflow-tests/flowOut.cpp | 36 ++++++------ .../dataflow/dataflow-tests/lambdas.cpp | 2 +- .../dataflow/dataflow-tests/ref.cpp | 14 ++--- .../dataflow-tests/self_parameter_flow.cpp | 4 +- .../dataflow-tests/test-source-sink.expected | 1 + .../dataflow/dataflow-tests/test.cpp | 24 ++++---- .../dataflow/fields/ir-path-flow.expected | 57 +++++++++++++++++++ .../dataflow/taint-tests/taint.cpp | 2 +- 13 files changed, 110 insertions(+), 52 deletions(-) diff --git a/cpp/ql/test/include/iterator.h b/cpp/ql/test/include/iterator.h index 77758bfa8da..5cd7f231284 100644 --- a/cpp/ql/test/include/iterator.h +++ b/cpp/ql/test/include/iterator.h @@ -65,7 +65,7 @@ namespace std { }; template - constexpr back_insert_iterator back_inserter(Container& x) { + constexpr back_insert_iterator back_inserter(Container& x) { // $ ir-def=*x return back_insert_iterator(x); } @@ -89,7 +89,7 @@ namespace std { constexpr front_insert_iterator operator++(int); }; template - constexpr front_insert_iterator front_inserter(Container& x) { + constexpr front_insert_iterator front_inserter(Container& x) { // $ ir-def=*x return front_insert_iterator(x); } } diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp index 74cc86e5c14..0e9c9f1bc77 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp @@ -56,7 +56,7 @@ void bg_stackstruct(XY s1, XY s2) { } } -void bg_structptr(XY *p1, XY *p2) { // $ ast-def=p1 ast-def=p2 +void bg_structptr(XY *p1, XY *p2) { // $ ast-def=p1 ast-def=p2 ir-def=*p1 ir-def=*p2 p1->x = source(); if (guarded(p1->x)) { sink(p1->x); // $ SPURIOUS: ast diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp index 499e8b8a62b..7b4759ec0bf 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/clang.cpp @@ -8,7 +8,7 @@ struct twoIntFields { int getFirst() { return m1; } }; -void following_pointers( // $ ast-def=sourceStruct1_ptr +void following_pointers( // $ ast-def=sourceStruct1_ptr ir-def=*cleanArray1 ir-def=*sourceArray1 ir-def=*sourceStruct1_ptr int sourceArray1[], int cleanArray1[], twoIntFields sourceStruct1, diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp index ff22b0d12b7..105212ccca6 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp @@ -25,7 +25,7 @@ struct Bottom : Middle { void notSink(int x) override { } }; -void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef +void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef ir-def=*bottomPtr ir-def=*bottomRef Top *topPtr = bottomPtr, &topRef = bottomRef; sink(topPtr->isSource1()); // $ ir MISSING: ast @@ -65,11 +65,11 @@ Top *allocateBottom() { return new Bottom(); } -void callSinkByPointer(Top *top) { // $ ast-def=top +void callSinkByPointer(Top *top) { // $ ast-def=top ir-def=*top top->isSink(source()); // leads to MISSING from ast } -void callSinkByReference(Top &top) { // $ ast-def=top +void callSinkByReference(Top &top) { // $ ast-def=top ir-def=*top top.isSink(source()); // leads to MISSING from ast } @@ -81,11 +81,11 @@ void globalVirtualDispatch() { x->isSink(source()); // $ MISSING: ast,ir } -Top *identity(Top *top) { // $ ast-def=top +Top *identity(Top *top) { // $ ast-def=top ir-def=*top return top; } -void callIdentityFunctions(Top *top, Bottom *bottom) { // $ ast-def=bottom ast-def=top +void callIdentityFunctions(Top *top, Bottom *bottom) { // $ ast-def=bottom ast-def=top ir-def=*bottom ir-def=*top identity(bottom)->isSink(source()); // $ MISSING: ast,ir identity(top)->isSink(source()); // no flow } @@ -120,7 +120,7 @@ namespace virtual_inheritance { struct Bottom : Middle { }; - void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef + void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottomPtr ast-def=bottomRef ir-def=*bottomPtr ir-def=*bottomRef // Because the inheritance from `Top` is virtual, the following casts go // directly from `Bottom` to `Top`, skipping `Middle`. That means we don't // get flow from a `Middle` value to the call qualifier. diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c b/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c index ad01145cde7..6e80ec61972 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/example.c @@ -12,7 +12,7 @@ typedef struct char isTrue; } MyBool; -void myTest_with_local_flow(MyBool *b, int pos) // $ ast-def=b +void myTest_with_local_flow(MyBool *b, int pos) // $ ast-def=b ir-def=*b { MyCoords coords = {0}; diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp index 826fc542503..d6a06361524 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/flowOut.cpp @@ -7,7 +7,7 @@ void source_ref(int *toTaint) { // $ ir-def=*toTaint ast-def=toTaint void source_ref(char *toTaint) { // $ ir-def=*toTaint ast-def=toTaint *toTaint = source(); } -void modify_copy(int* ptr) { // $ ast-def=ptr +void modify_copy(int* ptr) { // $ ast-def=ptr ir-def=*ptr int deref = *ptr; int* other = &deref; source_ref(other); @@ -19,7 +19,7 @@ void test_output_copy() { sink(x); // clean } -void modify(int* ptr) { // $ ast-def=ptr +void modify(int* ptr) { // $ ast-def=ptr ir-def=*ptr int* deref = ptr; int* other = &*deref; source_ref(other); @@ -31,7 +31,7 @@ void test_output() { sink(x); // $ ir MISSING: ast } -void modify_copy_of_pointer(int* p, unsigned len) { // $ ast-def=p +void modify_copy_of_pointer(int* p, unsigned len) { // $ ast-def=p ir-def=*p int* p2 = new int[len]; for(unsigned i = 0; i < len; ++i) { p2[i] = p[i]; @@ -46,7 +46,7 @@ void test_modify_copy_of_pointer() { sink(x[0]); // $ SPURIOUS: ast // clean } -void modify_pointer(int* p, unsigned len) { // $ ast-def=p +void modify_pointer(int* p, unsigned len) { // $ ast-def=p ir-def=*p int** p2 = &p; for(unsigned i = 0; i < len; ++i) { *p2[i] = p[i]; @@ -63,17 +63,17 @@ void test_modify_of_pointer() { char* strdup(const char* p); -void modify_copy_via_strdup(char* p) { // $ ast-def=p +void modify_copy_via_strdup(char* p) { // $ ast-def=p ir-def=*p char* p2 = strdup(p); source_ref(p2); } -void test_modify_copy_via_strdup(char* p) { // $ ast-def=p +void test_modify_copy_via_strdup(char* p) { // $ ast-def=p ir-def=*p modify_copy_via_strdup(p); sink(*p); // clean } -int* deref(int** p) { // $ ast-def=p +int* deref(int** p) { // $ ast-def=p ir-def=*p ir-def=**p int* q = *p; return q; } @@ -90,7 +90,7 @@ void addtaint1(int* q) { // $ ast-def=q ir-def=*q *q = source(); } -void addtaint2(int** p) { // $ ast-def=p +void addtaint2(int** p) { // $ ast-def=p ir-def=*p ir-def=**p int* q = *p; addtaint1(q); } @@ -106,13 +106,13 @@ using size_t = decltype(sizeof(int)); void* memcpy(void* dest, const void* src, size_t); -void modify_copy_via_memcpy(char* p) { // $ ast-def=p +void modify_copy_via_memcpy(char* p) { // $ ast-def=p ir-def=*p char* dest; char* p2 = (char*)memcpy(dest, p, 10); source_ref(p2); } -void test_modify_copy_via_memcpy(char* p) { // $ ast-def=p +void test_modify_copy_via_memcpy(char* p) { // $ ast-def=p ir-def=*p modify_copy_via_memcpy(p); sink(*p); // clean } @@ -134,14 +134,14 @@ void source_ref_ref(char** toTaint) { // $ ast-def=toTaint ir-def=*toTaint ir-de // This function copies the value of **p into a new location **p2 and then // taints **p. Thus, **p does not contain tainted data after returning from // this function. -void modify_copy_via_strdup_ptr_001(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_001(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2 char** p2 = strdup_ptr_001(p); // source -> **p2 source_ref_ref(p2); } -void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_001(p); sink(**p); // clean } @@ -149,14 +149,14 @@ void test_modify_copy_via_strdup_001(char** p) { // $ ast-def=p // This function copies the value of *p into a new location *p2 and then // taints **p2. Thus, **p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_011(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_011(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2 and *p -> *p2 char** p2 = strdup_ptr_011(p); // source -> **p2 source_ref_ref(p2); } -void test_modify_copy_via_strdup_011(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_011(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_011(p); sink(**p); // $ ir MISSING: ast } @@ -171,7 +171,7 @@ void source_ref_2(char** toTaint) { // $ ast-def=toTaint ir-def=*toTaint ir-def= // This function copies the value of p into a new location p2 and then // taints *p2. Thus, *p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2, *p -> *p2, and p -> p2 char** p2 = strdup_ptr_111(p); // source -> *p2 @@ -180,7 +180,7 @@ void modify_copy_via_strdup_ptr_111_taint_ind(char** p) { // $ ast-def=p void sink(char*); -void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_111_taint_ind(p); sink(*p); // $ ir MISSING: ast } @@ -188,7 +188,7 @@ void test_modify_copy_via_strdup_111_taint_ind(char** p) { // $ ast-def=p // This function copies the value of p into a new location p2 and then // taints **p2. Thus, **p contains tainted data after returning from this // function. -void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p +void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p // **p -> **p2, *p -> *p2, and p -> p2 char** p2 = strdup_ptr_111(p); // source -> **p2 @@ -197,7 +197,7 @@ void modify_copy_via_strdup_ptr_111_taint_ind_ind(char** p) { // $ ast-def=p void sink(char*); -void test_modify_copy_via_strdup_111_taint_ind_ind(char** p) { // $ ast-def=p +void test_modify_copy_via_strdup_111_taint_ind_ind(char** p) { // $ ast-def=p ir-def=*p ir-def=**p modify_copy_via_strdup_ptr_111_taint_ind_ind(p); sink(**p); // $ ir MISSING: ast } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp index 645c41896c4..d0687994b45 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/lambdas.cpp @@ -37,7 +37,7 @@ void test_lambdas() }; d(t, u); - auto e = [](int &a, int &b, int &c) { // $ ast-def=a ast-def=b ast-def=c ir-def=*c + auto e = [](int &a, int &b, int &c) { // $ ast-def=a ast-def=b ast-def=c ir-def=*c ir-def=*a ir-def=*b sink(a); // $ ast,ir sink(b); c = source(); diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp index 1fda792dd26..3f8d77a7b2b 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/ref.cpp @@ -12,7 +12,7 @@ namespace withoutFields { } template - void assignWrapper(T &lhs, T rhs) { // $ ast-def=lhs ast-def=lhs + void assignWrapper(T &lhs, T rhs) { // $ ast-def=lhs ast-def=lhs ir-def=*lhs assign(lhs, rhs); } @@ -71,15 +71,15 @@ namespace withFields { int val; }; - void assign(Int &lhs, int rhs) { // $ ast-def=lhs + void assign(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs lhs.val = rhs; } - void assignWrapper(Int &lhs, int rhs) { // $ ast-def=lhs + void assignWrapper(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs assign(lhs, rhs); } - void notAssign(Int &lhs, int rhs) { // $ ast-def=lhs + void notAssign(Int &lhs, int rhs) { // $ ast-def=lhs ir-def=*lhs lhs.val = rhs; // Field flow ignores that the field is subsequently overwritten, leading // to false flow here. @@ -90,14 +90,14 @@ namespace withFields { } } - void sourceToParam(Int &out) { // $ ast-def=out + void sourceToParam(Int &out) { // $ ast-def=out ir-def=*out out.val = source(); if (arbitrary) { out.val = 1; } } - void sourceToParamWrapper(Int &out) { // $ ast-def=out + void sourceToParamWrapper(Int &out) { // $ ast-def=out ir-def=*out if (arbitrary) { sourceToParam(out); } else { @@ -105,7 +105,7 @@ namespace withFields { } } - void notSource(Int &out) { // $ ast-def=out + void notSource(Int &out) { // $ ast-def=out ir-def=*out out.val = source(); // Field flow ignores that the field is subsequently overwritten, leading // to false flow here. diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp index 2298e644b05..fe415ebab77 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/self_parameter_flow.cpp @@ -3,12 +3,12 @@ void incr(unsigned char **ps) // $ ast-def=ps ir-def=*ps ir-def=**ps *ps += 1; } -void callincr(unsigned char *s) // $ ast-def=s +void callincr(unsigned char *s) // $ ast-def=s ir-def=*s { incr(&s); } -void test(unsigned char *s) // $ ast-def=s +void test(unsigned char *s) // $ ast-def=s ir-def=*s { callincr(s); // $ flow } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected index f9ccfb8e3e4..c9f90a60b6e 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected @@ -264,6 +264,7 @@ irFlow | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:568:10:568:19 | * ... | | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:572:10:572:19 | * ... | | test.cpp:576:17:576:31 | *call to indirect_source | test.cpp:578:10:578:19 | * ... | +| test.cpp:583:11:583:16 | call to source | test.cpp:590:8:590:8 | x | | test.cpp:594:12:594:26 | *call to indirect_source | test.cpp:597:8:597:13 | * ... | | test.cpp:601:20:601:20 | intPointerSource output argument | test.cpp:603:8:603:9 | * ... | | test.cpp:607:20:607:20 | intPointerSource output argument | test.cpp:609:8:609:9 | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp index 60c3abfdfc6..b36c289aaf1 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.cpp @@ -63,7 +63,7 @@ namespace std { template T&& move(T& t) noexcept; // simplified signature } -void identityOperations(int* source1) { // $ ast-def=source1 +void identityOperations(int* source1) { // $ ast-def=source1 ir-def=*source1 const int *x1 = std::move(source1); int* x2 = const_cast(x1); int* x3 = (x2); @@ -484,7 +484,7 @@ struct MyStruct { int* content; }; -void local_field_flow_def_by_ref_steps_with_local_flow(MyStruct * s) { // $ ast-def=s +void local_field_flow_def_by_ref_steps_with_local_flow(MyStruct * s) { // $ ast-def=s ir-def=*s writes_to_content(s->content); int* p_content = s->content; sink(*p_content); @@ -521,12 +521,12 @@ void uncertain_definition() { sink(stackArray[0]); // $ ast=519:19 ir SPURIOUS: ast=517:7 } -void set_through_const_pointer(int x, const int **e) // $ ast-def=e ir-def=**e ir-def=*e +void set_through_const_pointer(int x, const int **e) // $ ast-def=e ir-def=*e ir-def=**e { *e = &x; } -void test_set_through_const_pointer(int *e) // $ ast-def=e +void test_set_through_const_pointer(int *e) // $ ast-def=e ir-def=*e { set_through_const_pointer(source(), &e); sink(*e); // $ ir MISSING: ast @@ -579,7 +579,7 @@ namespace IndirectFlowThroughGlobals { } } -void write_to_param(int* x) { // $ ast-def=x +void write_to_param(int* x) { // $ ast-def=x ir-def=*x int s = source(); x = &s; } @@ -587,7 +587,7 @@ void write_to_param(int* x) { // $ ast-def=x void test_write_to_param() { int x = 0; write_to_param(&x); - sink(x); // $ SPURIOUS: ast + sink(x); // $ SPURIOUS: ast,ir } void test_indirect_flow_to_array() { @@ -609,7 +609,7 @@ void test_def_by_ref_followed_by_uncertain_write_pointer(int* p) { // $ ast-def= sink(*p); // $ ir MISSING: ast } -void test_flow_through_void_double_pointer(int *p) // $ ast-def=p +void test_flow_through_void_double_pointer(int *p) // $ ast-def=p ir-def=*p { intPointerSource(p); void* q = (void*)&p; @@ -695,11 +695,11 @@ void increment_buf(int** buf) { // $ ast-def=buf ir-def=*buf ir-def=**buf sink(buf); // $ SPURIOUS: ast } -void call_increment_buf(int** buf) { // $ ast-def=buf +void call_increment_buf(int** buf) { // $ ast-def=buf ir-def=*buf ir-def=**buf increment_buf(buf); } -void test_conflation_regression(int* source) { // $ ast-def=source +void test_conflation_regression(int* source) { // $ ast-def=source ir-def=*source int* buf = source; call_increment_buf(&buf); } @@ -709,13 +709,13 @@ void write_to_star_star_p(unsigned char **p) // $ ast-def=p ir-def=**p ir-def=*p **p = 0; } -void write_to_star_buf(unsigned char *buf) // $ ast-def=buf +void write_to_star_buf(unsigned char *buf) // $ ast-def=buf ir-def=*buf { unsigned char *c = buf; write_to_star_star_p(&c); } -void test_write_to_star_buf(unsigned char *source) // $ ast-def=source +void test_write_to_star_buf(unsigned char *source) // $ ast-def=source ir-def=*source { write_to_star_buf(source); sink(*source); // clean @@ -1041,7 +1041,7 @@ namespace test_gettext { void* memset(void*, int, size_t); -void memset_test(char* buf) { // $ ast-def=buf +void memset_test(char* buf) { // $ ast-def=buf ir-def=*buf memset(buf, source(), 10); sink(*buf); // $ ir MISSING: ast } \ No newline at end of file diff --git a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected index 770a70f2a1d..2fff7b5403c 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/ir-path-flow.expected @@ -52,13 +52,17 @@ edges | A.cpp:103:14:103:14 | *c [a] | A.cpp:120:12:120:13 | *c1 [a] | provenance | | | A.cpp:107:12:107:13 | *c1 [a] | A.cpp:107:12:107:16 | a | provenance | | | A.cpp:120:12:120:13 | *c1 [a] | A.cpp:120:12:120:16 | a | provenance | | +| A.cpp:124:14:124:14 | *b [c] | A.cpp:131:8:131:8 | f7 output argument [c] | provenance | | +| A.cpp:126:5:126:5 | set output argument [c] | A.cpp:124:14:124:14 | *b [c] | provenance | | | A.cpp:126:5:126:5 | set output argument [c] | A.cpp:131:8:131:8 | f7 output argument [c] | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:27:17:27:17 | c | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:126:5:126:5 | set output argument [c] | provenance | | | A.cpp:126:12:126:18 | new | A.cpp:126:12:126:18 | new | provenance | | | A.cpp:131:8:131:8 | f7 output argument [c] | A.cpp:132:10:132:10 | *b [c] | provenance | | | A.cpp:132:10:132:10 | *b [c] | A.cpp:132:10:132:13 | c | provenance | | +| A.cpp:140:13:140:13 | *b [c] | A.cpp:151:18:151:18 | D output argument [c] | provenance | | | A.cpp:140:13:140:13 | b | A.cpp:143:7:143:31 | ... = ... | provenance | | +| A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:140:13:140:13 | *b [c] | provenance | | | A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:143:7:143:31 | *... = ... [c] | provenance | | | A.cpp:142:7:142:7 | *b [post update] [c] | A.cpp:151:18:151:18 | D output argument [c] | provenance | | | A.cpp:142:7:142:20 | ... = ... | A.cpp:142:7:142:7 | *b [post update] [c] | provenance | | @@ -70,12 +74,20 @@ edges | A.cpp:143:7:143:31 | ... = ... | A.cpp:143:7:143:10 | *this [post update] [b] | provenance | | | A.cpp:143:25:143:31 | new | A.cpp:143:7:143:31 | ... = ... | provenance | | | A.cpp:150:12:150:18 | new | A.cpp:151:18:151:18 | b | provenance | | +| A.cpp:151:12:151:24 | call to D [*b, c] | A.cpp:152:10:152:10 | *d [*b, c] | provenance | | | A.cpp:151:12:151:24 | call to D [*b, c] | A.cpp:153:10:153:10 | *d [*b, c] | provenance | | | A.cpp:151:12:151:24 | call to D [b] | A.cpp:152:10:152:10 | *d [b] | provenance | | | A.cpp:151:18:151:18 | D output argument [c] | A.cpp:154:10:154:10 | *b [c] | provenance | | | A.cpp:151:18:151:18 | b | A.cpp:140:13:140:13 | b | provenance | | | A.cpp:151:18:151:18 | b | A.cpp:151:12:151:24 | call to D [b] | provenance | | +| A.cpp:152:10:152:10 | *d [*b, c] | A.cpp:152:10:152:13 | *b [c] | provenance | | +| A.cpp:152:10:152:10 | *d [*b, c] | A.cpp:152:13:152:13 | *b [c] | provenance | | | A.cpp:152:10:152:10 | *d [b] | A.cpp:152:10:152:13 | b | provenance | | +| A.cpp:152:10:152:10 | *d [post update] [*b, c] | A.cpp:153:10:153:10 | *d [*b, c] | provenance | | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:152:10:152:13 | sink output argument [c] | provenance | | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:173:26:173:26 | *o [c] | provenance | | +| A.cpp:152:10:152:13 | sink output argument [c] | A.cpp:152:10:152:10 | *d [post update] [*b, c] | provenance | | +| A.cpp:152:13:152:13 | *b [c] | A.cpp:152:10:152:13 | *b [c] | provenance | | | A.cpp:153:10:153:10 | *d [*b, c] | A.cpp:153:13:153:13 | *b [c] | provenance | | | A.cpp:153:13:153:13 | *b [c] | A.cpp:153:10:153:16 | c | provenance | | | A.cpp:154:10:154:10 | *b [c] | A.cpp:154:10:154:13 | c | provenance | | @@ -98,6 +110,7 @@ edges | A.cpp:167:47:167:50 | *next [*next, head] | A.cpp:167:44:167:44 | *l [*next, head] | provenance | | | A.cpp:167:47:167:50 | *next [head] | A.cpp:169:12:169:12 | *l [head] | provenance | | | A.cpp:169:12:169:12 | *l [head] | A.cpp:169:12:169:18 | head | provenance | | +| A.cpp:173:26:173:26 | *o [c] | A.cpp:173:26:173:26 | *o [c] | provenance | | | A.cpp:181:15:181:21 | newHead | A.cpp:183:7:183:20 | ... = ... | provenance | | | A.cpp:181:32:181:35 | *next [*next, head] | A.cpp:184:7:184:23 | *... = ... [*next, head] | provenance | | | A.cpp:181:32:181:35 | *next [head] | A.cpp:184:7:184:23 | *... = ... [head] | provenance | | @@ -200,9 +213,13 @@ edges | E.cpp:30:23:30:26 | *data [post update] [*buffer] | E.cpp:30:21:30:21 | *p [post update] [data, *buffer] | provenance | | | E.cpp:32:10:32:10 | *b [*buffer] | E.cpp:32:13:32:18 | *buffer | provenance | | | E.cpp:33:18:33:19 | *& ... [data, *buffer] | E.cpp:19:27:19:27 | *p [data, *buffer] | provenance | | +| aliasing.cpp:8:23:8:23 | *s [m1] | aliasing.cpp:25:17:25:19 | pointerSetter output argument [m1] | provenance | | +| aliasing.cpp:9:3:9:3 | *s [post update] [m1] | aliasing.cpp:8:23:8:23 | *s [m1] | provenance | | | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | aliasing.cpp:25:17:25:19 | pointerSetter output argument [m1] | provenance | | | aliasing.cpp:9:3:9:22 | ... = ... | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | provenance | | | aliasing.cpp:9:11:9:20 | call to user_input | aliasing.cpp:9:3:9:22 | ... = ... | provenance | | +| aliasing.cpp:12:25:12:25 | *s [m1] | aliasing.cpp:26:19:26:20 | referenceSetter output argument [m1] | provenance | | +| aliasing.cpp:13:3:13:3 | *s [post update] [m1] | aliasing.cpp:12:25:12:25 | *s [m1] | provenance | | | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | aliasing.cpp:26:19:26:20 | referenceSetter output argument [m1] | provenance | | | aliasing.cpp:13:3:13:21 | ... = ... | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | provenance | | | aliasing.cpp:13:10:13:19 | call to user_input | aliasing.cpp:13:3:13:21 | ... = ... | provenance | | @@ -313,6 +330,7 @@ edges | arrays.cpp:50:10:50:17 | *indirect [*ptr, data] | arrays.cpp:50:20:50:22 | *ptr [data] | provenance | | | arrays.cpp:50:20:50:22 | *ptr [data] | arrays.cpp:50:8:50:25 | *access to array [data] | provenance | | | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:16 | ... = ... | provenance | | +| by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:11:39:11:39 | *s [a] | provenance | | | by_reference.cpp:12:5:12:16 | ... = ... | by_reference.cpp:12:5:12:5 | *s [post update] [a] | provenance | | | by_reference.cpp:15:26:15:30 | value | by_reference.cpp:16:5:16:19 | ... = ... | provenance | | | by_reference.cpp:16:5:16:19 | ... = ... | by_reference.cpp:16:5:16:8 | *this [post update] [a] | provenance | | @@ -356,12 +374,22 @@ edges | by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | provenance | | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:31:46:31:46 | *s [a] | provenance | | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:102:21:102:39 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:103:27:103:35 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:106:21:106:41 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:83:31:83:35 | *inner [a] | by_reference.cpp:107:29:107:37 | taint_inner_a_ptr output argument [a] | provenance | | +| by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:83:31:83:35 | *inner [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:102:21:102:39 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:103:27:103:35 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:106:21:106:41 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | by_reference.cpp:107:29:107:37 | taint_inner_a_ptr output argument [a] | provenance | | | by_reference.cpp:84:3:84:25 | ... = ... | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | provenance | | | by_reference.cpp:84:14:84:23 | call to user_input | by_reference.cpp:84:3:84:25 | ... = ... | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:122:21:122:38 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:123:21:123:36 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:126:21:126:40 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:87:31:87:35 | *inner [a] | by_reference.cpp:127:21:127:38 | taint_inner_a_ref output argument [a] | provenance | | +| by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:87:31:87:35 | *inner [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:122:21:122:38 | taint_inner_a_ref output argument [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:123:21:123:36 | taint_inner_a_ref output argument [a] | provenance | | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | by_reference.cpp:126:21:126:40 | taint_inner_a_ref output argument [a] | provenance | | @@ -614,8 +642,10 @@ edges | qualifiers.cpp:9:21:9:25 | value | qualifiers.cpp:9:30:9:44 | ... = ... | provenance | | | qualifiers.cpp:9:30:9:44 | ... = ... | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | provenance | | | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:49:12:64 | ... = ... | provenance | | +| qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | qualifiers.cpp:12:27:12:31 | *inner [a] | provenance | | | qualifiers.cpp:12:49:12:64 | ... = ... | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | provenance | | | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:51:13:65 | ... = ... | provenance | | +| qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | qualifiers.cpp:13:29:13:33 | *inner [a] | provenance | | | qualifiers.cpp:13:51:13:65 | ... = ... | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | provenance | | | qualifiers.cpp:22:5:22:9 | getInner output argument [*inner, a] | qualifiers.cpp:23:10:23:14 | *outer [*inner, a] | provenance | | | qualifiers.cpp:22:5:22:38 | ... = ... | qualifiers.cpp:22:11:22:18 | *call to getInner [post update] [a] | provenance | | @@ -716,6 +746,7 @@ edges | simple.cpp:103:24:103:24 | x | simple.cpp:104:14:104:14 | x | provenance | | | simple.cpp:108:17:108:26 | call to user_input | simple.cpp:109:43:109:43 | x | provenance | | | simple.cpp:109:43:109:43 | x | simple.cpp:103:24:103:24 | x | provenance | | +| struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | | | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:15:8:15:9 | *ab [a] | provenance | | | struct_init.c:15:8:15:9 | *ab [a] | struct_init.c:15:12:15:12 | a | provenance | | | struct_init.c:20:13:20:14 | *definition of ab [a] | struct_init.c:22:8:22:9 | *ab [a] | provenance | | @@ -726,6 +757,8 @@ edges | struct_init.c:20:20:20:29 | call to user_input | struct_init.c:20:20:20:29 | call to user_input | provenance | | | struct_init.c:22:8:22:9 | *ab [a] | struct_init.c:22:11:22:11 | a | provenance | | | struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:14:24:14:25 | *ab [a] | provenance | | +| struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:24:10:24:12 | absink output argument [a] | provenance | | +| struct_init.c:24:10:24:12 | absink output argument [a] | struct_init.c:28:5:28:7 | *& ... [a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | struct_init.c:31:8:31:12 | *outer [nestedAB, a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | struct_init.c:36:11:36:15 | *outer [nestedAB, a] | provenance | | | struct_init.c:26:16:26:20 | *definition of outer [post update] [*pointerAB, a] | struct_init.c:33:8:33:12 | *outer [*pointerAB, a] | provenance | | @@ -805,12 +838,14 @@ nodes | A.cpp:107:12:107:16 | a | semmle.label | a | | A.cpp:120:12:120:13 | *c1 [a] | semmle.label | *c1 [a] | | A.cpp:120:12:120:16 | a | semmle.label | a | +| A.cpp:124:14:124:14 | *b [c] | semmle.label | *b [c] | | A.cpp:126:5:126:5 | set output argument [c] | semmle.label | set output argument [c] | | A.cpp:126:12:126:18 | new | semmle.label | new | | A.cpp:126:12:126:18 | new | semmle.label | new | | A.cpp:131:8:131:8 | f7 output argument [c] | semmle.label | f7 output argument [c] | | A.cpp:132:10:132:10 | *b [c] | semmle.label | *b [c] | | A.cpp:132:10:132:13 | c | semmle.label | c | +| A.cpp:140:13:140:13 | *b [c] | semmle.label | *b [c] | | A.cpp:140:13:140:13 | b | semmle.label | b | | A.cpp:142:7:142:7 | *b [post update] [c] | semmle.label | *b [post update] [c] | | A.cpp:142:7:142:20 | ... = ... | semmle.label | ... = ... | @@ -827,8 +862,13 @@ nodes | A.cpp:151:12:151:24 | call to D [b] | semmle.label | call to D [b] | | A.cpp:151:18:151:18 | D output argument [c] | semmle.label | D output argument [c] | | A.cpp:151:18:151:18 | b | semmle.label | b | +| A.cpp:152:10:152:10 | *d [*b, c] | semmle.label | *d [*b, c] | | A.cpp:152:10:152:10 | *d [b] | semmle.label | *d [b] | +| A.cpp:152:10:152:10 | *d [post update] [*b, c] | semmle.label | *d [post update] [*b, c] | +| A.cpp:152:10:152:13 | *b [c] | semmle.label | *b [c] | | A.cpp:152:10:152:13 | b | semmle.label | b | +| A.cpp:152:10:152:13 | sink output argument [c] | semmle.label | sink output argument [c] | +| A.cpp:152:13:152:13 | *b [c] | semmle.label | *b [c] | | A.cpp:153:10:153:10 | *d [*b, c] | semmle.label | *d [*b, c] | | A.cpp:153:10:153:16 | c | semmle.label | c | | A.cpp:153:13:153:13 | *b [c] | semmle.label | *b [c] | @@ -851,6 +891,8 @@ nodes | A.cpp:167:47:167:50 | *next [head] | semmle.label | *next [head] | | A.cpp:169:12:169:12 | *l [head] | semmle.label | *l [head] | | A.cpp:169:12:169:18 | head | semmle.label | head | +| A.cpp:173:26:173:26 | *o [c] | semmle.label | *o [c] | +| A.cpp:173:26:173:26 | *o [c] | semmle.label | *o [c] | | A.cpp:181:15:181:21 | newHead | semmle.label | newHead | | A.cpp:181:32:181:35 | *next [*next, head] | semmle.label | *next [*next, head] | | A.cpp:181:32:181:35 | *next [head] | semmle.label | *next [head] | @@ -964,9 +1006,11 @@ nodes | E.cpp:32:10:32:10 | *b [*buffer] | semmle.label | *b [*buffer] | | E.cpp:32:13:32:18 | *buffer | semmle.label | *buffer | | E.cpp:33:18:33:19 | *& ... [data, *buffer] | semmle.label | *& ... [data, *buffer] | +| aliasing.cpp:8:23:8:23 | *s [m1] | semmle.label | *s [m1] | | aliasing.cpp:9:3:9:3 | *s [post update] [m1] | semmle.label | *s [post update] [m1] | | aliasing.cpp:9:3:9:22 | ... = ... | semmle.label | ... = ... | | aliasing.cpp:9:11:9:20 | call to user_input | semmle.label | call to user_input | +| aliasing.cpp:12:25:12:25 | *s [m1] | semmle.label | *s [m1] | | aliasing.cpp:13:3:13:3 | *s [post update] [m1] | semmle.label | *s [post update] [m1] | | aliasing.cpp:13:3:13:21 | ... = ... | semmle.label | ... = ... | | aliasing.cpp:13:10:13:19 | call to user_input | semmle.label | call to user_input | @@ -1084,6 +1128,7 @@ nodes | arrays.cpp:50:10:50:17 | *indirect [*ptr, data] | semmle.label | *indirect [*ptr, data] | | arrays.cpp:50:20:50:22 | *ptr [data] | semmle.label | *ptr [data] | | arrays.cpp:50:27:50:30 | data | semmle.label | data | +| by_reference.cpp:11:39:11:39 | *s [a] | semmle.label | *s [a] | | by_reference.cpp:11:48:11:52 | value | semmle.label | value | | by_reference.cpp:12:5:12:5 | *s [post update] [a] | semmle.label | *s [post update] [a] | | by_reference.cpp:12:5:12:16 | ... = ... | semmle.label | ... = ... | @@ -1128,9 +1173,11 @@ nodes | by_reference.cpp:68:21:68:30 | call to user_input | semmle.label | call to user_input | | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | semmle.label | call to nonMemberGetA | | by_reference.cpp:69:22:69:23 | *& ... [a] | semmle.label | *& ... [a] | +| by_reference.cpp:83:31:83:35 | *inner [a] | semmle.label | *inner [a] | | by_reference.cpp:84:3:84:7 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | by_reference.cpp:84:3:84:25 | ... = ... | semmle.label | ... = ... | | by_reference.cpp:84:14:84:23 | call to user_input | semmle.label | call to user_input | +| by_reference.cpp:87:31:87:35 | *inner [a] | semmle.label | *inner [a] | | by_reference.cpp:88:3:88:7 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | by_reference.cpp:88:3:88:24 | ... = ... | semmle.label | ... = ... | | by_reference.cpp:88:13:88:22 | call to user_input | semmle.label | call to user_input | @@ -1393,9 +1440,11 @@ nodes | qualifiers.cpp:9:21:9:25 | value | semmle.label | value | | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | semmle.label | *this [post update] [a] | | qualifiers.cpp:9:30:9:44 | ... = ... | semmle.label | ... = ... | +| qualifiers.cpp:12:27:12:31 | *inner [a] | semmle.label | *inner [a] | | qualifiers.cpp:12:40:12:44 | value | semmle.label | value | | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | qualifiers.cpp:12:49:12:64 | ... = ... | semmle.label | ... = ... | +| qualifiers.cpp:13:29:13:33 | *inner [a] | semmle.label | *inner [a] | | qualifiers.cpp:13:42:13:46 | value | semmle.label | value | | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | semmle.label | *inner [post update] [a] | | qualifiers.cpp:13:51:13:65 | ... = ... | semmle.label | ... = ... | @@ -1507,6 +1556,7 @@ nodes | simple.cpp:108:17:108:26 | call to user_input | semmle.label | call to user_input | | simple.cpp:109:43:109:43 | x | semmle.label | x | | struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] | +| struct_init.c:14:24:14:25 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:15:8:15:9 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:15:12:15:12 | a | semmle.label | a | | struct_init.c:20:13:20:14 | *definition of ab [a] | semmle.label | *definition of ab [a] | @@ -1516,6 +1566,7 @@ nodes | struct_init.c:22:8:22:9 | *ab [a] | semmle.label | *ab [a] | | struct_init.c:22:11:22:11 | a | semmle.label | a | | struct_init.c:24:10:24:12 | *& ... [a] | semmle.label | *& ... [a] | +| struct_init.c:24:10:24:12 | absink output argument [a] | semmle.label | absink output argument [a] | | struct_init.c:26:16:26:20 | *definition of outer [nestedAB, a] | semmle.label | *definition of outer [nestedAB, a] | | struct_init.c:26:16:26:20 | *definition of outer [post update] [*pointerAB, a] | semmle.label | *definition of outer [post update] [*pointerAB, a] | | struct_init.c:26:16:26:20 | *definition of outer [post update] [nestedAB, a] | semmle.label | *definition of outer [post update] [nestedAB, a] | @@ -1552,6 +1603,7 @@ subpaths | A.cpp:90:15:90:15 | c | A.cpp:27:17:27:17 | c | A.cpp:27:22:27:25 | *this [post update] [c] | A.cpp:90:7:90:8 | set output argument [c] | | A.cpp:126:12:126:18 | new | A.cpp:27:17:27:17 | c | A.cpp:27:22:27:25 | *this [post update] [c] | A.cpp:126:5:126:5 | set output argument [c] | | A.cpp:151:18:151:18 | b | A.cpp:140:13:140:13 | b | A.cpp:143:7:143:10 | *this [post update] [b] | A.cpp:151:12:151:24 | call to D [b] | +| A.cpp:152:10:152:13 | *b [c] | A.cpp:173:26:173:26 | *o [c] | A.cpp:173:26:173:26 | *o [c] | A.cpp:152:10:152:13 | sink output argument [c] | | A.cpp:160:29:160:29 | b | A.cpp:181:15:181:21 | newHead | A.cpp:183:7:183:10 | *this [post update] [head] | A.cpp:160:18:160:60 | call to MyList [head] | | A.cpp:161:38:161:39 | *l1 [head] | A.cpp:181:32:181:35 | *next [head] | A.cpp:184:7:184:10 | *this [post update] [*next, head] | A.cpp:161:18:161:40 | call to MyList [*next, head] | | A.cpp:162:38:162:39 | *l2 [*next, head] | A.cpp:181:32:181:35 | *next [*next, head] | A.cpp:184:7:184:10 | *this [post update] [*next, *next, head] | A.cpp:162:18:162:40 | call to MyList [*next, *next, head] | @@ -1564,6 +1616,7 @@ subpaths | D.cpp:37:21:37:21 | e | D.cpp:11:24:11:24 | e | D.cpp:11:29:11:32 | *this [post update] [elem] | D.cpp:37:8:37:10 | setElem output argument [elem] | | D.cpp:51:27:51:27 | e | D.cpp:11:24:11:24 | e | D.cpp:11:29:11:32 | *this [post update] [elem] | D.cpp:51:8:51:14 | setElem output argument [elem] | | by_reference.cpp:20:23:20:27 | value | by_reference.cpp:15:26:15:30 | value | by_reference.cpp:16:5:16:8 | *this [post update] [a] | by_reference.cpp:20:5:20:8 | setDirectly output argument [a] | +| by_reference.cpp:24:25:24:29 | value | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:11:39:11:39 | *s [a] | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | | by_reference.cpp:24:25:24:29 | value | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | | by_reference.cpp:40:12:40:15 | *this [a] | by_reference.cpp:35:9:35:19 | *this [a] | by_reference.cpp:35:9:35:19 | *getDirectly | by_reference.cpp:40:18:40:28 | call to getDirectly | | by_reference.cpp:44:26:44:29 | *this [a] | by_reference.cpp:31:46:31:46 | *s [a] | by_reference.cpp:31:16:31:28 | *nonMemberGetA | by_reference.cpp:44:12:44:24 | call to nonMemberGetA | @@ -1573,6 +1626,7 @@ subpaths | by_reference.cpp:57:8:57:8 | *s [a] | by_reference.cpp:39:9:39:21 | *this [a] | by_reference.cpp:39:9:39:21 | *getIndirectly | by_reference.cpp:57:10:57:22 | call to getIndirectly | | by_reference.cpp:62:25:62:34 | call to user_input | by_reference.cpp:23:34:23:38 | value | by_reference.cpp:24:19:24:22 | nonMemberSetA output argument [a] | by_reference.cpp:62:3:62:3 | setThroughNonMember output argument [a] | | by_reference.cpp:63:8:63:8 | *s [a] | by_reference.cpp:43:9:43:27 | *this [a] | by_reference.cpp:43:9:43:27 | *getThroughNonMember | by_reference.cpp:63:10:63:28 | call to getThroughNonMember | +| by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:11:39:11:39 | *s [a] | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | | by_reference.cpp:68:21:68:30 | call to user_input | by_reference.cpp:11:48:11:52 | value | by_reference.cpp:12:5:12:5 | *s [post update] [a] | by_reference.cpp:68:17:68:18 | nonMemberSetA output argument [a] | | by_reference.cpp:69:22:69:23 | *& ... [a] | by_reference.cpp:31:46:31:46 | *s [a] | by_reference.cpp:31:16:31:28 | *nonMemberGetA | by_reference.cpp:69:8:69:20 | call to nonMemberGetA | | complex.cpp:42:16:42:16 | *f [a_] | complex.cpp:9:7:9:7 | *this [a_] | complex.cpp:9:7:9:7 | *a | complex.cpp:42:18:42:18 | call to a | @@ -1588,7 +1642,9 @@ subpaths | constructors.cpp:36:11:36:20 | call to user_input | constructors.cpp:23:13:23:13 | a | constructors.cpp:23:5:23:7 | *this [post update] [a_] | constructors.cpp:36:9:36:9 | call to Foo [a_] | | constructors.cpp:36:25:36:34 | call to user_input | constructors.cpp:23:20:23:20 | b | constructors.cpp:23:5:23:7 | *this [post update] [b_] | constructors.cpp:36:9:36:9 | call to Foo [b_] | | qualifiers.cpp:27:28:27:37 | call to user_input | qualifiers.cpp:9:21:9:25 | value | qualifiers.cpp:9:30:9:33 | *this [post update] [a] | qualifiers.cpp:27:11:27:18 | setA output argument [a] | +| qualifiers.cpp:32:35:32:44 | call to user_input | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:27:12:31 | *inner [a] | qualifiers.cpp:32:23:32:30 | pointerSetA output argument [a] | | qualifiers.cpp:32:35:32:44 | call to user_input | qualifiers.cpp:12:40:12:44 | value | qualifiers.cpp:12:49:12:53 | *inner [post update] [a] | qualifiers.cpp:32:23:32:30 | pointerSetA output argument [a] | +| qualifiers.cpp:37:38:37:47 | call to user_input | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:29:13:33 | *inner [a] | qualifiers.cpp:37:19:37:35 | referenceSetA output argument [a] | | qualifiers.cpp:37:38:37:47 | call to user_input | qualifiers.cpp:13:42:13:46 | value | qualifiers.cpp:13:51:13:55 | *inner [post update] [a] | qualifiers.cpp:37:19:37:35 | referenceSetA output argument [a] | | simple.cpp:28:10:28:10 | *f [a_] | simple.cpp:18:9:18:9 | *this [a_] | simple.cpp:18:9:18:9 | *a | simple.cpp:28:12:28:12 | call to a | | simple.cpp:29:10:29:10 | *f [b_] | simple.cpp:19:9:19:9 | *this [b_] | simple.cpp:19:9:19:9 | *b | simple.cpp:29:12:29:12 | call to b | @@ -1597,6 +1653,7 @@ subpaths | simple.cpp:41:12:41:21 | call to user_input | simple.cpp:20:19:20:19 | a | simple.cpp:20:24:20:25 | *this [post update] [a_] | simple.cpp:41:5:41:5 | setA output argument [a_] | | simple.cpp:42:12:42:21 | call to user_input | simple.cpp:21:19:21:19 | b | simple.cpp:21:24:21:25 | *this [post update] [b_] | simple.cpp:42:5:42:5 | setB output argument [b_] | | simple.cpp:84:14:84:20 | *this [f2, f1] | simple.cpp:78:9:78:15 | *this [f2, f1] | simple.cpp:78:9:78:15 | *getf2f1 | simple.cpp:84:14:84:20 | call to getf2f1 | +| struct_init.c:24:10:24:12 | *& ... [a] | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:14:24:14:25 | *ab [a] | struct_init.c:24:10:24:12 | absink output argument [a] | #select | A.cpp:43:10:43:12 | *& ... | A.cpp:41:15:41:21 | new | A.cpp:43:10:43:12 | *& ... | *& ... flows from $@ | A.cpp:41:15:41:21 | new | new | | A.cpp:49:10:49:13 | c | A.cpp:47:12:47:18 | new | A.cpp:49:10:49:13 | c | c flows from $@ | A.cpp:47:12:47:18 | new | new | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp index e24830a3004..0ba45b6f30a 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -756,5 +756,5 @@ void call_sprintf_twice(char* path, char* data) { void test_call_sprintf() { char path[10]; call_sprintf_twice(path, indirect_source()); - sink(*path); // $ ast MISSING: ir + sink(*path); // $ ast,ir } \ No newline at end of file