GNU Nana это C/C++ библиотека, которая реализует проверку утверждений, ведения лога (можно выводить сообщения в файл, на терминал, другой процесс и буфер в памяти), измерения времени выполнения участка кода, трассировку выполнения программы и генерацию сокращённой формы программы в HTML файла (в нем будут содержаться заголовки функций и их предусловия и постусловия). Реализация утверждений в GNU Nana имеет минимальные издержки времени выполнения и размера добавочного кода, кроме того утверждения можно включать и выключать как при компиляции, так и в процессе выполнения программы.
Проверка утверждений в стиле Си.
Для использования этого интерфейса в программе, нужно подключить заголовочный файл nano.h. Ниже приведены основные макросы (в библиотеке так-же есть макросы которые кроме проверки условия позволяют задавать поведение при возникновении ошибочной ситуации.)
Макрос void I(bool exprn). Если выражение exprn true, то программа является корректной.Макрос void N(bool exprn). Если выражение exprn false, то программа является корректной.
#include <nano.h>
void foo(int d)
{
I(d != 0);
x = y / d;
...
}
В библиотеке реализованы так-же макросы позволяющие сохранить предыдущие значение переменной:
Макрос void ID (Text decln).
Макрос void IS (Text assignment).
#include <nano.h>
void foo(int* v, char z)
{
ID(int* s = v);
ID(char t);
IS(t = z);
...
I(s == v);
I(t == z);
}
Проверка утверждений в отладчике GDB.
Утверждения проверяются только, если программа откомпилирована с флагом -g и для GDB создан сценарий.Макрос void DI(bool exprn) аналогично I().
Макрос void DS(e) аналогично IS().
#include <stdio.h>
#include <nana.h>
int main(int ac, char** av)
{
int a = 10;
DS($s = a);
printf("Hello! %d\n", a);
DS(var a = 5);
printf("Hello! %d\n", a);
DI($s == a);
return 0;
}
Компиляция и результат работы:
gcc -g nt.c -o nt -lnana |
nana nt.c > nt.gdb |
gdb nt |
(gdb) source nt.gdb |
Hello! 10 |
Hello! 5 |
"DI(""$s ==a"")" has failed at f:l with |
#0 main (ac=1,av=0xbffff4f4) at nt.c:12 |
Сайт проекта
Контрактное программирование
Комментариев нет:
Отправить комментарий