Теневая память - это метод, используемый для отслеживания и хранения информации в памяти компьютера используется программой во время ее выполнения. Теневая память состоит из теневых байтов, которые отображаются на отдельные биты или один или несколько байтов в основной памяти. Эти теневые байты обычно невидимы для исходной программы и используются для записи информации об исходной части данных.
Этот метод используется программами проверки ошибок памяти, которые могут хранить информацию о том, какие части памяти были выделены для проверяемой программы. Эта теневая память затем используется для обнаружения и сообщения о неправильных доступах к памяти, даже если программа может не дать сбой из-за ошибки сегментации или подобного. Средство проверки ошибок может также хранить дополнительную информацию в памяти, например, какие биты определены, а какие нет. Memcheck, часть пакета Valgrind, использует это для обнаружения неопределенного поведения, возникающего в результате воздействия или печати неопределенных значений памяти.
Использование теневой памяти, однако, не ограничивается программами проверки ошибок памяти, поскольку информация, хранящаяся в этих теневых байтах, не фиксируется. Например, он используется детектором гонки данных.
Теневая память может быть реализована и использована множеством разных способов и иметь разные характеристики производительности. Например, Memcheck отслеживает значения с точностью bit, а AddressSanitizer, часть компилятора clang, сравнительно очень быстро. Memcheck, как и все инструменты Valgrind, использует двоичную трансляцию и инструментарий для запуска кода, управляющего теневой памятью, соответствующей использованию программной памяти. AddressSanitizer, с другой стороны, создается во время компиляции и вставляет код проверки ошибок в программу во время компиляции. Его реализация с теневой памятью использует огромные резервы виртуальной памяти для теневой памяти, что дает очень разные характеристики производительности.