9

このようなコードがあります(これは製品コードではありません。単なるサンプルコードです)

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に関して何を意味するのでしょうか?

4

2 に答える 2

9

シングルトンポインタはCに関して何を意味しますか?

char*この場合、Coverityは、char *の配列と、その配列のアドレスを取得して作成された単一へのポインターとの違いを指していると思います。

bufCoverityは、の最初の要素のアドレスをに渡すことによりfunc、そのサイズを簡単に決定できないため、その配列に安全に書き込むことがより困難になることを警告しています。

すべてのコードを見ずに確認するのは難しいbufですが、最上位関数のどこかで宣言した配列であると仮定すると、その関数からsizeof演算子onを使用するbufと、配列のサイズが得られます。

ただし、のアドレスを次buffunc行に渡すと

func(&inbuf); 

...funcその配列の最初の要素へのポインタを受け取るだけです。配列のサイズを決定するためにfunc使用することはできなくなります-ポインタのサイズを返すだけです-したがって、配列に含まれるスペースの量を暗黙的に理解しない限り、そのポインタに安全に書き込むことはできません。sizeof

これは壊れやすいコードになるため、不適切な方法です。

(これはシングルトンパターンとは何の関係もありません)

于 2012-06-07T15:46:10.067 に答える
1

コベリティ分析は、次のパターンの欠陥にフラグを立てています。

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 ++の型システムは、「1つのオブジェクトへのポインター」と「オブジェクトの配列へのポインター」を区別しません。

于 2012-06-08T05:33:23.077 に答える