Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

А.1. Статический анализ программы

Некоторые программные ошибки можно выявить, воспользовавшись средствами статического анализа исходных текстов. Если вызвать компилятор

gcc
с флагами
– Wall
и
– pedantic
, он выдаст предупреждения о рискованных и потенциально ошибочных программных конструкциях. Исправив эти конструкции, вы снизите вероятность появления в программе скрытых ошибок, а также упростите компиляцию программы в других вариантах Linux или даже в других операционных системах.

С помощью различных флагов командной строки можно заставить компилятор

gcc
выдавать предупреждения о множестве спорных программных конструкций. Большинство проверок включается флагом
– Wall
. Например, компилятор будет сообщать о комментарии, начинающемся в другом комментарии, о неправильном типе возвращаемого значении в функции
main
, о функциях, в которых пропущена инструкция
return
, и т.д. При наличии флага
– pedantic
компилятор будет выдавать предупреждения о несоответствии стандарту ANSI. В частности, будет сообщаться о наличии функции
asm
и других GNU-расширений языка. В документации к компилятору не рекомендуется использовать этот флаг. Мы же советуем избегать большинства GNU-расширений, так как они имеют тенденцию меняться со временем и плохо поддаются оптимизации.

Попробуем скомпилировать программу "Hello, World", представленную в листинге А.1.

Листинг А.1. (hello.c) Простейшая программа

main {

 printf("Hello, world.\n");

}

Будучи вызванным без флагов, компилятор не выдаст никаких предупреждений, хотя программа не соответствует стандарту ANSI Если же включить флаги

– Wall
и
– pedantic
, то обнаружатся три спорные конструкции:

% gcc -Wall -pedantic hello.c

hello.c:2: warning: return type defaults to 'int'

hello.c: In function 'main':

hello.c:3: warning: implicit declaration of function 'printf'

hello.c:4: warning: control reaches end of non-void function

Компилятор сообщает о следующих проблемах:

■ не указан тип возвращаемого значения функции

main
;

■ функция

printf
не объявлена, так как файл
<stdio.h>
не включен в программу;

■ функция

main
, которая неявно возвращает значение типа
int
, не содержит инструкцию
return
.

Анализ исходных текстов программы не позволяет выявить все возможные ошибки и неэффективные конструкции. В следующем разделе описываются четыре средства поиска ошибок при работе с динамической памятью. В конце приложения будет рассказано о том, как анализировать время работы программы с помощью утилиты-профайлера

gprof
.

А.2. Поиск ошибок в динамической памяти

При написании программы зачастую неизвестно, сколько памяти потребуется ей во время выполнения. Например, строка, читаемая из файла, может иметь любую длину. Работа с динамической памятью осуществляется посредством функций

malloc
,
free
и их вариантов. Следует придерживаться таких правил:

■ число запросов на выделение памяти (вызовов функции

malloc
) должно в точности совпадать с чистом запросов на освобождение памяти (вызовов функции
free
);

■ операции чтения и записи динамической памяти должны выполняться в рамках выделенной области, не выходя за ее пределы;

■ к выделенной области нельзя обращаться после того, как она была освобождена.

Выделение и освобождение динамической памяти происходят на этапе выполнения программы, поэтому статический анализ исходных текстов редко позволяет выявить недочеты. Утилиты проверки памяти сначала загружают программу, а затем определяют, нарушаются ли перечисленные выше правила. Выявляются следующие ошибки:

■ чтение памяти до того, как она была выделена;

■ запись в память до того, как она была выделена;

■ чтение данных по адресу, предшествующему началу выделенной области;

■ запись данных по адресу, предшествующему началу выделенной области;

■ чтение данных по адресу, стоящее после выделенной области;

■ запись данных по адресу, стоящему после выделенной области;

■ чтение памяти после того, как она была освобождена;

  • Читать дальше
  • 1
  • ...
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: