OVH Cloud OVH Cloud

Comportement indéfini ou pas ?

40 réponses
Avatar
David Côme
Bonjour à tous.
Est ce que ce code à un comportement indéfini ?

//iostream est inclue , ...
int a; //(1)
cout<< a; // (2)

Pour ma part:
Je pense que la valeur de a est indéfinie car (1) créer une variable sur
la pile sans lui affecter de valeur.
Elle prend donc la valeur de ce qui se trouvait avant à cette place.
Il n'y a pas de moyen de connaitre cette valeur. La valeure de a est
indéfini même si certain compilo réalisé une affectation par défaut
(je pense à VC++ en mode débug , on peut confirmer ?)

Par contre la 2eme ligne, elle a un comportement totalement défini.Elle va
afficher la valeur de a, qui peut être n'importe quoi.

Suis-je dans le vrai ?

Merci.

10 réponses

1 2 3 4
Avatar
Jean-Marc Bourguet
James Kanze writes:

Comme j'ai déjà dit ailleurs, j'ai réelement vu le cas où lire
de la mémoire qu'on n'avait jamais écrite pourrait provoquer un
plantage. Mais dans ce cas-là, il suffisait d'y avoir écrit une
fois, depuis la mise sous tension du système. En revanche, il y
avait bien les anciens processeurs de Burroughs/Unisys, qui
avait une architecture tagguée. En particulier, un entier
n'était qu'un virgule flottant avec le champs exposant à 0
(c-à-d 48 bits, avec 8 bits obligatoirement à 0, et magnitude
signée, en plus). Il n'y avait qu'une seule instruction add, par
exemple, qui fonctionnait à la fois pour les flottants et les
entiers, selon les valeurs qu'on lui donnait. Je ne sais pas ce
qui passait si tu mettais des bits d'un flottant dans une
variable de type entier en C, mais ça m'étonnerait que ce soit
quelque chose de bien prévisible.


De mémoire, il y a des interruptions quand c'est utilisé pour de
l'indexage. C'est à cette architecture que je faisais allusion aussi.
Mais j'avais oublié que c'était une machine à tag (en plus des 48 bits de
données, il y a quelques bits de tag) et un tag est prévu pour les données
non initialisées, avec interruption si utilisation.

C'est la plus vieille architecture encore en service. Les suivantes sont
celle de Sperry (aussi chez Unisys) et IBM 360.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
James Kanze
On Feb 29, 7:25 pm, Jean-Marc Bourguet wrote:
James Kanze writes:
Comme j'ai déjà dit ailleurs, j'ai réelement vu le cas où lire
de la mémoire qu'on n'avait jamais écrite pourrait provoquer un
plantage. Mais dans ce cas-là, il suffisait d'y avoir écrit une
fois, depuis la mise sous tension du système. En revanche, il y
avait bien les anciens processeurs de Burroughs/Unisys, qui
avait une architecture tagguée. En particulier, un entier
n'était qu'un virgule flottant avec le champs exposant à 0
(c-à-d 48 bits, avec 8 bits obligatoirement à 0, et magnitude
signée, en plus). Il n'y avait qu'une seule instruction add, par
exemple, qui fonctionnait à la fois pour les flottants et les
entiers, selon les valeurs qu'on lui donnait. Je ne sais pas ce
qui passait si tu mettais des bits d'un flottant dans une
variable de type entier en C, mais ça m'étonnerait que ce soit
quelque chose de bien prévisible.


De mémoire,


Tu l'as réelement programmé. J'avoue ne le connaître moi-même
que de ouï-dire. (Enfin, prèsque. En 1967, j'ai pris un cours de
programmation à Georgia Tech, et il avait un Burroughs. Mais la
programmation était en Fortran, et on n'a rien vu de
l'architecture.)

il y a des interruptions quand c'est utilisé pour
de l'indexage. C'est à cette architecture que je faisais
allusion aussi. Mais j'avais oublié que c'était une machine à
tag (en plus des 48 bits de données, il y a quelques bits de
tag) et un tag est prévu pour les données non initialisées,
avec interruption si utilisation.

C'est la plus vieille architecture encore en service. Les
suivantes sont celle de Sperry (aussi chez Unisys) et IBM 360.


Je crois que celle de Sperry est encore plus ancienne. Au moins,
Sperry fabriquait les ordinateurs bien avant Burroughs. Et quant
à « en service », je ne sais pas. Ça fait quelque années
maintenant qu'elle a disparu du catalogue d'Unisys.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Sylvain
Olivier Miakinen wrote on 29/02/2008 13:13:
même dans ce cas je n'arrive pas à imaginer une valeur spéciale faisant
traper l'injecteur.


As-tu lu le premier article de Jean-Marc Bourguet dans ce fil ?


oui.

<cit.>
il y a eu une machine n'ayant que des nombres en virgule flottante, mais
où certaines opérations trappaient si une donnée n'était pas entière
</cit.>


?!??
il y a eu une époque où les hommes vivaient dans des cavernes ...
écrire du code sur un PC devrait être interdit car incompatble
avec les moyens de cette époque ?

Sylvain.


Avatar
Sylvain
James Kanze wrote on 29/02/2008 09:50:

lorsqu'elle est lue, or pour que le code: "int x; cout << x;"
soit lu en mémoire et fourni au CPU, il faut qu'il ait été
écrit dans cette mémoire,


Où ça ?


boulette!, la (mémoire de la) pile est juste allouée, pas écrite en effet.

Tu prétends que c'est impossible ? Est-ce que tu peux te
mettre dans la tête que je parle ici d'expérience. [...]


oui merci je comprends très bien que tu parles de *ton* expérience.

Sylvain.


Avatar
Jean-Marc Bourguet
James Kanze writes:

On Feb 29, 7:25 pm, Jean-Marc Bourguet wrote:
James Kanze writes:
Comme j'ai déjà dit ailleurs, j'ai réelement vu le cas où lire
de la mémoire qu'on n'avait jamais écrite pourrait provoquer un
plantage. Mais dans ce cas-là, il suffisait d'y avoir écrit une
fois, depuis la mise sous tension du système. En revanche, il y
avait bien les anciens processeurs de Burroughs/Unisys, qui
avait une architecture tagguée. En particulier, un entier
n'était qu'un virgule flottant avec le champs exposant à 0
(c-à-d 48 bits, avec 8 bits obligatoirement à 0, et magnitude
signée, en plus). Il n'y avait qu'une seule instruction add, par
exemple, qui fonctionnait à la fois pour les flottants et les
entiers, selon les valeurs qu'on lui donnait. Je ne sais pas ce
qui passait si tu mettais des bits d'un flottant dans une
variable de type entier en C, mais ça m'étonnerait que ce soit
quelque chose de bien prévisible.


De mémoire,


Tu l'as réelement programmé.


Non, c'est pas du tout mon monde mais je m'intéresse à l'architecture des
ordinateur. J'ai lu beaucoup mais utilisé beaucoup moins. L'architecture
la plus exotique que j'ai utilisé, c'est les PDP-10.

C'est la plus vieille architecture encore en service. Les
suivantes sont celle de Sperry (aussi chez Unisys) et IBM 360.


Je crois que celle de Sperry est encore plus ancienne.


Mise en service du B5000 en 1961, de la série 1100 d'Univac en 1962.

Au moins, Sperry fabriquait les ordinateurs bien avant Burroughs.


Exact.

Et quant à « en service », je ne sais pas. Ça fait quelque années
maintenant qu'elle a disparu du catalogue d'Unisys.


Sur leur page web, tu prends mainframe et tu as accès aux MCP Mainframes
(qui doivent être les descendants du B5000) et aux OS2200 Mainframes (qui
doivent être les descendants de l'univac 1100). J'ai pas eu le temps de
fouiller pour confirmer, leur site est mal fait si on cherche des détails
techniques.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
James Kanze
On 1 mar, 14:52, Jean-Marc Bourguet wrote:
James Kanze writes:
C'est la plus vieille architecture encore en service. Les
suivantes sont celle de Sperry (aussi chez Unisys) et IBM 360.


Je crois que celle de Sperry est encore plus ancienne.


Mise en service du B5000 en 1961, de la série 1100 d'Univac en 1962.


La question, évidemment, c'est : est-ce que la série 1100
d'Univac n'est qu'une prologation d'une architecture antérieur ?
Mais à vrai dire, il n'y a pas de raisons de le supposer, étant
donner la façon que les ordinateurs étaient développés alors.

Au moins, Sperry fabriquait les ordinateurs bien avant Burroughs.


Exact.

Et quant à « en service », je ne sais pas. Ça fait quelque
années maintenant qu'elle a disparu du catalogue d'Unisys.


Sur leur page web, tu prends mainframe et tu as accès aux MCP
Mainframes (qui doivent être les descendants du B5000) et aux
OS2200 Mainframes (qui doivent être les descendants de
l'univac 1100). J'ai pas eu le temps de fouiller pour
confirmer, leur site est mal fait si on cherche des détails
techniques.


En effet. Je ne faisais que répéter ce que j'ai entendu
(j'oublie même où). Mais en cherchant, j'en ai trouvé une « C
Programming Reference Manual », avec un tableau (2-1) « Summary
of Basic Data Types and Data Type Specifiers », avec char en 8
bits (1 byte), float et double en 48 bits (1 word), long double
en 96 bits (2 words) et tous les autres types integraux en 48
bits (1 word). Et plus tard, un tableau 2-4 « Size and Range of
Plain and Signed Integer Types », avec l'intervale pour tous
(sauf les types caractère) de « 1-2**39 to 2**39-1 » (c-à-d
-549755813887 à 549755813887 -- ce n'est pas du complément à 2,
et ce ne se sert pas de tous les 48 bits), et tableau 2-5 pour
les unsigned, avec l'intervale 0 à 2**39-1 -- on rémarque bien
que UINT_MAX == INT_MAX.

L'intervale des flottans est assez curieux aussi : 8.75811540204E-47
to
4.31359146674E68. (En représentation binaire, ça ferait un
intervale de 380 pour les exposants. Une valeur plutôt bizarre,
à mon avis, et qui aurait besoin de plus que les huit bits
réservés dans les 48 par les entiers.)

Enfin, pour ceux qui s'y intéressent, j'ai trouvé cette
documentation, et un tas d'autres documentations, à
http://public.support.unisys.com/common/epa/documentationlibraries.aspx.
(Et en passant, il y a encore des manuals d'Algol. Je rappelle
que le language de programmation préféré dans cet environement,
c'était bien l'Algol.)

Si j'ai bien compris la site, dans les produits haut de gamme,
c'est réelement implémenté dans le hardward ; dans les produits
bas de gamme, c'est plutôt émulé par une machine virtuelle.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
James Kanze
On 2 mar, 12:03, James Kanze wrote:
On 1 mar, 14:52, Jean-Marc Bourguet wrote:
En effet. Je ne faisais que répéter ce que j'ai entendu
(j'oublie même où). Mais en cherchant, j'en ai trouvé une « C
Programming Reference Manual »,


Une autre chose intéressante ; dans une annexe au document
cité : « The default character set is EBCDIC. ». Le titre de
l'annexe est bien « Getting Source Onto A Series Systems », ce
qui démontrait bien qu'il s'agit de l'architecture Séries A.
(Toute la documentation commercielle a été mis à jour, avec MCP,
mais les techniciens continuent à l'appeler par son nom
original.)

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Jean-Marc Bourguet
James Kanze writes:

On 1 mar, 14:52, Jean-Marc Bourguet wrote:
James Kanze writes:
C'est la plus vieille architecture encore en service. Les
suivantes sont celle de Sperry (aussi chez Unisys) et IBM 360.


Je crois que celle de Sperry est encore plus ancienne.


Mise en service du B5000 en 1961, de la série 1100 d'Univac en 1962.


La question, évidemment, c'est : est-ce que la série 1100
d'Univac n'est qu'une prologation d'une architecture antérieur ?
Mais à vrai dire, il n'y a pas de raisons de le supposer, étant
donner la façon que les ordinateurs étaient développés alors.


J'ai voulu revoir mes sources et elles semblent incohérentes. J'ai pas le
temps de recouper et de voir ce qu'il en est exactement (sur d'autres
sources encore comme bitsaver qui a des scan de pas mal de manuels). La
série 1100 d'Univac a l'air de dater des années 50, mais certains modèles
ont l'air de ne pas être de la même architecture que les autres (machines
24 bits et 36 bits par exemple). Les architectures Univac plus vieilles
(Univac I et II) m'ont l'air d'être totalement différentes (purement basées
sur les caractères, avec un mot de 12 caractères).

Enfin, pour ceux qui s'y intéressent, j'ai trouvé cette documentation, et
un tas d'autres documentations, à
http://public.support.unisys.com/common/epa/documentationlibraries.aspx.
(Et en passant, il y a encore des manuals d'Algol. Je rappelle que le
language de programmation préféré dans cet environement, c'était bien
l'Algol.)

Si j'ai bien compris la site, dans les produits haut de gamme,
c'est réelement implémenté dans le hardward ; dans les produits
bas de gamme, c'est plutôt émulé par une machine virtuelle.


C'est l'impression que j'avais aussi. De toute manière, il n'y a guère de
différence de fond entre une machine virtuelle et une implémentation par
micro-programmation, en particulier quand le micro-programme est
modifiable.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org




Avatar
Olivier Miakinen

<cit.>
il y a eu une machine n'ayant que des nombres en virgule flottante, mais
où certaines opérations trappaient si une donnée n'était pas entière
</cit.>


?!??
il y a eu une époque où les hommes vivaient dans des cavernes ...
écrire du code sur un PC devrait être interdit car incompatble
avec les moyens de cette époque ?


En quoi cette architecture serait-elle incompatible avec les moyens de
notre époque ? JavaScript, par exemple, ne stocke que des nombres en
virgule flottante au format IEEE754, ce qui ne l'empêche pas d'avoir
des opérations qui limitent les valeurs aux entiers entre 0 et 2^32-1,
ou entre -2^31 et 2^31-1, ou encore entre 0 et 2^16-1.

Mais bon, comme d'habitude tu n'es là que pour troller et j'ai encore
marché dedans...


Avatar
Sylvain
Olivier Miakinen wrote on 03/03/2008 13:24:

Mais bon, comme d'habitude tu n'es là que pour troller et j'ai encore
marché dedans...


à crier au troll dans la plupart de tes posts, tu n'es plus audible.

je ne me rapelles pas la moindre réponse de ta part à un de mes rares
posts ici, encore moins à une enfilade - remarque je ne l'affirmes pas
puisque tu n'archives pas et pour cette contrib. c'est clairement mieux.

Sylvain.

1 2 3 4