Самьюэл Алекс
Шрифт:
А.1. Статический анализ программы
Некоторые программные ошибки можно выявить, воспользовавшись средствами статического анализа исходных текстов. Если вызвать компилятор
С помощью различных флагов командной строки можно заставить компилятор
Попробуем скомпилировать программу "Hello, World", представленную в листинге А.1.
Будучи вызванным без флагов, компилятор не выдаст никаких предупреждений, хотя программа не соответствует стандарту ANSI Если же включить флаги
Компилятор сообщает о следующих проблемах:
■ не указан тип возвращаемого значения функции
■ функция
■ функция
Анализ исходных текстов программы не позволяет выявить все возможные ошибки и неэффективные конструкции. В следующем разделе описываются четыре средства поиска ошибок при работе с динамической памятью. В конце приложения будет рассказано о том, как анализировать время работы программы с помощью утилиты-профайлера
А.2. Поиск ошибок в динамической памяти
При написании программы зачастую неизвестно, сколько памяти потребуется ей во время выполнения. Например, строка, читаемая из файла, может иметь любую длину. Работа с динамической памятью осуществляется посредством функций
■ число запросов на выделение памяти (вызовов функции
■ операции чтения и записи динамической памяти должны выполняться в рамках выделенной области, не выходя за ее пределы;
■ к выделенной области нельзя обращаться после того, как она была освобождена.
Выделение и освобождение динамической памяти происходят на этапе выполнения программы, поэтому статический анализ исходных текстов редко позволяет выявить недочеты. Утилиты проверки памяти сначала загружают программу, а затем определяют, нарушаются ли перечисленные выше правила. Выявляются следующие ошибки:
■ чтение памяти до того, как она была выделена;
■ запись в память до того, как она была выделена;
■ чтение данных по адресу, предшествующему началу выделенной области;
■ запись данных по адресу, предшествующему началу выделенной области;
■ чтение данных по адресу, стоящее после выделенной области;
■ запись данных по адресу, стоящему после выделенной области;
■ чтение памяти после того, как она была освобождена;