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
}
Обратите внимание, что это предупреждение иногда возникает для определенных идиом, для которых гарантируется безопасность. Из-за частоты и последствий этой неполадки программа анализа настроена на поиск наибольшего числа неполадок такого типа вместо более тщательного отбора, используемого в прочих случаях.
См. также
Ссылки
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l