在c中使用mysql时,可以使用mysql api释放内存,如下所示:

MYSQL* connection = NULL;
connection = mysql_init(NULL);
// Stuff...
mysql_close(connection);

但Splint不知道mysql_close实际上是在释放内存,所以我得到这个错误:
Fresh storage connection not released before return
A memory leak has been detected. Storage allocated locally is
not released before the last reference to it is lost. (Use
-mustfreefresh to inhibit warning)

如何告诉splintmysql_close正在释放内存?对mysql.h文件的特殊注释?
编辑:好的,如果可以在头文件中使用的话,可以使用releases *p注释。会努力的。
编辑2:已将/*@releases *sock@*/添加到mysql.h,但现在出现此错误:
Releases clauses includes *sock of non-dynamically allocated
              type MYSQL
A declaration uses an invalid annotation. (Use -annotationerror to inhibit
warning)

这是mysql_close的标志:
void STDCALL mysql_close(/*@notnull@*/ MYSQL *sock) /*@releases *sock@*/;

最佳答案

我认为恰当的诠释应该是:

void STDCALL mysql_close(/*@special@*/ /*@notnull@*/ MYSQL *sock)
    /*@releases sock@*/;

您遗漏的关键是/*@special@*/注释,这是“激活”所谓状态子句所必需的。从Splint的文档来看,7.4 State Clauses
/*@special@*/注释用于标记参数global
变量,或使用状态子句描述的返回值。

08-16 01:35