Skip to content

Variable Life-Cycle Tracking (Пастух)

Intent ID: :variable-lifecycle-tracking Статус: 🚧 Draft Версия: 0.1

Описание

Контракт для отслеживания полного жизненного цикла переменных: рождение, активность и смерть. Каждая переменная должна быть «помечена» от объявления до освобождения/выхода из области видимости.

EDN Спецификация (Draft)

{:intent :variable-lifecycle-tracking
 :entities {:var {:type "T" :role :tracked-variable}}
 :lifecycle [
   ;; Фаза 1: Рождение переменной
   {:phase :birth
    :op :declare :target :var
    :tag "garden:birth"}

   ;; Фаза 2: Активное использование
   {:phase :active
    :op :access :target :var :mode [:read :write]
    :tag "garden:active"}

   ;; Фаза 3: Смерть переменной
   {:phase :death
    :op [:free :scope-exit] :target :var
    :tag "garden:death"}
 ]
 :invariants [
   ;; Правило: каждая переменная должна иметь birth
   {:require :birth :for-each :var}

   ;; Правило: death следует после всех active
   {:order [:birth :active* :death]}

   ;; Правило: переменная без tracked lifecycle — бесхозная
   {:forbid :untracked-variable}]
 :tags {:birth "garden:birth"
        :active "garden:active"
        :death "garden:death"}}

Пример использования

✅ Валидный код

/* [[garden:intent(variable-lifecycle-tracking)]] */
void process_data() {
    /* [[garden:birth(buffer)]] */
    char *buffer = malloc(64);

    if (buffer != NULL) {
        /* [[garden:active(buffer, MEM-WRITE)]] */
        memset(buffer, 0, 64);

        /* [[garden:active(buffer, MEM-READ)]] */
        size_t len = strlen(buffer);

        // ... logic ...

        /* [[garden:death(buffer)]] */
        free(buffer);
        buffer = NULL;
    }
}
/* [[/garden:intent]] */

❌ Нарушение: нет birth

/* [[garden:intent(variable-lifecycle-tracking)]] */
void missing_birth() {
    // ОШИБКА: переменная объявлена без garden:birth
    char *buffer = malloc(64);
    free(buffer);
}
/* [[/garden:intent]] */

❌ Нарушение: нет death

/* [[garden:intent(variable-lifecycle-tracking)]] */
void missing_death() {
    /* [[garden:birth(buffer)]] */
    char *buffer = malloc(64);
    // ОШИБКА: нет garden:death перед выходом
}
/* [[/garden:intent]] */

❌ Нарушение: бесхозная переменная

/* [[garden:intent(variable-lifecycle-tracking)]] */
void untracked_variable() {
    // ОШИБКА: переменная без тегов жизненного цикла
    int x = 42;
    use(x);
}
/* [[/garden:intent]] */

Правило Пастуха

Каждая переменная должна быть «помечена» от рождения до смерти.

Переменная без отслеживаемого жизненного цикла считается бесхозной (orphan) и будет удалена (prune) на этапе валидации.

Теги жизненного цикла

Тег Описание Когда использовать
[[garden:birth(VAR_NAME)]] Точка объявления/инициализации Сразу после объявления переменной
[[garden:active(VAR_NAME, INTENT_ID)]] Операция чтения/записи Каждое использование переменной
[[garden:death(VAR_NAME)]] Освобождение/выход из области free(), delete, выход из scope

Статус разработки

Этот интент находится в разработке. Протокол требует глубокой интеграции с Clang AST для трассировки переменных.

Ссылки


Bake the Future. Build the Substrate. 🛠️⚡️