9

I have some code which is like this (This is not production code. Just a sample code)

char *inbuf = NULL;
inbuf = buf; //buf is some other valid buffer of size 100.

func(&inbuf);


.....

void func(char **p)
{
  ...
  (*p)++;
  ...

}

Coverity Tool says that "Taking address with &inbuf yields a singleton". I have heard the term singleton with respect to C++. But, what does a singleton pointer mean in terms of C?

4

2 回答 2

9

单例指针在 C 中是什么意思?

char*在这种情况下,我认为 Coverity 指的是 char* 数组和指向通过获取该数组的地址创建的单个指针之间的差异。

Coverity 警告您,通过传递 to 的第一个元素的地址buffunc您将更难以安全地写入该数组,因为您无法轻松确定其大小。

如果不查看所有代码,很难确定,但假设buf是您在顶级函数中某处声明的数组,则使用该函数中的sizeof运算符 onbuf将产生数组的大小。

但是,当您在该行传递bufto的地址时func

func(&inbuf); 

...func仅接收指向该数组第一个元素的指针。从func你不能再用它sizeof来确定数组的大小——它只会返回指针的大小——所以如果没有对数组包含多少空间的隐含理解,你就不能安全地写入该指针。

这会导致代码脆弱,因此是不好的做法。

(这些都与单例模式无关)

于 2012-06-07T15:46:10.067 回答
1

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++ 中的类型系统不区分“指向一个对象”和“指向对象数组的指针”。

于 2012-06-08T05:33:23.077 回答