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


Предупреждение C28750

Запрещено использование lstrlen и его вариантов: "*function-name" — это запрещенный API для улучшения обработки ошибок.

Это предупреждение указывает, что используется функция, которая была запрещена и имеет более надежную или безопасную замену. Эта конкретная ошибка указывает на использование lstrlen или его вариант.

Комментарии

Функция lstrlen и ее варианты запрещены, так как они не передают исключения. Это может привести к возникновению ошибок гораздо позже, возможно, в другом потоке. Это усложняет диагностику условий ошибок. Кроме того, эквивалентные замещающие функции могут быть оптимизированы компилятором и избежать издержек на производительность обработчиков исключений (__try и __except блоков).

Правильная мера заключается в использовании более безопасной функции длины строки (обычно strlen, wcslen, _tcslen). Однако при проверке изменений lstrlen следует убедиться, что буфер строк поступает из доверенного кода. Если вы работаете с ненадежными данными, вместо этого следует переключиться из семейства функций strlen в семейство strnlen (или семейство StringCchLength), что позволит гарантировать, что они не будут заходить за границы блока ненадежных данных.

Обратите внимание, что в отличие от lstrlen, ни одна из замен не перехватывает исключения. Кроме того, lstrlen обрабатывает указатели NULL, а замены — нет, поэтому при замене lstrlen на strlen или strnlen требуется явное проверка NULL (если в этом месте кода возможны пустые указатели).

Список всех запрещенных функций, на которые распространяется эта ошибка, и рекомендуемые замены (как для доверенных, так и для ненадежных данных) можно найти в следующем примере.

Имя анализа кода: BANNED_API_USAGE_LSTRLEN

Пример

Следующий код создает это предупреждение:

int example_func(char* in)
{ 
    int size = lstrlen(in);
    return size; 
} 

Это связано с использованием небезопасной функции lstrlen. Чтобы устранить эту проблему, мы можем использовать strlen в качестве замены, убедившись, что проверка, если указатель имеет значение NULL:

int example_func(char* in) 
{ 
    if (in != NULL) {
        int size = strlen(in);
        return size;
    }
    else {
        // handle error.
    }
} 

Запрещенные функции

Запрещенный API Доверенные замены данных Ненадежные замены данных
lstrlen _tcslen _tcsnlen, StringCchLength
lstrlenA strlen strnlen, StringCchLengthA
lstrlenW wcslen wcsnlen, StringCchLengthW