Condividi tramite


Avviso C6053

La chiamata a 'function' potrebbe non terminare la stringa 'variable'.

Osservazioni

Questo avviso indica che la funzione specificata è stata chiamata in modo che la stringa risultante non venga terminata senza terminazione. Questo difetto può causare un sovraccarico o un arresto anomalo del buffer sfruttabile. Questo avviso viene generato anche se una funzione con annotazioni prevede una stringa con terminazione Null, ma si passa una stringa con terminazione non Null.

La maggior parte delle funzioni di gestione delle stringhe standard C e Win32 richiede e produce stringhe con terminazione zero. Alcune funzioni "stringhe con conteggio" (inclusi strncpy, , _snprintfwcsncpy_mbsncpy, e snwprintf) non producono stringhe con terminazione zero se riempiono esattamente il buffer. In questo caso, una chiamata successiva a una funzione stringa che prevede una stringa con terminazione zero andrà oltre la fine del buffer alla ricerca dello zero. Il programma deve assicurarsi che la stringa termini con zero. In generale, è necessario passare una lunghezza alla funzione "stringa con conteggiata" una minore delle dimensioni del buffer e quindi assegnare esplicitamente zero all'ultimo carattere nel buffer.

Nome dell'analisi del codice: MISSING_ZERO_TERMINATION1

Esempi

Il codice di esempio seguente genera questo avviso:

#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
}

Per correggere questo avviso, terminare zero-terminate la stringa come illustrato nel codice di esempio seguente:

#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);
}

Il codice di esempio seguente corregge questo avviso usando la funzione di manipolazione strncpy_s delle stringhe sicura:

#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);
}

Euristica

Questo avviso viene talvolta segnalato su alcuni idiomi garantito essere sicuro in pratica. A causa della frequenza e delle potenziali conseguenze di questo difetto, lo strumento di analisi è distorto a favore della ricerca di potenziali problemi invece della sua tipica distorsione della riduzione del rumore.

Vedi anche