如果受保护的数据的指针或引用,被任意函数返回,或者将受保护的数据传至到互斥元之外的函数,在外部储存。这样的话任意函数都可以对其访问(可能对其修改)。
代码如下:
class some_data { int a; string a; public: void do_something(); }; class data_wrapper { private: some_data data; mutex m; public: template<typename Function> void process_data(Function func) { lock_guard<mutex> l(m); func(data); //将受保护的数据传递给互斥元范围 } }; some_data* unprotected; void malicious_function(some_data & protected_data) { unprotected->do_something(); } data_wrapper x; int main() { x.process_data(malicious_function); //恶意传值 unprotected->do_something(); //对受到保护的对象进行访问 system("pause"); return 0; }
不要将对受保护数据的指针和引用传递锁的范围之外,无论是通过函数返回它们,将其存放在外部可见的内存中,还是作为参数传递给其他的函数。