Non nulle chaîne terminée - une erreur Klocwork sans raison compréhensible

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

  •  02-10-2019
  •  | 
  •  

Question

J'ai récemment installé « Klocwork » et essaie de se débarrasser des punaises sur un code existant. L'erreur ci semble être simple. Non nul à la fin du char * _p_. J'ai ajouté manuellement une terminaison nulle (même si il n'y a pas besoin), mais il ne plaît pas à l'Klocwork. Toutes les idées?

Le message exact est: -

  

string terminé de manière incorrecte ' p ' provoque un débordement de tampon dans 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_);   

=============================================== ============ Salut les gars, Merci pour vos réponses, mais il semble un peu plus obscur que cela. J'ai raffiné le code à ce simple cas: - Lorsque le code est écrit en une seule fonction il n'y a pas d'erreur, alors que, lorsque la section d'allocation est enveloppée dans une fonction (et un texte passé en paramètre) les retours d'erreur Klocwork. Voir ce code: - la version sans erreur: -

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

alors que lors de la prise entre le code / * ++++ * / et l'enveloppant dans une fonction retourne l'erreur ci-dessus Klocwork.

Par conséquent,

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

idées?

Était-ce utile?

La solution

Jonathan a raison. Nous avons récemment rompu ce contrôleur en deux familles qui pourraient l'expliquer mieux:

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

Nous sommes actuellement en cours de développement pour nettoyer et rendre plus facile à comprendre. Non seulement le problème mais la solution ainsi.

Autres conseils

Klocwork est correctement le problème diagnostiquait que vous pouvez être en train d'écrire avec un pointeur NULL si une allocation mémoire échoue:

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

À ce stade, le (horriblement nommé) variable « _p_ » est toujours nulle, mais vous aller de l'avant et l'utiliser dans l'opération d'impression ci-dessous.

Notez également que le correctif « trivial » d'ajouter « _p_ » après cette pause votre gestion de la mémoire; vous faites plus tard « free(_p_); » qui conduira à des problèmes horribles si les points de « _p_ » à la chaîne constante.

Vous avez aussi 'la mémoire dans fonction' dans le message. Et « nombre de paramètres mal » ne signifie à peu près la même chose que « nombre de paramètres », mais celui-ci est plus idiomatiques en anglais. Je ne suis pas convaincu que l'un des points d'exclamation sont utiles dans le message d'erreur; il y a un argument fort qu'ils devraient aller à l'extérieur des guillemets doubles autour du nom de la fonction même si l'un d'entre eux est jugé souhaitable.


Avec la version révisée du problème, je me demande si Klocwork est diagnostiquait ce que Microsoft dit de son vsnprintf () , qu'il ne garantit pas la résiliation nulle (ce qui est différent de ce que C99 et dit POSIX).

erreur de Klocwork à part, je pense que ce code est erroné. Pourquoi êtes-vous limiter les vsnprintf à 4096, alors que la taille de la mémoire tampon est SNMP_BUF_LEN? Comment ces deux liés les uns aux autres? Si SNMP_BUF_LEN <4096, vous avez peut-être simplement débordée votre tampon. Pourquoi ne pas passer SNMP_BUF_LEN comme argument limitant vsnprintf?

En outre, l'écriture à destStr[writtenchars] est suspect. Selon la variante de vsnprintf (ils varient), writtenchars pourrait être le nombre de caractères, il voulait pour écrire, ce qui serait de nouveau parce que vous écrire après la fin de votre tampon.

Que tous dit, Klocwork est pas parfait. Nous avons eu des macros qui étaient très explicitement essaient d'être en sécurité, et les mis-détectons Klocwork comme potentiellement la chaîne dépassement. Je pense que ce cas de snprintf ainsi.

Dans l'ensemble un bon produit, mais il ne reste quelques trous et vous ne pouvez pas résoudre toutes les plaintes de elle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top