#include "stl.h" int source(); void sink(int); void sink(int*); template void sink(std::shared_ptr&); template void sink(std::unique_ptr&); void test_make_shared() { std::shared_ptr p = std::make_shared(source()); sink(*p); // $ ast,ir sink(p); // $ ast,ir } void test_make_shared_array() { std::shared_ptr p = std::make_shared(source()); sink(*p); // not tainted sink(p); // not tainted } void test_make_unique() { std::unique_ptr p = std::make_unique(source()); sink(*p); // $ ast,ir sink(p); // $ ast,ir } void test_make_unique_array() { std::unique_ptr p = std::make_unique(source()); sink(*p); // not tainted sink(p); // not tainted } void test_reverse_taint_shared() { std::shared_ptr p = std::make_shared(); *p = source(); sink(p); // $ ast,ir sink(*p); // $ ast,ir } void test_reverse_taint_unique() { std::unique_ptr p = std::unique_ptr(); *p = source(); sink(p); // $ ast,ir sink(*p); // $ ast,ir } void test_shared_get() { std::shared_ptr p = std::make_shared(source()); sink(p.get()); // $ ast,ir } void test_unique_get() { std::unique_ptr p = std::make_unique(source()); sink(p.get()); // $ ast,ir } struct A { int x, y; }; void test_shared_field_member() { std::unique_ptr p = std::make_unique(source(), 0); sink(p->x); // $ MISSING: ast,ir sink(p->y); // not tainted } void getNumber(std::shared_ptr ptr) { *ptr = source(); } int test_from_issue_5190() { std::shared_ptr p(new int); getNumber(p); sink(*p); // $ ast MISSING: ir } struct B { A a1; A a2; int z; }; void test_operator_arrow(std::unique_ptr p, std::unique_ptr q) { p->x = source(); sink(p->x); // $ ast,ir sink(p->y); q->a1.x = source(); sink(q->a1.x); // $ ast,ir sink(q->a1.y); sink(q->a2.x); } void taint_x(A* pa) { pa->x = source(); } void reverse_taint_smart_pointer() { std::unique_ptr p = std::unique_ptr(new A); taint_x(p.get()); sink(p->x); // $ ast,ir } struct C { int z; std::shared_ptr q; }; void taint_x_shared(std::shared_ptr ptr) { ptr->x = source(); } void taint_x_shared_cref(const std::shared_ptr& ptr) { ptr->x = source(); } void getNumberCRef(const std::shared_ptr& ptr) { *ptr = source(); } int nested_shared_ptr_taint(std::shared_ptr p1, std::unique_ptr> p2) { taint_x_shared(p1->q); sink(p1->q->x); // $ ast MISSING: ir getNumber(*p2); sink(**p2); // $ ast MISSING: ir } int nested_shared_ptr_taint_cref(std::shared_ptr p1, std::unique_ptr> p2) { taint_x_shared_cref(p1->q); sink(p1->q->x); // $ ast,ir getNumberCRef(*p2); sink(**p2); // $ ast,ir }