Почему тип указателя не гарантирует безопасность памяти
Указатель сохраняет тип, даже когда байты по его адресу уже означают другое. В примере на Zig структура с меткой сначала хранит срез байтов. Код берёт указатель на это поле, записывает в ту же структуру 128-битное число, а затем разыменовывает старый указатель. Адрес и тип указателя прежние, но внутри уже число: возникает путаница типов.
Автор называет этот случай самым трудным контрпримером для безопасности памяти. Он не зависит от кучи и деструкторов; похожий сценарий ломает и Ada. Практическую опасность автор не преувеличивает: насколько такой баг пригоден для эксплуатации, неясно. Куда более распространённое переполнение буфера компилятор может закрыть проверкой границ.
В разборе Memory Safety’s Hardest Problem есть код, вывод программы и аргумент, почему встроенные границы массивов в C могли предотвратить немало проблем.
Post #14832
4.3K
matklad.github.io Memory Safety's Hardest Problem Uplifting a lobsters comment for easier reference.
- 👌 4
- 🎉 3
- 🤩 2
- 🌚 2
- 🎃 2
- 🤝 2
- 👍 1
- 😢 1
- 🙏 1
- 🎄 1
- 🦄 1