Вы попросили дать хорошее объяснение проблем «проверки границ и анализа памяти».
Наш инструмент проверки безопасности памяти позволяет вашему приложению отслеживать во время выполнения ошибки доступа к памяти (переполнения буфера, ошибки индексации массива, неверные указатели, ошибки выделения / освобождения). Ссылка содержит
подробное объяснение с примерами. В этом ответе SO показаны две программы, которые имеют указатели на фрейм стека и как CheckPointer обнаруживает и сообщает об ошибке в исходном коде
Более короткий пример: C (и C ++) печально не проверяют доступ к массивам, чтобы увидеть, находится ли доступ внутри границ массива. Преимущество: хорошо продуманная программа не оплачивает такую проверку в режиме производства. Недостаток: ошибочные программы могут касаться вещей вне массива, и это может вызвать поведение, которое очень трудно понять; таким образом, глючная программа сложна для отладки.
То, что делает инструмент динамического инструментария, например, средство проверки безопасности памяти, связывает некоторые метаданные с каждым указателем (например, тип объекта, на который «указывает» указатель, и, если это массив, границы массива), и затем проверьте во время выполнения любые обращения через указатели на массивы, нарушена ли граница массива. Инструмент изменяет исходную программу для сбора метаданных, в которых они генерируются (например, при входе в области, в которых объявляются массивы, или в результате операции malloc и т. Д.), И изменяет программу при каждой ссылке на массив (записывается как как x [y], где x или y - указатель массива, а значение - некоторый тип целочисленного типа, аналогично * (x + y)!) для проверки доступа. Теперь, если программа запускается и выполняет доступ вне пределов, проверка перехватывает ошибку и сообщает о том, где она может быть обнаружена. [Если вы подумаете об этом, вы поймете, что инструментарий для сбора метаданных и проверки должен быть довольно умным, чтобы справляться со всеми вариантами, которые может иметь язык, подобный Си. На самом деле трудно сделать эту работу полностью).
Хорошая новость заключается в том, что теперь о таком доступе сообщают рано, где легче обнаружить проблему и исправить программу. Такой инструмент не предназначен для производственного использования; один использует во время разработки и тестирования, чтобы помочь проверить отсутствие ошибок. Если ошибок не обнаружено, выполняется обычная компиляция и запускаются программы без проверок.
Это очень хороший пример инструмента динамического анализа: тестирование происходит во время выполнения.