Non nullo stringa che termina - un errore di KlocWork senza motivo comprensibile

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

  •  02-10-2019
  •  | 
  •  

Domanda

Recentemente ho installato "klocwork" e sto cercando di sbarazzarsi di insetti su un codice esistente. L'errore indicato sembra essere semplice. No null al termine della char * _p_. Ho aggiunto manualmente una terminazione null (anche se non è necessario), ma non piacere al Klocwork. Tutte le idee?

Il messaggio esatto è: -

  

stringa non correttamente terminata ' p ' causa un buffer overflow 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_);   

=============================================== ============ Ciao ragazzi, Grazie per le vostre risposte, ma sembra un po 'più oscura di quella. Ho affinato il codice per questo semplice caso: - Quando il codice è scritto tutto in una funzione non v'è alcun errore, che, quando la sezione di assegnazione è avvolto in una funzione (e un testo passato come parametro) l'errore si Klocwork. Vedere questo codice: - versione senza un errore: -

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_);
 /***********************************************************/

che, quando prende il codice tra / * * ++++ / e avvolgendolo in una funzione restituisce l'errore sopra KlocWork.

Quindi,

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

tutte le idee?

È stato utile?

Soluzione

Jonathan ha ragione. Recentemente abbiamo rotto questo correttore in due famiglie che potrebbe spiegare meglio:

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

Siamo attualmente in fase di sviluppo per pulire questo in su e rendere più facile da capire. Non solo il problema ma la soluzione pure.

Altri suggerimenti

KlocWork sia correttamente diagnosticare il problema che si può essere iscritto con un puntatore nullo se l'allocazione di memoria non riesce:

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

A questo punto, la variabile (denominata orribilmente) '_p_' è ancora nulla, ma di andare avanti e usarlo nella operazione di stampa in basso.

Si noti inoltre che la correzione 'banale' di aggiungere '_p_' dopo questo spezza il di gestione della memoria; più tardi fa 'free(_p_);' che porterà a problemi di orribili se '_p_' indica la costante di stringa.

È inoltre hanno 'di memoria in la funzione' nel messaggio. E 'il numero parametri errati' vuol dire più o meno lo stesso di 'un numero errato di parametri', ma il secondo è più idiomatica inglese. Non sono convinto nessuno dei punti esclamativi sono utili nel messaggio di errore; v'è un argomento forte che dovrebbero andare al di fuori delle virgolette doppie che circondano il nome della funzione, anche se uno di loro è considerato desiderabile.


Con la versione rivista del problema, mi chiedo se è Klocwork diagnosticare ciò che Microsoft dice della sua vsnprintf () , che non fa nulla cessazione della garanzia (che è diverso da quello che C99 e POSIX dice).

L'errore di Klocwork a parte, penso che questo codice è sbagliato. Perché si stanno limitando il vsnprintf al 4096, mentre la dimensione del buffer è SNMP_BUF_LEN? Come fanno quei due legati gli uni agli altri? Se SNMP_BUF_LEN <4096, allora si può avere solo in overflow il buffer. Perché non si passa SNMP_BUF_LEN come argomento limitante in vsnprintf?

Inoltre, la scrittura per destStr[writtenchars] è sospetto. A seconda della variante di vsnprintf (che variano), writtenchars potrebbe essere il numero di caratteri è ha voluto di scrivere, che ancora una volta la causa di scrivere oltre la fine del buffer.

Che tutti Detto questo, Klocwork non è perfetto. Abbiamo avuto le macro che sono stati molto esplicitamente cercando di essere al sicuro, e Klocwork mis-rilevato loro come potenzialmente sovraccaricare la stringa. Credo che sia stato un caso snprintf pure.

Nel complesso un buon prodotto, ma ha un paio di buche e non è possibile risolvere tutti i suoi reclami.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top