void write_string_map_ok(std::map<int, std::string> map) { int source = __infer_taint_source(); map[source] = "string"; }
int read_map_ok(std::map<int, int> map) { int source = __infer_taint_source(); return map[source]; }
int read_vector_bad(std::vector<int> vec) { int source = __infer_taint_source(); return vec[source]; }
// don't care about map accesses void write_map_ok(std::map<int, int> map) { int source = __infer_taint_source(); map[source] = 2; }
void write_vector_bad(std::vector<int> vec) { int source = __infer_taint_source(); vec[source] = 2; }
void propagateBad() { void* source = __infer_taint_source(); void* launderedSource = id(source); callSink(launderedSource); }
void sourceThenCallSinkBad() { void* source = __infer_taint_source(); callSink(source); }
void sourceToSinkDirectBad() { void* source = __infer_taint_source(); __infer_taint_sink(source); }
void* returnSource() { return __infer_taint_source(); }