Поделиться через


strict_gs_check

Эта директива #pragma обеспечивает усиленную проверку безопасности.

#pragma strict_gs_check([push,] on ) 
#pragma strict_gs_check([push,] off ) 
#pragma strict_gs_check(pop)

Заметки

Заставляет компилятор вставлять случайные объекты cookie в стек функции, помогая обнаруживать некоторые категории переполнения буфера на основе стека. По умолчанию параметр компилятора /GS (проверка безопасности буфера) обеспечивает вставку объектов cookie не для всех функций. Дополнительные сведения см. в разделе Параметр /GS (проверка безопасности буфера).

Для включения поверки strict_gs_check необходимо выполнять компиляцию с параметром /GS (проверка безопасности буфера).

Используйте эту директиву #pragma в модулях кода, которые могут получать потенциально вредоносные данные. Эта директива #pragma отличается очень агрессивным поведением и применяется к функциям, для которых подобная защита может не требоваться, но оптимизирована с целью минимального влияния на производительность конечного приложения.

Даже при использовании этой директивы #pragma следует стремиться к созданию защищенного программного кода. Обязательно убедитесь, что в коде нет ошибок переполнения буфера. Проверка strict_gs_check может помочь защитить приложение от ошибок переполнения буфера, не обнаруженных в коде.

Пример

В следующем коде переполнение буфера возникает при копировании массива в локальный массив. Если компилировать этот код с параметром /GS, объекты cookie не помещаются в стек, поскольку тип данных массива является указателем. Добавление директивы #pragma strict_gs_check вызывает принудительное помещение объектов cookie стека в стек функции.

// pragma_strict_gs_check.cpp
// compile with: /c

#pragma strict_gs_check(on)

void ** ReverseArray(void **pData,
                     size_t cData)
{
    // *** This buffer is subject to being overrun!! ***
    void *pReversed[20];

    // Reverse the array into a temporary buffer
    for (size_t j = 0, i = cData; i ; --i, ++j)
        // *** Possible buffer overrun!! ***
            pReversed[j] = pData[i]; 

    // Copy temporary buffer back into input/output buffer
    for (size_t i = 0; i < cData ; ++i) 
        pData[i] = pReversed[i];

    return pData;
}

См. также

Ссылки

Директивы Pragma и ключевое слово __Pragma

Параметр /GS (проверка безопасности буфера)