我遇到了使用夹板的问题。这是类似的代码
#include <stdio.h>
#include <stdlib.h>
static void getMem(/*@null@*/void **out, size_t size)
{
if(out == NULL)
return;
*out = malloc(size);
}
int main(/*@unused@*/int argc, /*@unused@*/char *argv[])
{
char *str = NULL;
getMem((void **)&str, 1);
if(str != NULL)
{
*str = 'a';
(void)putchar(*str);
free(str);
}
return 0;
}
splint会发出这样的警告信息,
main.c: (in function getMem)
main.c:11:2: Function returns with possibly null storage derivable from
parameter *out
A possibly null pointer is reachable from a parameter or global variable that
is not declared using a /*@null@*/ annotation. (Use -nullstate to inhibit
warning)
main.c:10:12: Storage *out may become null
main.c:11:2: Function returns storage out reachable from parameter not
completely defined (**out is undefined)
Storage derivable from a parameter, return value or global is not defined.
Use /*@out@*/ to denote passed or returned storage which need not be defined.
(Use -compdef to inhibit warning)
main.c:10:12: Storage **out allocated
对于函数getMem中的参数输出,我需要在使用前检查NULL指针。然后返回内存地址。注释“/ @out @ /”不能放在第一个参数之前,因为它在函数中使用。并且“/ @null @ /”仅表示out可以为null但不是* out。我不知道如何处理它。有人可以提供一些建议吗?提前谢谢。
答案 0 :(得分:2)
最终,您无法使用夹板表达您想表达的内容。对于给定的原型,这是不可能的。主要原因是你需要告诉夹板,*out
是/*@out@*/
和/*@only@*/
。除了夹板没有通过参数返回/*@only@*/
存储的概念。无论何时将/*@only@*/
置于参数夹板中,假设问题free()
中的函数是内存,但您打算在此处进行分配。你现在基本上有两个选择: