[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