Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В тех случаях, когда внутренняя логика системы нуждается в подкреплении, X/Open предоставляет макрос
assert
<b>#include <assert.h></b>
<b>void assert(int expression)</b>
Макрос
assert
abort
Заголовочный файл assert.h определяет макросы в зависимости от определения флага
NDEBUG
NDEBUG
assert
-DNDEBUG
#define NDEBUG
в каждый исходный файл.
Этот метод применения порождает проблему. Если вы используете
assert
assert
assert failed
Вы также должны убедиться в том, что у выражения макроса
assert
assert
Выполните упражнение 10.2.
Далее приведена программа assert.c, определяющая функцию, которая должна принимать положительное значение. Она защищает от ввода некорректного аргумента благодаря применению макроса
assert
После включения заголовочного файла assert.h и функции "квадратный корень", проверяющей положительное значение параметра, вы можете писать функцию
main
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <stdlib.h>
double my_sqrt(double x) {
assert(x >= 0.0);
return sqrt(x);
}
int main() {
printf("sqrt +2 = %gn", my_sqrt(2.0));
printf("sqrt -2 = %gn", my_sqrt(-2.0));
exit(0);
}
Теперь при выполнении программы вы увидите нарушение в макросе
assert
$ <b>сс -о assert assert.с -lm</b>
$ <b>./assert</b>
sqrt +2 = 1.41421
assert: assert.c:7: my_sqrt: Assertion 'x >= 0.0' failed.
Aborted
$
Как это работает
Когда вы попытаетесь вызвать функцию
my_sqrt
assert
abort
abort
assert
Если вы перекомпилируете программу с опцией
-DNDEBUG
assert
NaN
sqrt
my_sqrt
$ <b>cc -о assert -DNDEBUG assert.с -lm</b>
$ <b>./assert</b>
sqrt +2 = 1.41421
sqrt -2 = nan
$
Некоторые более старые версии математической библиотеки генерируют исключение для математической ошибки, и ваша программа будет остановлена с сообщением "Floating point exception" ("Исключение для числа с плавающей точкой") вместо возврата NaN.
Устранение ошибок использования памяти
Распределение динамической памяти — богатый источник ошибок, которые трудно выявить. Если вы пишете программу, применяющую функции
malloc
free
Обычно блоки памяти выделяются функцией
malloc
Если вы записываете в область, расположенную после конца выделенного блока (или перед началом блока), вы с большой долей вероятности повредите структуры данных, используемые библиотекой malloc, следящей за распределением памяти. В этом случае в какой-то момент времени вызов
malloc
free
Неудивительно, что существуют коммерческие и бесплатные средства, способные помочь в решении проблем этих двух типов. Например, есть много разных версий функций
malloc
free