7
votes

Problème potentiel avec C caractères classique Standard Standard

Lorsque vous répondez à un commentaire à une autre réponse de la mine Ici , j'ai trouvé ce que je pense mai être un trou de la norme C (C1x, je n'ai pas vérifié les premiers et oui, je sais que c'est incroyablement Peu probable que je seuls parmi tous les habitants de la planète ait trouvé un bogue dans la norme). L'information suit:

  1. Section 6.5.3.4 ("Taille de l'opérateur") para 2 États "La taille de l'opérateur donne la taille (en octets) de son opérande" . .
  2. paragraphe 3 de cette section indique: "Lorsqu'il est appliqué à un opérande de type caractère, de caractère non signé, ou signé de char, (ou une version qualifiée de celle-ci) est le résultat est de 1" .
  3. Section 7.20.3.3 décrit Void * MALLOC (TAILLE_T SZ) Mais tout ce qu'il dit est "La fonction MALLOC attribue un espace pour un objet dont la taille est spécifiée et dont la valeur est indéterminée. ". Il ne fait aucune mention de tout ce que les unités sont utilisées pour l'argument.
  4. Annexe E State le 8 est la valeur minimale pour char_bit afin que les caractères puissent être plus d'une octet de longueur.

    Ma question est simplement ceci:

    Dans un environnement où un char est de 16 bits de large, MALLOC (10 * TAILLEOF (CHAR)) Allouer 10 caractères (20 octets) ou 10 octets? Le point 1 ci-dessus semble indiquer le premier, le point 2 indique ce dernier.

    Quelqu'un avec plus de C-standard-fu que moi a une réponse à cela?


0 commentaires

3 Réponses :


16
votes

dans un char environnement MALLOC (10 * Tailleof (Char)) allouera 10 Char S (10 octets), Parce que si Char est de 16 bits, cette architecture / implémentation définit un octet sous forme de 16 bits. Un Char n'est pas un octet, c'est un octet. Sur les ordinateurs plus anciens, cela peut être plus grand que le standard 8 Bit de facto nous avons aujourd'hui.

La section correspondante de la norme C suit:

3.6 termes, définitions et symboles

Byte - Unité adressable de stockage de données suffisamment grande pour contenir tout membre de l'ensemble de caractères de base de l'environnement d'exécution ...

Note 2 - Un octet est composé d'une séquence contiguë de bits, dont le nombre est défini par la mise en oeuvre.


7 commentaires

En fait, je pense que vous pouvez y avoir là. Sur la base de votre réponse, j'ai trouvé 3,6 (en «termes, définitions et symboles») indiquant «L'unité d'octet - Unité adressable de stockage de données suffisamment grande pour contenir tout membre de l'ensemble de caractères de base de l'environnement d'exécution ... Note 2 - Ayte est composé d'une séquence contiguë de bits, dont le nombre est défini par la mise en oeuvre ».


Damn, pensez à la gloire et aux accolades que j'aurais reçu pour avoir trouvé un problème dans la norme. Oh bien, retour au travail de la journée :-)


Encore une fois, je me trouve en train de répéter le "J'ai besoin d'obtenir une copie des normes" Mantra. Je vais ajouter votre citation de normes à ma réponse pour la complétude.


Voici le dernier projet Open-std.org/jtc1/ SC22 / WG14 / www / DOCS / N1362.PDF Mais cela ne fait pas nécessairement de votre vie que beaucoup plus facile.


Et le projet C ++ 0X aussi pour la complétude. Open-Std.org/jtc1/sc22/ WG21 / DOCS / Documents / 2009 / N2914.PDF


Notez que ce n'est pas seulement des ordinateurs «plus âgés» avec Char_bit> 8. Certains DSP ont 16, 32, voire 24 bits.


@Chris - Liens pour obtenir le (s) standard (s): Stackoverflow.com/questions/81656/...



1
votes

ne sont pas les unités de "Taille_T SZ" dans toute l'unité adressable de votre architecture? Je travaille avec un DSP dont les adresses correspondent à des valeurs 32 bits, pas d'octets. Malloc (1) me fait un pointeur sur une zone de 4 octets.


3 commentaires

En termes de libellé de la norme C, un "octet" sur cette architecture est de 32 bits. La norme C appelle un "octet" ne correspond pas nécessairement à une utilisation commune du mot (aujourd'hui).


Et pour la même raison, lorsque les normes de réseau signifient "8 bits", ils disent "octet", pas "octet". Ce n'est que dans les contextes de détail qu'un octet est sans ambiguïté 8 bits, comme dans "MB de bande passante", "GB de RAM", "TB de l'espace disque".


Ah, ça a du sens. Je suppose que nous sommes bloqués avec l'ambiguïté des avocats non linguistiques, car des mots comme des "mégaoctets" ou "kibioctets" ne fonctionnent pas particulièrement bien.



2
votes

dans la norme C99 La corrélation rigoureuse entre les octets, Char et la taille de l'objet est donnée dans 6.2.6.1/4 "Représentations de types - Général":

valeurs stockées dans des objets de champ non bits de tout autre type d'objet consiste en un n × char_bit bits, où n est la taille d'un objet de ce type, en octets. La valeur peut être copiée dans un objet de type non signé Char [n] (par exemple, par memcpy); L'ensemble résultant d'octets est appelé la représentation objet de la valeur.

Dans la norme C ++, la même relation est donnée dans 3,9 / 2 "Types":

Pour tout objet (autre qu'un sous-observateur de classe de base) de type POD Type T, si l'objet contient ou non une valeur valide de type T, les octets sous-jacents (1.7) constituent l'objet peuvent être copiés dans un tableau de Char ou non signé Char. Si le contenu du tableau de caractères ou non signé est copié dans l'objet, l'objet doit ensuite tenir sa valeur d'origine.

en C90, il ne semble pas être aussi corrélation mentionné explicitement, mais entre la définition d'un octet, la définition d'un caractère et la définition du Taille de l'opérateur L'inférence peut être faite. qu'un type char est équivalent à un octet.

Notez également que le nombre de bits dans un octet (et le nombre de bits dans un char ) est la mise en œuvre définie strictement, il n'a pas besoin d'être de 8 bits. Et un point oneby souligne dans un commentaire ailleurs que les DSP ont généralement des octets avec un certain nombre de bits qui ne sont pas 8.

Notez que l'IETF RFCS et les normes généralement (toujours?) Utilisez le terme «Octect» au lieu de «octet» pour être sans ambiguïté que les unités qu'ils parlent ont exactement 8 bits - plus non moins.


1 commentaires

+1. Il convient de mentionner que la norme définit la inférieure liée de char_bits mais pas la partie supérieure. Donc, il doit être au moins 8.