• [^] # Re: Popularité

    Posté par . En réponse à la dépêche Publication de la nouvelle norme Ada 2012. Évalué à 4.

    Je ne te contredirais pas sur le point des faiblesses de sécurité du C++, parce qu'il est simple de créer un pointeur fou ou une référence folle mais je tiens cependant à mettre les points sur les I:

    C++ à un typage nettement plus strict que C. Le cast de type utilise 4 mots-clés différents, plus la syntaxe hérité de C:
    _ static_cast(donnée) => à utiliser tout le temps! Tout est vérifié à la compilation, ce qui permet de n'avoir aucun impact sur les performances, et un refus de compilation si l'on fait de la merde.
    _ dynamic_cast(donnée) => à utiliser dans le cas d'un cast d'un type vers un type enfant. Quelques vérifications à la compilation, le reste à l'exécution, au moins si on a merdé, le plantage est immédiat avec la levée d'une exception si "donnée" est une référence, ou le renvoi d'un pointeur nul si donnée est un pointeur. Dans ce dernier cas, il est évident qu'il faut systématiquement vérifier et traiter la validité du pointeur.
    _ const_cast(donnée) => à n'utiliser que dans le cas d'un interfaçage avec du code pourri. Et encore… Au moins a-t-il le mérite de vérifier que le type d'arrivée est le même que le type de destination, à la constance de la donnée près (il permet de virer la contrainte de constance…beurk)
    _ reinterpret_cast(donnée) => à proscrire! C'est l'équivalent du cast C: aucune vérification! Malheureusement, il est nécessaire dans le cas ou l'on s'interface avec du code C, typiquement, si on utilise dlopen()
    _ (type)(donnée) => héritage du C, à bannir, car aucune vérification. Certes, plus lisible que la version C++ (reinterpret_cast) mais moins évident à retrouver et éradiquer dans un code source. Faire un CTRL+F (ou / ou… peu importe) est plus simple sur "reinterpret_cast" après tout :P

    Et pour en revenir aux pointeurs, principale cause de problèmes, C++11 s'est pas mal amélioré, l'usage et l'abus de pointeurs intelligents permet de s'affranchir de nombre de soucis. La solution n'est pas parfaite, c'est sûr…

    Si le C++ n'avais pas à conserver son héritage C, je pense qu'il serait plus simple et plus robuste. Mais la conservation de cet héritage à une utilité…

    Enfin, ce qui est sûr, c'est que j'ai toujours voulu jeter un oeil à ADA, justement grâce à sa réputation d'être infernal à compiler. Après tout, si j'active un maximum de warning dans les compilos, ce n'est pas pour rien, j'aime quand le compilateur me signale un gros PEBCAK ou WTF :)
    C'est le genre de raisons qui font que j'ai d'ailleurs un mal de fou à aimer les langages au typage trop faible.