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


C6053

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

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

Для большинства стандартных функций библиотеки C и функций обработки строк Win32 требуются строки, оканчивающиеся нулем; в результате работы этих функций получаются такие же строки.Несколько функций "считанных строк" (включая strncpy, wcsncpy, _mbsncpy, _snprintf и snwprintf) не производят строки, оканчивающиеся нулем, если они заполняют свой буфер.В этом случае последующий вызов строкой функции, ожидающей строку, оканчивающуюся нулем, выйдет за пределы буфера в поисках нуля.В программе следует реализовать проверку того, что строка заканчивается нулем.Это можно сделать так: передать функции "считанной строки" длину, меньшую, чем размер буфера, и явным образом присвоить нуль последнему знаку буфера.

Пример

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

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX);  
  return strlen(szDest); // possible crash here
}

Чтобы исправить это предупреждение, следует завершать строки нулем, как показано в следующем примере кода:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX-1);
  szDest[MAX-1]=0;
  return strlen(szDest);
}

В следующем примере кода это предупреждение исправлено благодаря функции безопасной обработки строк strncpy_s:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource= "Hello, World!";

  strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));  
  return strlen(szDest);
}

Обратите внимание, что это предупреждение иногда возникает для определенных идиом, для которых гарантируется безопасность.Из-за частоты и последствий этой неполадки программа анализа настроена на поиск наибольшего числа неполадок такого типа вместо более тщательного отбора, используемого в прочих случаях.

См. также

Ссылки

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Другие ресурсы

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

NullTerminated