strncpy()
est censé protéger contre les débordements de tampon. Mais s'il empêche un débordement sans terminaison nulle, il est fort probable qu'une opération de chaîne ultérieure déborde. Donc pour se protéger contre cela, je me retrouve à faire :
strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';
man strncpy
donne :
El
strncpy()
est similaire, sauf que pas plus den
octets desrc
sont copiés. Ainsi, s'il n'y a pas d'octet nul parmi les premiersn
octets desrc
le résultat ne sera pas terminé par un caractère nul.
Sans mettre fin à quelque chose d'apparemment innocent comme.. :
printf( "FOO: %s\n", dest );
...pourrait s'écraser.
Existe-t-il des alternatives meilleures et plus sûres pour strncpy()
?
1 votes
Notez que sur MacOS X (BSD), la page de manuel dit (de '
extern char *strncpy(char * restrict s1, const char * restrict s2, size_t n);
') : La fonction strncpy() copie au maximum n caractères de s2 dans s1. Si la longueur de s2 est inférieure à n caractères, le reste de s1 est rempli de ``. \0 des personnages. Sinon, s1 n'est pas terminé.0 votes
Cela ne devrait-il pas être dest[LEN-1] = ' ? \0 ' ; ?
2 votes
Voici comment je pense que nous ferions une copie de la chaîne:int LEN = src.len ; str* dest = new char[LEN+1] ; strncpy( dest, src, LEN ) ; dest[LEN] = ' \0 ' ;
0 votes
Toujours utiliser memset sur la chaîne de destination est l'approche la plus sûre si vous êtes sûr que la taille de la chaîne ne dépassera pas la longueur du tampon de destination.
0 votes
Écrire votre propre fonction, je ne pense pas que cela soit une tâche difficile