1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| /*
double_whitespaces:
Copy the "msg" buffer of size "size" into the "dest" buffer,
while doubling any blank character found in the source buffer.
*/
int double_whitespaces(char *msg, int size, char *dest) {
int ret;
char *ptr;
char *buf;
buf = malloc(size); // 1- retour de malloc non testé
// 2- test de size à >0 non fait
ptr = msg; // 3- test de msg != NULL non fait :
while (ptr < msg + size) { // si msg== NULL, plantage sur *ptr
if (*ptr == '%') // % char is forbidden
goto error;
if (*ptr == ' ') {
*buf++ = ' '; // 4- adresse d'allocation (buf) détruite. le free(buf) va planter. Utiliser un autre
// pointeur pbuff initialisé à buff
*buf++ = ' '; // 5- taille d'allocation potentiellement trop faible : écriture de deux char quelquefois
// dans buf pour un des size char (*ptr)
} else {
*buf++ = *ptr;
}
ptr++;
}
free(buf);
strcpy(dest, buf); // 6- dest à NULL non testé + remarques ci-dessous sur l'ensemble du programme
// 7- L'utilisation de strcpy() indique que le programme traite des chaines de
// caractères (terminées par 0). Dans ce cas, il est clair que size est la
// taille du buffer dest, ce qui correspond bien à la taille allouée pour buf
// Le test du while() est alors faux : Si msg est de longueur inférieure à size
// alors, on dépasse la fin de msg et le programme est faux (notamment le test
// à '%' peut arrêter la fonction sans raison) et peut planter (dépassement du buffer msg).
// Si msg est de longueur supérieure à size, alors le zéro terminal n'est pas inscrit dans buf
// et le strcpy() est faux.
// Le test doit porter sur *ptr != '\0' ET pbuff < buff+size-1 + inscription du 0
// terminal en buff[size-1]
// Pourquoi ne pas écrire directement dans dest et passer par buff ? Parce que la chaine
// ne doit être modifiée en cas de présence d'un '%'
return 0;
error:
return -1; // 8 - fuite mémoire : pas de free(buf)
} |
Partager