OVH Cloud OVH Cloud

déclaration tableau taille variable

30 réponses
Avatar
Nicolas Aunai
salut,


ayant a l'origine appris le C, j'apprend a présent le C++, et j'ai été
un peu "choqué" de voir que je pouvais faire une déclaration de tableau
ainsi :

int x;
cin>>x;
int tab[x];


je pensais, qu'il n'y avait que 4 méthodes pour déclarer un tableau :

#define MAX 20

int tab[MAX];

ou bien

int tab[20]

ou bien

const int x = 20;

int tab[x];

et enfin

int tab[]={2,3,4};


depuis quand la déclaration d'un tableau avec une variable non
constante est-elle autorisée en C++ ? n'est-ce pas un peu dangereux si
par exemple ma variable est mal "controlée" (ex : x=29299939391992991)

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

1 2 3
Avatar
Vincent Lascaux
En principe, ta variable ne devrait pas être "mal contrôlée". Ou bien je
ne


comprends pas ce que tu entends par cette expression...


et bien par exemple, si on admet que le programmeur a pris TOUTES les
sécurités possibles et imaginables pour controler les valeurs prises
par x, il y a certains cas, par exemple dans des applications réseau,
où x pourrait prendres des valeurs farfelues et imprévisibles venues de
l'extérieur du programme... dans ces conditions, déclarer un tableau de
dimension x, inconnue donc, me parait assez dangereux.


Je ne comprends pas tes propos : dans tous les langages que je connais, il
est possible d'allouer un vecteur (ou tableau, ou buffer, peu importe le
nom) d'une taille x, variable. Que proposes tu pour sécuriser ca ? Si tu
trouves que c'est mal d'allouer un buffer de 3546159894 octets (à priori, je
ne vois pas pourquoi), tu peux mettre un test apres avoir recu x du réseau
(genre if(x > (1<<30)) throw "L'application ne gere pas les messages de plus
d' 1Go"; )

--
Vincent


Avatar
Loïc Joly
Nicolas Aunai wrote:

"Fabien LE LEZ" avait écrit le 17/11/2003 :


int x;
cin>>x;
int tab[x];



Ce n'est pas autorisé en C++ ; par contre il me semble que c'est
autorisé en C (sauf le 'cin' bien sûr).



en C99 oui, j'ai été très surpris de l'apprendre.

On peut par contre écrire :

int x;
cin>>x;
std::vector<int> tab (x);



oui ok, mais là vector s'occupe de la mémoire par derrière...


Bin, là le compilateur s'occupe de la mémoire par derrière. J'ai tu mal
à voir ce qui te gêne dans cet exemple.

--
Loïc



Avatar
Fabien LE LEZ
On Tue, 18 Nov 2003 13:23:34 +0100, DINH Viêt Hoà
wrote:

const int x = 20;
int tab[x];



d'ailleurs ceci est-il autorisé en C90 ?


Il me semble que non.

--
;-)



Avatar
kanze
Loïc Joly wrote in message
news:<bpdrjd$qit$...
Nicolas Aunai wrote:

"Fabien LE LEZ" avait écrit le 17/11/2003 :

int x;
cin>>x;
int tab[x];


Ce n'est pas autorisé en C++ ; par contre il me semble que c'est
autorisé en C (sauf le 'cin' bien sûr).


en C99 oui, j'ai été très surpris de l'apprendre.

On peut par contre écrire :

int x;
cin>>x;
std::vector<int> tab (x);


oui ok, mais là vector s'occupe de la mémoire par derrière...


Bin, là le compilateur s'occupe de la mémoire par derrière. J'ai tu
mal à voir ce qui te gêne dans cet exemple.


Il y a quand même une différence importante entre :

int table[ n ] ;
et
std::vector< int > table( n ) ;

Dans le premier cas, s'il n'y a pas assez de mémoire, tu as épuisé les
ressources de l'implémentation, ce qui est un comportement indéfini.
Dans le deuxième cas, une exception std::bad_alloc est levée, avec un
comportement défini par la norme dans tous les cas.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16




Avatar
espie
In article ,
Nicolas Aunai ç wrote:
et bien par exemple, si on admet que le programmeur a pris TOUTES les
sécurités possibles et imaginables pour controler les valeurs prises
par x, il y a certains cas, par exemple dans des applications réseau,
où x pourrait prendres des valeurs farfelues et imprévisibles venues de
l'extérieur du programme... dans ces conditions, déclarer un tableau de
dimension x, inconnue donc, me parait assez dangereux.


Il y a une grave contradiction elementaire dans ce que tu dis.

Comment est-ce que le programmeur peut avoir pris TOUTES les securites,
et faire confiance a une valeur en provenance du reseau ?

Avatar
Nicolas Aunai
"Marc Espie" avait écrit le 30/11/2003 :

Il y a une grave contradiction elementaire dans ce que tu dis.

Comment est-ce que le programmeur peut avoir pris TOUTES les securites,
et faire confiance a une valeur en provenance du reseau ?



par "TOUTES" les sécurités, je voulais dire tous les bugs éventuels
engendrés par son propre code, c'est déjà je pense très dur,
maintenant, dans une appli réseau, prévoir toutes les failles de
sécurité est je pense quasi impossible... mais tout ceci est HS :)

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
espie
In article ,
Nicolas Aunai ç wrote:
"Marc Espie" avait écrit le 30/11/2003 :

Il y a une grave contradiction elementaire dans ce que tu dis.

Comment est-ce que le programmeur peut avoir pris TOUTES les securites,
et faire confiance a une valeur en provenance du reseau ?



par "TOUTES" les sécurités, je voulais dire tous les bugs éventuels
engendrés par son propre code, c'est déjà je pense très dur,
maintenant, dans une appli réseau, prévoir toutes les failles de
sécurité est je pense quasi impossible... mais tout ceci est HS :)


HS? Pourquoi ?

Accessoirement, James t'a donne une des etapes sur cette longue route:
l'utilisation d'assert, qui permet d'inserer dans le code les proprietes
prouvees.

Cote securite reseau, comme dans la plupart des domaines, se limiter a des
protocoles simples permet de limiter la casse. Ca veut dire entre autres
qu'on construit par design des structures dont on est capable de verifier
la coherence interne, ce qui evite les gags dont tu parles. Si tu ne
peux pas verifier que la valeur de x est raisonnable, c'est que ton
protocole est mal specifie, ou sous specifie.

Il y a egalement des gens qui etudient la specification formelle des
protocoles reseaux. Ca ne debouche pas sur enormement d'applications
pratiques dans l'immediat, mais a terme (sous cinq ans), ca a de fortes
chances de nous donner des methodes d'expression un peu mieux adaptees
a `la bonne' description de protocoles reseaux.

... Comme les invariants de boucles et autres assertions pour le code
`classique'.

Le C++ est (a mon avis) en bonne place pour tout ce style de demarche,
entre autres grace aux travaux de Sutter, Alexandrescu et autres qui
mettent (entre autres) l'accent sur les moyens de ramener la verification
dynamique du code a de la verification statique a la compilation.


Avatar
kanze
Nicolas Aunai ç wrote in message
news:...
"Marc Espie" avait écrit le 30/11/2003 :

Il y a une grave contradiction elementaire dans ce que tu dis.

Comment est-ce que le programmeur peut avoir pris TOUTES les
securites, et faire confiance a une valeur en provenance du reseau ?


par "TOUTES" les sécurités, je voulais dire tous les bugs éventuels
engendrés par son propre code, c'est déjà je pense très dur,
maintenant, dans une appli réseau, prévoir toutes les failles de
sécurité est je pense quasi impossible...


Si tu utilises une valeur farfellue dans ton programme, c'est une erreur
de programmation dans ton programme. Égal d'où vient la valeur ; un
programme qui utilise des valeurs qui vient du reseau sans les valider
est un programme erroné.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Fabien LE LEZ
On 1 Dec 2003 00:03:32 -0800, wrote:

Égal d'où vient la valeur ; un
programme qui utilise des valeurs qui vient du reseau sans les valider
est un programme erroné.


D'ailleurs on a vite fait de passer plus de temps et de pondre plus de
code pour la gestion des erreurs que pour le programme proprement
dit...

--
;-)

Avatar
Marc Boyer
Fabien LE LEZ wrote:
On 1 Dec 2003 00:03:32 -0800, wrote:

Égal d'où vient la valeur ; un
programme qui utilise des valeurs qui vient du reseau sans les valider
est un programme erroné.


D'ailleurs on a vite fait de passer plus de temps et de pondre plus de
code pour la gestion des erreurs que pour le programme proprement
dit...


Le pire ennemi du programmeur n'est-il pas l'utilisateur ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


1 2 3