Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В тех случаях, когда внутренняя логика системы нуждается в подкреплении, X/Open предоставляет макрос
assert<b>#include <assert.h></b><b>void assert(int expression)</b>Макрос
assertabortЗаголовочный файл assert.h определяет макросы в зависимости от определения флага
NDEBUGNDEBUGassert-DNDEBUG#define NDEBUGв каждый исходный файл.
Этот метод применения порождает проблему. Если вы используете
assertassertassert failedВы также должны убедиться в том, что у выражения макроса
assertassertВыполните упражнение 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.41421assert: assert.c:7: my_sqrt: Assertion 'x >= 0.0' failed.Aborted$Как это работает
Когда вы попытаетесь вызвать функцию
my_sqrtassertabortabortassertЕсли вы перекомпилируете программу с опцией
-DNDEBUGassertNaNsqrtmy_sqrt$ <b>cc -о assert -DNDEBUG assert.с -lm</b>$ <b>./assert</b>sqrt +2 = 1.41421sqrt -2 = nan$Некоторые более старые версии математической библиотеки генерируют исключение для математической ошибки, и ваша программа будет остановлена с сообщением "Floating point exception" ("Исключение для числа с плавающей точкой") вместо возврата NaN.
Устранение ошибок использования памяти
Распределение динамической памяти — богатый источник ошибок, которые трудно выявить. Если вы пишете программу, применяющую функции
mallocfreeОбычно блоки памяти выделяются функцией
mallocЕсли вы записываете в область, расположенную после конца выделенного блока (или перед началом блока), вы с большой долей вероятности повредите структуры данных, используемые библиотекой malloc, следящей за распределением памяти. В этом случае в какой-то момент времени вызов
mallocfreeНеудивительно, что существуют коммерческие и бесплатные средства, способные помочь в решении проблем этих двух типов. Например, есть много разных версий функций
mallocfree
