namespace mutex_invalid {
void func_asign(void(*func)(int&), int& data) {
std::cout << "in func: " << data << std::endl;
func(data); // data 传入的本意可能只是在线程中使用, 而不是修改
}
void func_asign_test(int& num) {
num++; // data 被恶意回调函数修改
}
void test_main() {
std::mutex lock;
int n = 1;
std::lock_guard<std::mutex> l(lock);
std::thread t(func_asign, func_asign_test, std::ref(n));
t.join();
//func_asign(func_asign_test, num);
std::cout << "in test_main: " << n << std::endl;
}
}
运行结果
在该段代码中, 看似给可访问的数据标记互斥, 但实际根本没有保护数据, 把数据的可访问性暴露在回调函数 func 中, 用户如果传入恶意回调函数就会导致共享数据被修改, 不仅仅是回调, 在类成员函数等其他方式也会出现诸如此类的问题
规避该现象的方法是, 避免把保护数据的指针或引用传递到互斥作用域之外