最近,Microsoft Visual Studio 2015 编译器终于符合 C++ 标准的要求,为函数本地静态生成线程安全代码。在大多数情况下,这工作得很好,但我在 Windows XP 上遇到了以下 3 条指令导致崩溃的情况:
mov eax,dword ptr fs:[0000002Ch]
mov ecx,dword ptr [MyModule!_tls_index (102eea44)]
mov ecx,dword ptr [eax+ecx*4]
显然,编译器似乎通过首先插入当前线程的 TLS 插槽来实现线程安全。fs:2Ch
应该导致每个文档的 TLS 数组。但是在 Windows XP 上,fs:2Ch
似乎没有设置。这对我来说返回 0,下一条指令_tls_index
也是如此(也是 0。)这导致第三条指令在访问无效内存时爆炸。
有人知道为什么fs:2Ch
不能在 Windows XP 上设置吗?函数局部静态在我们的代码中使用,我无法想象没有其他人会遇到这种情况。