2015-11-26 1 views
2

sys_errlist est un tableau pratique qui permet d'obtenir des descriptions statiques errno. L'alternative à cela est la fonction strerror_r, qui est disponible dans deux saveurs incompatibles confus. La version GNU de celui-ci renvoie char *, qui proviendrait du même tableau mentionné ci-dessus tant que l'erreur est connue, ou autrement à partir du tampon fourni par l'utilisateur. La version conforme aux normes de strerror_r renvoie à la place un int et utilise toujours le tampon fourni par l'utilisateur. Le problème est que ces deux fonctions partagent le même nom malgré des sémantiques complètement différentes, donc vous devez effectuer une vérification #ifdef plutôt complexe et écrire deux versions complètement différentes de votre code en fonction de la version que vous obtenez. En plus de cela, ces deux fonctions sont pires que sys_errlist, car les deux exigent que l'appelant fournisse un tampon "assez grand" pour contenir la description, même si la version GNU l'utiliserait rarement, et aucune des deux fonctions ne permet de savoir juste quelle devrait être la taille du tampon. Si à la place vous choisissez d'utiliser sys_errlist à la place, vous pouvez simplement vérifier si value >= sys_nerr et allouer le tampon seulement dans ce cas, juste pour mettre le Unknown error %d là par snprintf, et être fait.Pourquoi 'sys_errlist' est-il déprécié dans la glibc?

Étant donné que strerror_r est un gâchis horrible, incompréhensible et inefficace, pourquoi les développeurs GNU marque sys_errlist comme dépréciée, ce qui oblige effectivement un à utiliser soit strerrror_r ou d'observer l'avertissement laid chaque fois que le code est compilé?

Répondre

-2

strerror et son parent sont localisé. L'utilité d'un message système non localisé peut être discutée, mais les mainteneurs de glibc sont allés avec la direction dominante (Solaris et d'autres systèmes).

Cependant: sys_errlist a été déprécié pendant un certain temps. Ce n'est pas une interface POSIX. Certains systèmes ne l'ont pas.

Pour en savoir plus:

Il est depuis un certain temps c'était un problème, mais il était le cas que certains systèmes di d ne pas avoir strerror (voir Unix Incompatibility Notes: String and Memory Functions).

+0

Cela ne répond pas du tout à la question. 'sys_errlist' est un tableau statique et est complètement thread-safe. –

+0

Il y a beaucoup de choses non standard dans la glibc dont l'utilisation ne semble pas s'accompagner d'avertissements de désapprobation à la compilation – dragonroot

+0

Il existe une * ton * d'interfaces fournies par Glibc qui ne sont pas compatibles POSIX, et ne sont pas déconseillés. –