2012-06-07 129 views
7

我有一些代碼是這樣的(這不是生產代碼,只是一個示例代碼)什麼是C中的單例指針?

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

func(&inbuf); 


..... 

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

} 

Coverity的工具說:「與& INBUF產生一個單以地址」。我聽說過關於C++的單例。但是,單指針在C語言中意味着什麼?

+0

單例就像一個只會創建一次的全局,每次都可以訪問。查看更多信息:http://www.infernodevelopment.com/singleton-c – NKamrath

+1

向我們顯示聲明buf的行。 –

回答

8

單指針在C語言中的含義是什麼?

在這種情況下,我認爲Coverity的被參照的char *的陣列和指針之間的差,以通過利用該數組的地址創建了單個char*

Coverity的警告您通過buf的第一個元素的地址傳遞給func,你使之更難以爲自己安全寫入到陣列,因爲你不能輕易確定其大小。

這很難,沒有看到所有的代碼可以肯定的,但假設buf是你給然後使用sizeof操作上buf從該函數將產生數組的大小你的頂級函數聲明的地方數組。

但是,當在該行

func(&inbuf); 

... func傳遞的buf地址func僅僅接收一個指針數組的第一個元素。從func開始,您不能再使用sizeof來確定數組的大小 - it will just return the size of the pointer - 因此,如果不隱式理解數組包含多少空間,就無法安全地寫入該指針。

這使得脆弱的代碼,因此是不好的做法。

(這一切都不是什麼做的Singleton Pattern

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++中的類型系統不區分「指向一個對象的指針」和「指向對象數組的指針」。

+2

不應該是第一行:「typeA var [x]; //聲明某種類型的數組變量」? – pmod

+0

不,整點是什麼使它成爲一個錯誤是你將傳遞一個指向單身對象,而不是一個數組。 –