Antigamente (anos 70 e anteriores), alguns computadores não tinham MMU (e isso é verdade hoje para microcontroladores muito baratos).
Nesses sistemas, não há proteção de memória e, portanto, nenhum segmento somente leitura no espaço de endereço , e um programa com erros pode sobrescrever uma constante (na memória de dados ou mesmo dentro do código da máquina).
Os compiladores Fortran na época passaram argumentos formais por referência . Portanto, se você fez CALL FUN(4)
e o SUBROUTINE FUN(I)
corpo dela está mudando I
- por exemplo, com uma declaração I = I + 1
no corpo, você pode sofrer um desastre, alterando 4 para 5 no chamador (ou pior).
Isso também aconteceu nos primeiros microcomputadores, como o IBM PC AT original de 1984, com o MS-DOS
FWIW, eu tenho idade suficiente para ter usado, como adolescente no início dos anos 1970, esses computadores: IBM1620 e CAB500 (em um museu: esses são computadores da década de 1960!). O IBM1620 foi bastante divertido: usado em tabelas de memória para adições e multiplicações (e se você sobrescreveu essas tabelas, o caos se seguiu). Portanto, não apenas você pode sobrescrever um 4, mas também pode sobrescrever todas as adições futuras de 2 + 2 ou multiplicações 7 * 8 (mas eu realmente esqueci esses detalhes sujos para que pudesse estar errado).
Hoje, você pode sobrescrever o código do BIOS na memória flash, se estiver perseverante o suficiente. Infelizmente, não me sinto mais tão divertido, então nunca tentei. (Tenho até medo de instalar alguns LinuxBios na minha placa-mãe).
Nos computadores e sistemas operacionais atuais, passar uma constante por referência e alterá-la dentro do receptor apenas provocará uma violação de segmentação , que parece familiar para muitos desenvolvedores de C ou C ++.
BTW: nitpicking: overwriting 4 não é uma questão de linguagem, mas de implementação.