c++ - 发现问题: Visual Studio CRT library : FLS_GETVALUE

标签 c++ c visual-studio msvcrt crt

今天,我在检查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 提交错误。

最佳答案

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

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);
}

关于c++ - 发现问题: Visual Studio CRT library : FLS_GETVALUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5711251/

相关文章:

c - 如何限制服务器上的 C 函数在任何时刻最多运行该函数的一个实例?

c# - 如何检查 pdb 文件是否对调试程序集有效

visual-studio - 为什么 PostSharp 禁用调试?

c++ - 在单个变量中检索不同的 Qmap

c++ - 在 Eigen Solver 中从 Vector 中检索值

c - C中指针的声明

c++ - 乘以定义的符号: mysqlclient, pthread-win32

c++ - 使用 CRTP 模式时继承的模糊方法

c++ - 如何从 Qt 中的函数引用表单并更改属性(高度和宽度)

调用不带参数的带参数的C函数