Обнаружена проблема: библиотека Visual Studio CRT: FLS_GETVALUE - PullRequest
0 голосов
/ 19 апреля 2011

Сегодня я проверял исходный код библиотеки 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.

Ответы [ 2 ]

0 голосов
/ 19 апреля 2011

Я не уверен в этом. Кажется, CRT обрабатывает FlsGetValue не так, как другие функции FLS. Похоже, что CRT хранит указатель на функцию FlsGetValue в TLS (псевдокод):

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);
}
0 голосов
/ 19 апреля 2011

Сообщить об ошибках Visual Studio через Microsoft Connect .

...