Передайте право собственности на хранение в Splint

Используя простую связанную реализацию списка в C, как мне сказать Splint, что я передаю право собственности на data ?

 typedef struct { void* data; /*@null@*/ void* next; } list; static /*@null@*/ list* new_list(/*@notnull@*/ void* data) { list* l; l = malloc(sizeof(list)); if (l == NULL) return NULL; l->next = NULL; l->data = data; return l; } 

Я получаю это сообщение об ошибке:

 Implicitly temp storage data assigned to implicitly only: list->data = data Temp storage (associated with a formal parameter) is transferred to a non-temporary reference. The storage may be released or new aliases created. (Use -temptrans to inhibit warning) 

Я хочу сказать Splint, что ответственность за освобождение data переносится в структуру данных списка.

Решение находится в руководстве по шине для функциональных интерфейсов . В основном, измените сигнатуру функции на это:

 static /*@null@*/ list* new_list(/*@notnull@*/ /*@only@*/ void* data) /*@defines result->data @*/ 

Хотя при этом мы получим новую ошибку:

 int main() { list* l = new_list("hej"); return 0; } Observer storage passed as only param: new_list ("hej") Observer storage is transferred to a non-observer reference. (Use -observertrans to inhibit warning)