Предупреждение 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 |