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


C6204

Предупреждение C6204: возможно переполнение буфера в вызове <функции>: используется непроверенный параметр <переменная>.

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

Рекомендуется проверить код и объекты, вызывающие функцию, чтобы узнать, можно ли вызвать функцию с непредвиденными данными. Если нет уверенности в том, что все вызовы безопасны, имеет смысл проверять входные данные функции путем проверки длины всех входных строк или путем аннотации параметра функции с помощью соответствующих свойств.

Пример

Это предупреждение возникает в следующем коде, поскольку входной параметр (pCh) может содержать недопустимые данные:

#include<string.h>

void f(char *pCh)
{
  char buff[10];
  strcpy(buff, pCh);
}

Это предупреждение можно исправить путем проверки размера, как показано в следующем примере кода:

#include<string.h>

void f(char *pCh)
{ 
  char buff[10];
  if (strlen(pCh) >= sizeof buff)
    return;
  strcpy (buff, pCh);
}

В приведенном выше коде мог возникнуть сбой при передаче неверного указателя (pCh). Чтобы сделать код более надежным, следует использовать аннотацию и функцию безопасной обработки строк, как показано ниже:

#include<string.h>
#include <codeanalysis\sourceannotations.h>
void f([Pre(NullTerminated=SA_Yes, Null=SA_No)] char* pCh)
{
  char buff[15];
  if (strlen(pCh) > sizeof buff)
    return;
  strcpy_s(buff,sizeof(buff), pCh);
}

Программа анализа не рассматривает набор всех возможных вызовов функции, поэтому код может считаться вполне безопасным.

См. также

Ссылки

strcpy_s, wcscpy_s, _mbscpy_s

Основные понятия

Общие сведения о заметках