Nicht null-terminierten String - ein Klocwork Fehler ohne verständlichen Grund

StackOverflow https://stackoverflow.com/questions/3181018

  •  02-10-2019
  •  | 
  •  

Frage

Ich habe vor kurzem „Klocwork“ installiert und ich versuche, auf einem vorhandenen Code von Fehlern zu befreien. Der Fehler angezeigt scheint einfach zu sein. Nein null bei Beendigung des char * _p_. Ich habe manuell eine Null-Terminierung (obwohl es nicht notwendig) gegeben, aber es hat nicht den Klocwork gefallen. Irgendwelche Ideen?

Die genaue Nachricht ist: -

falsch beendet Zeichenfolge ' p ' führt zu einem Pufferüberlauf in p .

char *ptr;
int writtenchars = 0 ;
va_list args;  
char* destStr;

if (argc != 2) {
  printf(" wrong parameters number - %d instead of %d\n", argc, 2);
  char  str[25]="wrong parameters number ";
  char *_p_; /********************************************************/

  va_start(args, str);
  destStr = (char*) malloc(SNMP_BUF_LEN);
  _p_= destStr;
  if (destStr == NULL) {
    printf("WARNING: Failed to alloc memory in in function \"snmp_rebuildstringinbuf!!!\" \n");
    destStr="kukuRiko";
  }
  else {
    writtenchars = (int) vsnprintf(destStr, 4095, str, args);
    if (writtenchars>SNMP_BUF_LEN) {
      printf("WARNING: Too long string rebuilded in function \"snmp_rebuildstringinbuf!!!\" %d chars\n",writtenchars);
    }
    destStr[writtenchars] = '\0' ; //Moshe - making sure the last value of the string is null terminated in order to prevent future buffer overflows.
  }
  va_end(args);

  /******************************************************************************/
  //The KlocWork error relates to this line //

  logCWriteLog_msg(moduleId, level, __FILE__, __LINE__, _p_, ltrue); 
  free (_p_);   

=============================================== ============ Hallo Leute, Vielen Dank für Ihre Antworten, aber es scheint ein wenig dunkler als das. Ich habe den Code zu diesem einfachen Fall raffiniert: - Wenn der Code alle in einer Funktion es geschrieben wird, ist kein Fehler, wohingegen, wenn der Zuweisungsabschnitt in Abhängigkeit gewickelt wird (und ein Text als Parameter übergeben) die Klocwork Fehler zurückgibt. Sehen Sie diesen Code: - Version ohne Fehler: -

char *_p_; /*+++++++++++++++++++*/

 int writtenchars = 0 ;
 va_list args;  
 char* destStr;
 char* str = "hello World"; 
 va_start(args, str);
 destStr = (char*)malloc(SNMP_BUF_LEN);
 if (destStr == NULL) {
   printf("WARNING: Failed to alloc memory in function \n");
 }
 else {
   writtenchars = (int) vsnprintf(destStr, (SNMP_BUF_LEN) - 1, str, args);
 }

 /*+++++++++++++++++++*/
 _p_ = destStr ;
 if (_p_ != NULL) {
   logCWriteLog_msg(moduleId, level, __FILE__, __LINE__, _p_, ltrue); 
 }
 free (_p_);
 /***********************************************************/

wohingegen bei Einnahme des Code zwischen / * * ++++ / und in Abhängigkeit Umwickeln kehrt die oben Klocwork Fehler.

So

char *writingToSomeBuffer (char * str) {
  int writtenchars = 0 ;
  va_list args;  
  char* destStr;
  va_start(args, str);
  destStr = (char*)malloc(SNMP_BUF_LEN);
  if (destStr == NULL) {
    printf("WARNING: Failed to alloc memory in function \n");
  }
  else {
    writtenchars = (int) vsnprintf(destStr, (SNMP_BUF_LEN) - 1, str, args);
  }
  return destStr;
}

int main () {
  char *_p_;
  _p_ = writingToSomeBuffer("hello world");
  if (_p_ != NULL) {
    logCWriteLog_msg(moduleId, level, __FILE__, __LINE__, _p_, ltrue); 
  }
  free (_p_);
  return 0 ; 
}

irgendwelche Ideen?

War es hilfreich?

Lösung

Jonathan hat es richtig. Wir haben vor kurzem diesen checker in zwei Familien aufgeteilt, dass es besser erklären könnte:

http://www.klocwork.com/products /documentation/Insight-9.1/Checkers:NNTS.MIGHT http://www.klocwork.com/products/documentation/ Insight-9.1 / Checkers: NNTS.MUST

Wir sind derzeit in der Entwicklung dieses bis zu reinigen und leichter verständlich zu machen. Nicht nur das Problem, sondern die Lösung auch.

Andere Tipps

Klocwork ist die Diagnose richtig, das Problem, dass Sie mit einem Null-Zeiger schreiben, wenn die Speicherzuordnung fehlschlägt:

_p_= destStr;
if (destStr == NULL)
{
    printf("WARNING: Failed to alloc memory in in function ...\n");
    destStr = "kukuRiko";

An diesem Punkt der (schrecklich genannt) ‚_p_‘ Variable ist immer noch null, aber Sie gehen Sie voran und verwenden Sie es in dem Druckvorgang unter.

Beachten Sie auch, dass die ‚trivial‘ fix Hinzufügen ‚_p_‘ nach diesen Pausen Ihrer Speicherverwaltung; Sie später tun ‚free(_p_);‘, die zu schrecklichen Problemen führen, wenn ‚_p_‘ verweist auf den konstanten String.

Sie haben auch 'Speicher in Funktion' in der Nachricht. Und ‚falscher Parameter-Nummer‘ bedeutet ungefähr die gleichen wie ‚falsche Anzahl von Parametern‘, aber letztere ist idiomatisches Englisch. Ich bin nicht davon überzeugt, eine der Ausrufungszeichen ist hilfreich in der Fehlermeldung; gibt es ein starkes Argument, dass sie außerhalb der doppelten Anführungszeichen rund um die Funktionsnamen sogar wünschenswert, wenn einer von ihnen als gehen.


Mit der überarbeiteten Fassung des Problems, ich frage mich, ob Klocwork ist die Diagnose, was Microsoft sagt der vsnprintf () , dass dies nicht der Fall Garantie null-Terminierung (was von dem, was C99 unterscheidet und POSIX sagt).

Klocwork der Fehler beiseite, ich denke, dieser Code ist falsch. Warum beschränken Sie die vsnprintf bis 4096, während die Puffergröße SNMP_BUF_LEN ist? Wie gehen die beiden miteinander in Beziehung? Wenn SNMP_BUF_LEN <4096, dann können Sie Ihre Puffer nur überschwemmt haben. Warum würden Sie nicht SNMP_BUF_LEN als limitierender Argument in vsnprintf passieren?

Auch die Schreib zu destStr[writtenchars] suspekt. Je nach Variante von vsnprintf (sie variieren), writtenchars könnte die Zahl der Zeichen es wollte zu schreiben, was wiederum würde dazu führen, vorbei am Ende des Puffers zu schreiben.

Das ist alles gesagt, Klocwork nicht perfekt. Wir hatten Makros, die sehr explizit versuchen, um sicher zu sein, und Klocwork falsch erkannten sie als potenziell die Zeichenfolge Überholkupplung. Ich denke, dass ein snprintf Fall auch war.

Alles in allem ein gutes Produkt, aber es hat ein paar Löcher hat und Sie können alle Beschwerden des nicht beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top