2010-05-11 3 views
4

dire -Comment empêcher un débordement de tampon de pointeur de caractère?

int function(char* txt) 
{ 
    sprintf(txt, "select * from %s;", table); 
    //How do I set last char in buffer to NULL here? 
} 

donc si le texte dans le tableau d'une façon était de 500 caractères de long et txt dans la principale a été définie que 100 ....

merci.

+11

J'espère que le texte de la table ne provient pas des tables Bobby –

+3

NUL est le caractère '\ 0', NULL est un pointeur qui n'est pas initialisé. – detly

Répondre

11

Vous devez

  • ajouter un paramètre à la fonction qui donne la taille de la mémoire tampon
  • utilisation snprintf() au lieu de sprintf()
  • vérifier la valeur de retour de snprintf() pour voir la taille de la mémoire tampon nécessaire être pour contenir toutes les données formatées; si elle est supérieure ou égale à la taille de la mémoire tampon, vous devez gérer cela comme bon vous semble (le tampon sera toujours terminé par un caractère nul, mais le contenu sera tronqué pour s'adapter, si cela est correct ou si une erreur dépend entièrement sur votre cas, utilisez)

(et votre fonction a besoin d'un type de retour ...)

+0

Merci, je n'étais pas sûr s'il y avait un autre moyen. –

3

Vous devriez pouvoir utiliser snprintf pour limiter la quantité de la mémoire tampon qui est utilisé.

function(char* txt, size_t length) 
{ 
    int rv; 
    rv = snprintf(txt, length, "select * from %s;", table); 
    //How do I set last char in buffer to NULL here? 
    if (rv >= length) { 
     // error 
    } 
} 
+1

Vous devez vérifier la valeur de retour de 'snprintf()' si - truncation dans le cas où il s'agit clairement d'une erreur qui doit être gérée. – caf

+0

@caf merci; actualisé. – WhirlWind

0

La seule chose que vous pouvez faire est assez de mémoire malloc, formater la chaîne dans cette mémoire, et renvoie un pointeur vers elle. La fonction appelante serait alors responsable de libérer la mémoire quand elle est faite avec elle.

+0

Vous pouvez faire beaucoup plus que cela. – WhirlWind

Questions connexes