• [^] # Re: Sécurité ?

    Posté par (site web personnel, Mastodon) . En réponse à la dépêche Un nouveau serveur httpd : Ashd, A Sane HTTP Daemon. Évalué à -2.

    C'est vrai que j'ai tendance à plus faire du C++ que du C, et donc la pré-incrémentation a du sens. Ceci dit, le compilateur n'est pas contraint d'optimiser, et une variable temporaire peut donc être générée lors de la post-incrémentation pour récupérer le résultat de la post-incrémentation.

    À titre d'illustration, en C++, on surcharge classiquement l'opérateur de post-incrémentation ainsi (T étant un type quelconque) :

    // Post incrémentation
    T const operator ++(typename const & target)
    {
    T tmp(target) ;
    ++target ;
    return tmp ;
    }

    // Pré incrementation
    T const & T::operator ++(int)
    {
    // On fait l'incrémentation ici
    return *this
    }


    On voit bien que la post-incrémentation devrait créer une copie temporaire à retourner (même si c'est un objet anonyme qui est créé, ça dépend des options d'optimisation).

    L'incrémentation ne devrait pas être faire en même temps qu'une autre opération : le C ne garanti pas forcément un ordre d'exécution des instruction dans une même expression. Le choix est laissé à l'implémentation. Par exemple, dans l'expression suivante, le résultat est indéterminé par le standard C.
    f(i++, i -=2) ;

    Donc non, la post-incrémentation est à proscrire sauf cas particuliers.