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