- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了使用夹板的问题。这是类似的代码
#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;
}
夹板发出这样的警告信息,
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 中的参数 out,我需要在使用前检查 NULL 指针。然后返回内存地址。注释“/@out@/”不能放在第一个参数之前,因为它在函数中使用。而“/@null@/”只表示out可以为null,不能为*out。我不知道如何处理它。谁能给一些建议?提前致谢。
最佳答案
最终你无法用夹板表达你想表达的。给定的原型(prototype)根本不可能。主要原因是你需要告诉 splint,*out
是一个 /*@out@*/
和一个 /*@only@*/
。除了夹板没有通过参数返回 /*@only@*/
存储的概念。每当您将 /*@only@*/
放在参数中时,splint 都会假定所讨论的函数 free()
是内存,但您打算在此处分配。您现在基本上有两个选择:
关于c - 如何从参数返回内存指针以应用于夹板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21372159/
我正在使用夹板作为 c99 代码的静态分析器。 Splint 似乎不太符合 c99。因此我应用了这个补丁: http://www.cs.virginia.edu/pipermail/splint-di
我知道局部变量在未设置时可以具有“随机”值,但是用指针设置局部变量的第一个值是否不好?例如: void setValue(int* p_val) { *p_val = …; /* Assign
我正在努力学习和更好地理解夹板,我想知道我从这段代码中得到的一个错误: #include #include #include /*@null@*/ /*@only@*/ char *dupStr
(这是我的 previous question 的扩展)。我在 Windows CLI 中使用 Splint。 XC8 嵌入式 C 编译器有一个自定义类型 bit。为了让 Splint 进行解析,我可
我在 C 中使用动态字符串数组: char** strings; 我初始化它: int max = 10; strings = malloc(sizeof(char*) * max); 然后复制几个虚
我是一名优秀的程序员,十分优秀!