Splint不知道库函数正在释放内存

时间:2014-08-07 15:50:03

标签: mysql c splint

在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)

如何告诉Splint mysql_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@*/;

1 个答案:

答案 0 :(得分:1)

我相信适当的注释会是:

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

您错过的关键是/*@special@*/注释,需要"激活"所谓的州条款。来自Splint的文档,7.4 State Clauses

  

/*@special@*/注释用于标记参数global   变量,或使用state子句描述的返回值。