[gull] cours C++

Marc SCHAEFER schaefer at alphanet.ch
Sat Feb 25 17:03:36 CET 2006


On Sat, Feb 25, 2006 at 12:43:13PM +0100, Grossiord Yves wrote:
> Pour info, l'implementation de new peut ressembler a ca:
>     X* p = new X(2);
> est equivalent a:
>     struct X * p = (struct X *) malloc(sizeof(struct X));
>     if (p == 0) error("memory exhausted");
>     p->init(2);
> Qu'est-ce que vous preferez ?

Tiens, j'aurais pensé (sans avoir lu la norme), que cela aurait plutôt
été:

   if (p) {
      p->init(2);
   }

de manière à avoir p NULL lorsque new ne fonctionne pas (contrairement à
X p qui doit provoquer une erreur à l'exécution).

Qu'en est-il, experts C++ ?  Une exception ?

> - les conventions de programmation de mon premier employeur
>   demandaient de placer la constante en premier quand on
>   comparait une constante et une variable. De cette facon, si
>   on oublie un '=', cela provoque une erreur de compilation.
>   Ca parait un peu bizarre au debut, et ca ne regle que 50%
>   des problemes, mais c'est toujours ca de gagne.
>     if(0 == pbuffer) { ... }

c'est une bonne idée. Dans le 1er cas, gcc (avec les bons arguments)
provoque un warning dans le cas if (pbuffer = 0), mais pas dans le cas
if ((pbuffer = 0)) {.

>   Et ca permettrait de detecter tres facilement des tentatives
>   d'exploit dans le kernel, comme recemment, de memoire:
>     if(... &&(0 = userid)) {...}  // user ne devient pas root

   if (cond1 && (userid = 0)) {

Ca, par contre, gcc ne le détecte pas. Tout au plus pourrait-il dire
`evaluates always to false' dans ce cas, mais je ne sais pas s'il le
fait.




More information about the gull mailing list