Files
codeql/cpp/ql/test/library-tests/dataflow/taint-tests/standalone_iterators.cpp
2024-04-29 09:38:42 +01:00

132 lines
2.8 KiB
C++

#include "stl.h"
using namespace std;
void sink(int);
class int_iterator_by_typedefs {
public:
typedef input_iterator_tag iterator_category;
typedef int value_type;
typedef size_t difference_type;
typedef int * pointer;
typedef int & reference;
int_iterator_by_typedefs &operator++();
int_iterator_by_typedefs operator++(int);
int operator*() const;
};
class int_iterator_by_trait {
public:
int_iterator_by_trait &operator++();
int_iterator_by_trait operator++(int);
int operator*() const;
};
template<>
struct std::iterator_traits<int_iterator_by_trait> {
typedef input_iterator_tag iterator_category;
typedef int value_type;
typedef size_t difference_type;
typedef int* pointer;
typedef int& reference;
};
class non_iterator {
public:
non_iterator &operator++();
non_iterator operator++(int);
int operator*() const;
};
void test_typedefs(int_iterator_by_typedefs source1) {
sink(*source1); // $ ast,ir
sink(*(source1++)); // $ ast,ir
sink(*(++source1)); // $ ast,ir
}
void test_trait(int_iterator_by_trait source1) {
sink(*source1); // $ ast,ir
sink(*(source1++)); // $ ast,ir
sink(*(++source1)); // $ ast,ir
}
void test_non_iterator(non_iterator source1) {
sink(*source1);
sink(*(source1++));
sink(*(++source1));
}
int source();
class insert_iterator_by_trait {
public:
insert_iterator_by_trait &operator++();
insert_iterator_by_trait operator++(int);
insert_iterator_by_trait &operator--();
insert_iterator_by_trait operator--(int);
insert_iterator_by_trait& operator*();
insert_iterator_by_trait& operator=(int x);
};
template<>
struct std::iterator_traits<insert_iterator_by_trait> {
typedef output_iterator_tag iterator_category;
typedef int value_type;
typedef size_t difference_type;
typedef int* pointer;
typedef int& reference;
};
class container {
public:
container();
insert_iterator_by_trait begin();
};
void sink(container);
void test_insert_iterator() {
container c1, c2;
insert_iterator_by_trait i1 = c1.begin();
*i1-- = source();
sink(c1); // $ ast,ir
insert_iterator_by_trait i2 = c2.begin();
*i2-- = 0;
sink(c2); // clean
}
void sink(insert_iterator_by_trait);
insert_iterator_by_trait &operator+=(insert_iterator_by_trait &it, int amount);
void test_assign_through_iterator() {
container c1;
insert_iterator_by_trait a, b, c;
a = c1.begin();
b = c1.begin();
*a = source();
sink(a); // $ ast,ir
c = c1.begin();
sink(b); // MISSING: ast,ir
sink(c); // $ ast,ir
sink(c1); // $ ast,ir
}
void test_nonmember_iterator() {
container c1;
insert_iterator_by_trait it;
it = c1.begin();
sink(it);
it += 1;
sink(it);
it += source();
sink(it); // $ ast,ir
sink(c1);
}