C++ 发现问题:Visual Studio CRT库:FLS_GETVALUE

C++ 发现问题:Visual Studio CRT库:FLS_GETVALUE,c++,c,visual-studio,msvcrt,crt,C++,C,Visual Studio,Msvcrt,Crt,今天,我在检查VisualStudio2008和2010的CRT库的源代码时,在文件mtdll.h中发现了一个bug。问题在于宏FLS_GETVALUE。在x86系统上,此宏直接调用TlsGetValue,而不是调用分配给变量gpFlsGetValue的函数 首先,这是一个问题,因为FlsAlloc、FlsGetValue、FlsFree和FlsSetValue并非在所有系统(Windows Vista+和Windows Server 2003+)上都可用。这些函数的行为类似于TlsAlloc、

今天,我在检查VisualStudio2008和2010的CRT库的源代码时,在文件mtdll.h中发现了一个bug。问题在于宏FLS_GETVALUE。在x86系统上,此宏直接调用TlsGetValue,而不是调用分配给变量gpFlsGetValue的函数

首先,这是一个问题,因为FlsAlloc、FlsGetValue、FlsFree和FlsSetValue并非在所有系统(Windows Vista+和Windows Server 2003+)上都可用。这些函数的行为类似于TlsAlloc、TlsGetValue、TlsFree和TlsSetValue,但支持光纤(一种用户线程)。因为我们更喜欢使用Fls*函数而不是Tls函数,所以VS的C运行时库会在加载进程或dll时检查Fls函数是否可用,并初始化gpFls*变量。如果Fls*不可用,CRT用等效的Tls*函数初始化这些变量

不能在代码中直接使用宏FLS_GETVALUE,因为它由运行库在内部使用。运行库使用此宏初始化运行库的每线程数据

我的问题是关于这个bug的影响。我知道光纤并没有被广泛使用,但如果你开发了一个在使用光纤的应用程序中使用的DLL,会有什么影响?这个bug会导致应用程序崩溃还是只产生错误的结果?此问题是否会导致广泛使用的应用程序(如SQL Server)出现问题?你怎么认为?该漏洞是否会带来安全风险?IIS或ASP.Net是否使用可能导致崩溃的光纤

对于好奇的人,这里是mtdll.h中问题行的当前来源:

#定义FLS_GETVALUE((PFLS_GETVALUE_函数)TlsGetValue(u getvalueindex))

这里是宏FLS_GETVALUE的固定版本:

#定义FLS_GETVALUE(((PFLS_GETVALUE_函数)解码指针(gpFlsGetValue))(u getvalueindex))


现在,我应该找到如何向Microsoft提交错误。

通过报告Visual Studio错误。

我不确定这一点。CRT处理FlsGetValue的方式似乎不同于其他FLS函数。看起来CRT正在TLS(伪代码)中存储指向FlsGetValue函数的指针:


嗯。。。。把它贴在微软论坛这里…,有趣的错误。。。公平竞争。。。(提示:MSDN可能是你们在那边的最佳选择!)这个bug可能会在军舰世界中造成性能问题,如果有人能验证这一点,我们会非常感兴趣。这可能会导致AMD系统冻结/结巴。
void init_fls()
{
    FLS_GET_VALUE_PROC proc = GetProcAddress(kernel32, "FlsGetValue");
    if(!proc)
    {
        // FlsGetValue not implemented on this platform
        // use alternative implementation provided by CRT
        proc = __crtFlsGetValue;
    }
    // store pointer to FlsGetValue proc in TLS
    TlsSetValue(fls_get_value_index, proc);
}

void* get_fls_value(int index)
{
    // retrieve pointer to FlsGetValue proc from TLS
    FLS_GET_VALUE_PROC proc = TlsGetValue(fls_get_value_index);
    return proc(index);
}