Condividi tramite


C6053

avviso C6053: la chiamata a <funzione> non può terminare con zero la stringa <variabile>

L'avviso indica che la funzione specificata è stata chiamata in modo tale che la stringa risultante non possa terminare con zero. Questo problema potrebbe provocare un arresto anomalo o un sovraccarico del buffer. L'avviso viene generato, inoltre, se a una funzione annotata che prevede una stringa che termini con null (che utilizza la proprietà NullTerminated nella relativa condizione Pre) viene passata una stringa che non termina con null.

La maggior parte delle funzioni di gestione delle librerie standard in linguaggio C e delle stringhe Win32 richiedono e producono stringhe che terminano con zero. Alcune funzioni di 'stringa calcolata', incluse strncpy, wcsncpy, _mbsncpy, _snprintf e snwprintf, non producono stringhe che terminano con zero se occupano esattamente il relativo buffer. In tal caso, una chiamata successiva a una funzione di stringa che prevede una stringa che termina con zero supererà la fine del buffer alla ricerca del valore zero. Il programma dovrebbe accertarsi che la stringa termini con zero. In generale un approccio utile prevede il passaggio di una lunghezza alla funzione di 'stringa calcolata' di una dimensione più piccola rispetto alla dimensione del buffer e quindi l'assegnazione esplicita di zero all'ultimo carattere del buffer.

Esempio

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 risolvere il problema, terminare la stringa con zero come indicato 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 risolve il problema utilizzando la funzione strncpy_s di modifica delle stringhe protette:

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

Il codice riportato di seguito utilizza l'annotazione per generare l'avviso 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
}

Si noti che questo avviso viene talvolta visualizzato per alcuni linguaggi che nella pratica sono garantiti come protetti. Date la frequenza e le possibili conseguenze di questo errore, lo strumento di analisi viene indirizzato alla ricerca dei possibili problemi invece di seguire la tipica inclinazione a ridurre le segnalazioni.

Vedere anche

Riferimenti

NullTerminated

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Concetti

Cenni preliminari sull'annotazione