Autrefois (dans les années 1970 et avant), certains ordinateurs n'avaient pas de MMU (et cela est vrai aujourd'hui pour les microcontrôleurs très bon marché).
Sur de tels systèmes, il n'y a pas de protection de la mémoire donc pas de segment en lecture seule dans l' espace d'adressage , et un programme buggy pourrait écraser une constante (soit dans la mémoire de données, soit même à l'intérieur du code machine).
Les compilateurs Fortran à cette époque ont passé des arguments formels par référence . Donc, si vous l'avez fait CALL FUN(4)
et que SUBROUTINE FUN(I)
son corps change I
- par exemple avec une déclaration I = I + 1
dans son corps, vous pourriez avoir une catastrophe, changer 4 en 5 dans l'appelant (ou pire).
Cela était également vrai sur les premiers micro-ordinateurs comme l' IBM PC AT original de 1984, avec MS-DOS
FWIW, je suis assez vieux pour avoir utilisé, à l'adolescence au début des années 1970, de tels ordinateurs: IBM1620 et CAB500 (dans un musée: ce sont des ordinateurs de l'époque des années 1960!). L'IBM1620 était assez amusant: il était utilisé dans les tables de mémoire pour les ajouts et les multiplications (et si vous écrasiez ces tables, le chaos s'ensuivait). Ainsi, non seulement vous pourriez écraser un 4, mais vous pourriez même écraser chaque futur ajout 2 + 2 ou multiplications 7 * 8 (mais j'ai vraiment oublié ces détails sales, donc cela pourrait être faux).
Aujourd'hui, vous pouvez remplacer le code BIOS dans la mémoire flash, si vous persévérez suffisamment. Malheureusement, je ne me sens plus aussi amusant, donc je n'ai jamais essayé. (J'ai même peur d'installer des LinuxBios sur ma carte mère).
Sur les ordinateurs et systèmes d'exploitation actuels, le fait de passer une constante par référence et de la modifier à l'intérieur de l'appelé provoquera simplement une violation de segmentation , ce qui semble familier à de nombreux développeurs C ou C ++.
BTW: être tatillonne: l'écrasement 4 n'est pas une question de langage, mais d'implémentation.