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


C6053

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

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

Для большинства стандартных функций библиотеки 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);
}

В следующем примере кода используется аннотация для создания предупреждения C6053:

#include<codeanalysis\sourceannotations.h>
using namespace vc_attributes;

void NotNullTerminatedStringReturned 
          (
           [Post(NullTerminated=No)] char* str
          )
{
  // code ...
}

void NullTerminatedStringRequired ([Pre(NullTerminated=Yes)] char* str)
{
  // code ...
}

void f (char* pC )
{
  NotNullTerminatedStringReturned(pC); //pC is not null terminated
  NullTerminatedStringRequired(pC); //requires null terminated pC
}

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

См. также

Ссылки

NullTerminated

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

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

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