【发布时间】:2011-04-19 03:21:08
【问题描述】:
今天,我在查看 Visual Studio 2008 和 2010 的 CRT 库的源代码时,发现文件 mtdll.h 中存在错误。问题出在宏 FLS_GETVALUE 上。在 x86 系统上,此宏直接调用 TlsGetValue,而不是调用分配给变量 gpFlsGetValue 的函数。
首先,这是一个问题,因为 FlsAlloc、FlsGetValue、FlsFree 和 FlsSetValue 并非在所有系统(Windows Vista+ 和 Windows Server 2003+)上都可用。这些函数的行为类似于 TlsAlloc、TlsGetValue、TlsFree 和 TlsSetValue,但支持 Fibers(一种用户线程)。因为我们应该更喜欢使用 Fls* 函数而不是 Tls 函数,所以 VS 的 C 运行时库会在加载进程或 dll 时检查 Fls 函数是否可用,并初始化 gpFls* 变量。如果 Fls* 不可用,CRT 会使用等效的 Tls* 函数初始化这些变量。
您不能在代码中直接使用宏 FLS_GETVALUE,因为它在运行时库内部使用。运行时使用此宏来初始化运行时库的每个线程数据。
我的问题是关于这个错误的影响。我知道 Fiber 并没有被广泛使用,但是如果您开发一个在使用 Fiber 的应用程序中使用的 DLL,会产生什么影响?这个错误是否会导致应用程序崩溃或只会产生错误的结果?这个问题是否会导致 SQL Server 等广泛使用的应用程序出现问题?你怎么看?这个错误会带来安全风险吗? IIS 或 ASP.Net 是否使用可能导致崩溃的光纤?
对于好奇的人,这里是 mtdll.h 中问题行的当前来源:
#define FLS_GETVALUE ((PFLS_GETVALUE_FUNCTION)TlsGetValue(__getvalueindex))
这里是宏 FLS_GETVALUE 的固定版本:
#define FLS_GETVALUE (((PFLS_GETVALUE_FUNCTION)DecodePointer(gpFlsGetValue))(__getvalueindex))
现在,我应该找到如何向 Microsoft 提交错误。
【问题讨论】:
-
Uhhh.... 在此处的微软论坛上发布...microsoft.com/communities/forums/default.mspx,有趣的错误...公平竞争...(提示:MSDN 可能是您那边最好的选择!)
-
这个错误可能会导致《战舰世界》中的性能问题,如果有人可以验证这一点,将会非常感兴趣。它可能会导致 AMD 系统死机/卡顿。
标签: c++ c visual-studio msvcrt crt