Contracts for C
Контракты для C
C++ почти утвердила контракты (P2900); я попробовал адаптировать идеи для C.
Пока это черновик, без реализации в компиляторах.
Главное:
- `pre`/`post` — проверяемые условия на входе/выходе функции.
- Не ломают ABI.
- Компонуются и позволяют оптимизатору выкинуть лишние проверки.
- Если условие — константа, оно как `static_assert`: ошибка компиляции.
Базовые примитивы
```c
contract_assert(условие, "текст"); // всегда проверяется, при лжи — abort
contract_assume(условие, "текст"); // компилятор верит, иначе UB
Пример функции
// заголовок
void *my_malloc(size_t s) pre(s) post(r: r);
// реализация
inline void *my_malloc(size_t s) {
contract_assert(s, "size != 0");
defer { contract_assert(defer_return_value, "ok"); };
return malloc(s);
}
defer выполняет post-проверку при любом выходе.
Инлайн даёт компилятору видеть контракт; внешняя декларация сохраняет привычное разделение .h/.c.
Польза: читаемость, статический анализ, оптимизация.