Сегодня я проверял исходный код библиотеки CRT в Visual Studio 2008 и 2010 и обнаружил ошибку в файле mtdll.h.Проблема с макросом FLS_GETVALUE.В системах x86 этот макрос вызывает непосредственно TlsGetValue вместо вызова функции, назначенной переменной gpFlsGetValue.
Прежде всего, это проблема, потому что FlsAlloc, FlsGetValue, FlsFree и FlsSetValue доступны не во всех системах (Windows Vista + и Windows Server 2003+).Эти функции ведут себя как TlsAlloc, TlsGetValue, TlsFree и TlsSetValue, но поддерживают Fibers (вид пользовательского потока).Поскольку мы предпочитаем использовать функции Fls * вместо функций Tls, библиотека времени выполнения C VS проверяет, доступны ли функции Fls при загрузке процесса или dll, и инициализирует переменные gpFls *.Если Fls * недоступны, CRT инициализирует эти переменные с эквивалентными функциями Tls *.
Вы не можете использовать макрос FLS_GETVALUE непосредственно в коде, потому что он используется внутри библиотеки времени выполнения.Среда выполнения использует этот макрос для инициализации для каждого потока данных библиотеки времени выполнения.
Мой вопрос касается влияния этой ошибки.Я знаю, что оптоволокно широко не используется, но если вы разрабатываете 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.