Freigeben über


C6053

C6053

Warnung C6053: Durch den Aufruf von <Funktion> wird die Zeichenfolge <Variable> möglicherweise nicht mit 0 (null) beendet.

Diese Warnung gibt an, dass die angegebene Funktion auf eine Weise aufgerufen wurde, dass die sich ergebende Zeichenfolge möglicherweise nicht mit 0 (null) endet. Dieser Fehler kann einen als Angriffspunkt geeigneten Pufferüberlauf oder einen Absturz verursachen. Diese Warnung wird auch generiert, wenn eine mit Anmerkungen versehene Funktion eine Zeichenfolge erwartet, die mit 0 (null) endet (bei Verwendung der NullTerminated-Eigenschaft in der Pre-Bedingung), jedoch eine Zeichenfolge übergeben wird, die nicht mit 0 (null) endet.

Die meisten Funktionen zur Zeichenfolgenbehandlung in der C-Standardbibliothek und Win32 erfordern und erstellen Zeichenfolgen, die mit 0 (null) enden. Einige Counted String-Funktionen (u. a. strncpy, wcsncpy, _mbsncpy, _snprintf und snwprintf) erstellen keine Zeichenfolgen, die mit 0 (null) enden, wenn sie den zugehörigen Puffer exakt füllen. In diesem Fall geht ein nachfolgender Aufruf einer Zeichenfolgenfunktion, die eine Zeichenfolge erwartet, die mit 0 (null) endet, auf der Suche nach der 0 (null) über das Ende des Puffers hinaus. Das Programm sollte sicherstellen, dass die Zeichenfolge mit einer 0 (null) endet. Eine hilfreiche Methode besteht im Allgemeinen darin, eine Länge an die Counted String-Funktion zu übergeben, die um eins kleiner ist als die Größe des Puffers, und dann dem letzten Zeichen im Puffer explizit den Wert 0 (null) zuzuweisen.

Beispiel

Im folgenden Beispielcode wird diese Warnung generiert:

#include <string.h>
#define MAX 15

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

  // if strlen(szSource) > MAX, szDest will not be zero-terminated
  strncpy(szDest, szSource, MAX);  
  return strlen(szDest); // possible crash here
}

Um diese Warnung zu korrigieren, lassen Sie die Zeichenfolge mit einer 0 (null) enden, wie im folgenden Beispielcode dargestellt:

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

Im folgenden Beispielcode wird diese Warnung mithilfe der strncpy_s-Funktion zur sicheren Zeichenfolgenbearbeitung korrigiert:

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

Der folgende Code verwendet die Anmerkung, um Warnung C6053 zu generieren:

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

Diese Warnung wird manchmal bei bestimmten Ausdrücken generiert, die sich eigentlich in der Praxis bewährt haben. Aufgrund der Häufigkeit und der möglichen Folgen dieses Fehlers ist das Analysetool eher darauf ausgerichtet, potenzielle Probleme zu finden, als auf das sonst typische Reduzieren von Störungen.

Siehe auch

Referenz

NullTerminated
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

Konzepte

Übersicht über Anmerkungen