Я думаю, что вы должны аннотировать сам API BoehmGC , и тогда аннотации, необходимые для примера (если есть), станут очевидными.
Для начала, любой указатель, возвращаемый функцией без аннотации, неявно равен @only
, что означает, что вы должны освободить связанную память до потери ссылки . Следовательно, первым шагом будет аннотирование распределителей, чтобы они больше не возвращали ссылку @only
. Вместо этого руководство рекомендует использовать общие ссылки :
Если Splint используется для проверки программы, предназначенной для использования в
Среда сбора мусора, может быть хранилище, которое совместно используется
одна или несколько ссылок и никогда явно не выпущены. Общий
аннотация объявляет хранилище, которое может быть разделено произвольно, но никогда
освобожден.
Если вы не хотите изменять API BoehmGC, вы можете обойти его, создав должным образом аннотированные функции-оболочки. Кроме того, вам нужно будет отключить определенные ошибки передачи в ваших функциях-оболочках (потому что они получают неявную ссылку @only
из API BoehmGC и затем возвращают ее как @shared
).
Например, таким способом вы могли бы отключить «Оператор не имеет эффекта» в определенной точке вашего кода:
/*@-noeffectuncon@*/
not_annotated_void_function();
/*@=noeffectuncon@*/
Функция-оболочка будет выглядеть примерно так:
/*@shared@*/ /*@null@*/ /*@out@*/ static void * MY_GC_MALLOC(size_t size) /*@*/{
/*@-onlytrans@*/
return( GC_MALLOC(size) );
/*@=onlytrans@*/
}
Тогда в примере вы будете использовать MY_GC_MALLOC
вместо GC_MALLOC
.