88 votes

Utilisez-vous les fonctions 'safe' du TR 24731?

L'ISO C (comitéISO/IEC JTC1/SC21/WG14) a publié TR 24731-1 et travaille sur TR 24731-2:

TR 24731-1: Extensions de la Bibliothèque C de la Partie I: les Limites de la vérification des interfaces

WG14 est de travailler sur un TR sécurité fonctions de la bibliothèque C. Ce TR est orientée vers la modification des programmes existants, souvent par l'ajout d'un paramètre supplémentaire avec la longueur de la mémoire tampon. Le dernier projet en date est dans le document N1225. Une justification dans le document N1173. C'est pour devenir un Rapport Technique de type 2.

TR 24731-2: Extensions de la Bibliothèque C - Partie II: les fonctions d'allocation Dynamique

WG14 est de travailler sur un TR sécurité fonctions de la bibliothèque C. Ce TR est orientée vers de nouveaux programmes en utilisant l'allocation dynamique au lieu d'un paramètre supplémentaire pour la longueur de la mémoire tampon. Le dernier projet en date est dans le document N1337. C'est pour devenir un Rapport Technique de type 2.

Questions

  • Utilisez-vous une bibliothèque ou un compilateur avec le soutien de la TR24731-1 fonctions?
  • Si oui, le compilateur ou à la bibliothèque et sur quelle plate-forme(s)?
  • Avez-vous de découvrir des bugs comme un résultat de la fixation de votre code pour utiliser ces fonctions?
  • Les fonctions qui apportent le plus de valeur?
  • Il n'existe aucun qui n'apportent aucune valeur ou une valeur négative?
  • Êtes-vous planification de l'utilisation de la bibliothèque dans l'avenir?
  • Êtes-vous le suivi de l'TR24731-2 travail?

71voto

Robert Gamble Points 41984

J'ai été un critique virulent de ces TRs depuis leur création (quand c'était un seul TR) et de ne jamais les utiliser dans tous mes logiciels. Ils masquent les symptômes plutôt qu'aux causes et il est de mon avis que si tout ce qu'ils vont avoir un impact négatif sur la conception de logiciels, car ils fournissent un faux sentiment de sécurité au lieu de promouvoir des pratiques existantes qui peuvent atteindre les mêmes objectifs beaucoup plus efficacement. Je ne suis pas seul, en fait, je n'ai pas connaissance d'un seul promoteur à l'extérieur du comité de développement de ces TRs.

J'utilise de la glibc et comme tel, savoir que je vais être épargné d'avoir à traiter avec ce non-sens, comme Ulrich Drepper, le plomb responsable pour la glibc, dit sur le sujet:

Le projet de coffre-fort(r) de la bibliothèque C ISO ne parvient pas à répondre à la question complètement. ... Propose de rendre la vie d'une programmeur encore plus difficile n'est pas d'aller à de l'aide. Mais c'est exactement ce qui est proposé. ... Ils ont tous besoin de plus travail à faire ou sont tout simplement idiot.

Il poursuit en détail les problèmes avec un certain nombre de fonctions proposées, et a d'ailleurs indiqué que la glibc ne serait jamais l'appui de cette.

L'Austin Groupe (responsable du maintien de POSIX) a fourni une revue critique de la TR, leurs observations et le comité de réponses disponibles ici. L'Austin Groupe d'examen fait un très bon travail détaillant de nombreux des problèmes avec la TR, donc je n'entrerai pas dans les détails ici.

Donc la ligne du bas est la suivante: je n'utilisez pas une application qui prend en charge ou soutiennent, je n'ai pas l'intention de jamais l'utilisation de ces fonctions, et je ne vois aucune valeur positive dans le TR. Personnellement, je crois que la seule raison que le TR est encore en vie dans n'importe quelle forme est parce qu'il est poussé dur par Microsoft qui a récemment révélé très capable de faire les choses battu les normes comités malgré la large diffusion de l'opposition. Si ces fonctions sont jamais standardisé je ne pense pas qu'ils seront un jour devenir largement utilisé comme la proposition a été autour depuis quelques années maintenant et a échoué à recueillir tout réel soutien de la communauté.

35voto

Jonathan Leffler Points 299946

J'aime de Robert de réponse, mais j'ai aussi quelques points de vue sur les questions que j'ai soulevées.

  • Utilisez-vous une bibliothèque ou un compilateur avec le soutien de la TR24731-1 fonctions?

Non, je n'ai pas.

  • Si oui, le compilateur ou à la bibliothèque et sur quelle plate-forme(s)?

Je crois que les fonctions sont fournis par MS Visual Studio (MS VC++, Édition 2008, par exemple), et il y a des avertissements pour vous encourager à les utiliser.

  • Avez-vous de découvrir des bugs comme un résultat de la fixation de votre code pour utiliser ces fonctions?

Pas encore de. Et je ne vous attendez pas à découvrir de nombreuses dans mon code. Certains de l'autre code que j'ai de travailler avec - peut-être. Mais j'ai pas encore convaincue.

  • Les fonctions qui apportent le plus de valeur?

J'aime le fait que le printf_s() de la famille de fonctions de ne pas accepter le"%n' spécificateur de format.

  • Il n'existe aucun qui n'apportent aucune valeur ou une valeur négative?

L' tmpfile_s() et tmpnam_s() fonctions sont une horrible déception. Ils ont vraiment besoin de travailler plus comme mkstemp() qui à la fois crée le fichier et l'ouvre pour s'assurer il n'y a pas de TOCTOU (temps de vérifier, le temps de la consommation de la vulnérabilité. En l'état actuel, ces deux apportent que très peu de valeur.

Je pense aussi qu' strerrorlen_s() fournit très peu de valeur.

  • Êtes-vous planification de l'utilisation de la bibliothèque dans l'avenir?

Je suis dans deux esprits à ce sujet. J'ai commencé à travailler sur une bibliothèque qui permettrait de mettre en œuvre les capacités de TR 24731 sur une bibliothèque standard C, mais a été pris par le montant de l'unité de test nécessaires pour démontrer qu'il fonctionne correctement. Je ne suis pas sûr que ce soit de continuer. J'ai un code que j'ai envie de port pour Windows (principalement d'un pervers désir d'apporter un soutien sur toutes les plateformes, il travaille sur des dérivés d'Unix pour un couple d'années maintenant). Malheureusement, pour la compiler sans mise en garde de la MSVC compilateurs, je le plâtre le code avec des trucs pour éviter MSVC wittering sur moi, en utilisant le parfaitement fiable (utilisé avec précaution) fonctions de la bibliothèque C standard. Et ce n'est pas appétissant. Il est assez mauvais que je dois traiter avec plus de deux décennies d'un système qui s'est développé au cours de cette période, d'avoir à traiter avec l'idée de quelqu'un de plaisir (faire les gens à adopter TR 24731 quand ils n'ont pas besoin), c'est ennuyeux. C'est en partie pourquoi j'ai commencé le développement des bibliothèques, - de m'autoriser à utiliser les mêmes interfaces sur Unix et Windows. Mais je ne suis pas sûr de ce que je vais faire à partir d'ici.

  • Êtes-vous le suivi de l'TR24731-2 travail?

Je n'avais pas été suivi jusqu'à ce que je suis allé aux normes site lors de la collecte des données pour la question. L' asprintf() et vasprintf() fonctions sont probablement utile; j'avais de l'utiliser. Je ne suis pas certain à propos de la mémoire de flux I/O fonctions. Ayant strdup() normalisées au niveau C serait un énorme pas en avant. Cela semble moins sujet à controverse pour moi que la partie 1 (la vérification des limites) des interfaces.

Dans l'ensemble, je ne suis pas convaincu par la partie 1 de " Vérification de Limites des Interfaces. Le matériel contenu dans le projet de la partie 2 'Allocation Dynamique des Fonctions' est mieux.

Si ça ne tenait qu'à moi, je voudrais déplacer un peu le long de la lignes de la partie 1, mais je voudrais aussi révisé les interfaces dans le standard C99 bibliothèque C qui renvoient char * pour le début de la chaîne (par exemple, strcpy() et strcat()), de sorte qu'au lieu de retourner un pointeur sur le début, ils me renvoient un pointeur sur l'octet nul à la fin de la nouvelle chaîne. Cela permettrait de faire quelques expressions idiomatiques (comme à plusieurs reprises de la concaténation de chaînes sur la fin de l'autre) plus efficace, car cela permettrait de trivial à éviter l'équation du comportement par le code qui utilise à plusieurs reprises strcat(). Le remplacement serait tout de veiller à ce nul de terminaison de chaînes de sortie, comme le TR24731 versions ne. Je ne suis pas totalement opposé à l'idée de la vérification de l'interface, ni à l'exception des fonctions de gestion. C'est une affaire délicate.


Mise à jour (2011-05-08)

Voir également cette question. Malheureusement, et fatalement à l'utilité de la TR24731 fonctions, les définitions de certaines fonctions diffère entre la mise en œuvre de Microsoft et de la norme, les rendant inutiles (pour moi). Ma réponse il y a de la cites vsnprintf_s().

Par exemple, TR 24731-1 dit que l'interface vsnprintf_s() est:

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdarg.h>
#include <stdio.h>
int vsnprintf_s(char * restrict s, rsize_t n,
                const char * restrict format, va_list arg);

Malheureusement, MSDN dit que l'interface vsnprintf_s() est:

int vsnprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   va_list argptr 
);

Paramètres

  • tampon - emplacement de Stockage pour la sortie.
  • sizeOfBuffer - La taille de la mémoire tampon de sortie.
  • compter le nombre Maximum de caractères à écrire (n'incluant pas la valeur null), ou _TRUNCATE.
  • format - Format de spécification.
  • argptr - Pointeur vers la liste des arguments.

Notez que ce n'est pas simplement une question de type de cartographie: le nombre d'arguments fixes est différent, et donc inconciliables. Il est aussi clair pour moi (et sans doute pour la commission des normes trop) ce qu'il y a un avantage à avoir à la fois "sizeOfBuffer" et "compter"; il ressemble comme deux fois la même information (ou, au moins, le code sera habituellement écrit avec la même valeur pour les deux paramètres).

A l'origine, j'avais l'intention d'utiliser les fonctions comme un moyen d'obtenir un peu de code pour compiler proprement sur Windows et sous Unix, sans avoir à écrire de code conditionnel. Puisque c'est vaincu parce que Microsoft et ISO fonctions ne sont pas toujours les mêmes, c'est beaucoup de temps à donner.


ISO/IEC 9899:2011 - C11 Standard

La norme C11 (décembre 2010 Projet; vous pouvez obtenir une copie PDF de l'définitif de la norme ISO/IEC 9899:2011, à partir de la norme ANSI web store pour 30 USD) a la TR24731-1 fonctionne comme un élément facultatif de la norme. Ils sont définis dans l'Annexe K (vérification de Limites Interfaces), qui est "normatif", plutôt que "d'information", mais c'est facultatif.

Le C11 standard n'ont pas le TR24731-2 fonctions - ce qui est triste parce que l' vasprintf() de la fonction et de ses parents pourrait être vraiment utile.

Rapide résumé:

  • C11 contient TR24731-1
  • C11 ne contient pas de TR24731-2

9voto

cmaster Points 7460

Ok, maintenant un support pour TR24731-2:

Oui, j'ai utilisé asprintf()/vasprintf() depuis que j'ai vu dans la glibc, et oui, je suis un très bon défenseur.

Pourquoi? Parce qu'ils répondent précisément ce dont j'ai besoin encore et encore: Un puissant, souple, sûr et (relativement) facile à utiliser pour le format de n'importe quel texte dans un fraîchement chaîne alloué.

Je suis également très en faveur de la memstreams: Comme asprintf(), open_memstream() (pas fmemopen()!!!) alloue un tampon suffisamment larges pour vous et vous offre un FILE* pour faire vos travaux d'impression, de sorte que vos fonctions d'impression peut être tout à fait ignorants de savoir s'ils sont d'impression dans une chaîne ou un fichier, et vous pouvez tout simplement oublier la question, de combien d'espace vous aurez besoin.

5voto

user3080602 Points 46

Non, ces fonctions sont tout à fait inutiles et qui n'ont d'autre but que d'encourager code à écrire de sorte qu'il ne compile sous Windows.

snprintf est parfaitement en sécurité (lors de la mise en œuvre correctement) donc snprintf_s est inutile. strcat_s va détruire les données si la mémoire tampon est rempli (en désactivant la concaténé à la chaîne). Il y en a beaucoup d'autres exemples de l'ignorance complète de la façon dont les choses fonctionnent.

La vraie fonctions utiles sont les BSD strlcpy et strlcat. Mais Microsoft et Drepper ont rejeté ces pour leurs propres raisons égoïstes, au grand mécontentement des programmeurs C partout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X