我有一些像这样的代码(这不是生产代码。只是一个示例代码)
char *inbuf = NULL;
inbuf = buf; //buf is some other valid buffer of size 100.
func(&inbuf);
.....
void func(char **p)
{
...
(*p)++;
...
}
Coverity Tool说“使用& inbuf获取地址会产生一个单身”。我听说过关于C ++的单例一词。但是,单个指针在C方面意味着什么?
答案 0 :(得分:8)
单个指针在C方面意味着什么?
在这种情况下,我认为Coverity指的是char *数组与通过获取该数组的地址而创建的单个char*
的指针之间的区别。
Coverity警告你,通过将buf
的第一个元素的地址传递给func
,你会让自己更难以安全地写入该数组,因为你不能轻易确定它的大小。
如果没有看到所有代码,很难确定,但假设buf
是一个数组,您已在顶层函数中声明了某个位置,然后在{{1}上使用sizeof
运算符从该函数将产生数组的大小。
但是,当您在
行传递buf
到[{1}}的地址时
buf
... func
仅接收指向该数组的第一个元素的指针。从func(&inbuf);
开始,您无法再使用func
来确定数组的大小 - it will just return the size of the pointer - 所以如果没有一些隐含的理解,那么您无法安全地写入该指针。数组包含。
这使得代码易碎,因此实践很差。
(这些与Singleton Pattern)
无关答案 1 :(得分:0)
Coverity分析标志着以下模式的缺陷:
typeA var; // declare a variable to some type
func(&var) // call a function passing the address of var
func(typeA *var) {
...
var++; // inside the function do pointer arithmetic on var
这通常是一种错误模式,因为函数需要一个指向缓冲区的指针,但是你向它传递一个指向单例值的指针。 C / C ++中的类型系统不区分“指向一个对象的指针”和“指向对象数组的指针”。