Dès lors, comment peux-tu pointer le C du doigt ? Si nous ne devions retenir qu’un langage pour apprendre la rigueur du code, l’importance d’un code correct et irréprochable, ce serait probablement le C.
Le C force le programmeur à raisonner sur son code, sous peine de programmes qui ne veulent rien dire (undefined behavior), mais sans fournir aucun outil à l’utilisateur pour vérifier que son raisonnement est correct. Au mieux tu peux utiliser les sanitizers (qui n’existent chez le grand public que depuis une poignée d’année) et valgrind pour te dire: j’ai vérifié que sur mes tests mon programme ne semble pas rencontrer de comportement dangereux à l’exécution (ce qui ne garantit en rien l’absence d’undefined behavior, même sur les chemins testés).
Le résultat en pratique est que tous les gros programmes C sont faux (ne veulent rien dire), mais que l’on maintient collectivement une forme de tolérance en demandant aux compilateurs de ne pas être trop méchants dans ces cas-là, ou en espérant qu’ils ne le deviendront pas dans le futur.
Je préfère utiliser un langage où il est possible d’écrire du code correct, parce que le langage va m’aider à vérifier que mon raisonnement est correct (ou me simplifier la vie pour ne pas me forcer à raisonner sur tel ou tel aspect au risque de me planter), et où les cas incorrects ont des conséquences prédictibles et débuggables (par exemple, un accès hors des bornes d’un tableau se comporte mieux en Python, où on a une exception propre, qu’en C où on peut modifier des structures internes n’importe où dans le programme).