gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:06:16 25 4
gpt4 key购买 nike

今天,我在检查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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com