2012-06-07 9 views
7

मैं कुछ कोड है जो इस तरह हैसी में सिंगलटन पॉइंटर क्या है?

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

func(&inbuf); 


..... 

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

} 

Coverity टूल के अनुसार "& inbuf एक सिंगलटन पैदावार के साथ पते ले रहा है" (यह उत्पादन कोड। बस एक नमूना कोड नहीं है) है। मैंने सी ++ के संबंध में सिंगलटन शब्द सुना है। लेकिन, सी के संदर्भ में सिंगलटन पॉइंटर का क्या अर्थ है?

+0

एक सिंगलटन वैश्विक की तरह है जो केवल एक बार बनाया जाएगा और जब भी इसे एक्सेस किया जा सकता है। इसके लिए और अधिक जांचें: http://www.infernodevelopment.com/singleton-c – NKamrath

+1

हमें बफ घोषित करने वाली रेखा दिखाएं। –

उत्तर

8

सी के संदर्भ में सिंगलटन पॉइंटर का क्या अर्थ है?

इस मामले में मुझे लगता है कि Coverity एक भी char* कि सरणी के पते लेने के द्वारा बनाई गई करने के लिए चार * की एक सरणी और एक सूचक के बीच अंतर करने के लिए बात कर रहा है।

Coverity आपको लगता है कि func को buf के पहले तत्व का पता पारित करके, आप इसे और अधिक मुश्किल से अपने आप को सुरक्षित रूप से है कि सरणी में लिखने के लिए क्योंकि आप आसानी से इसका आकार निर्धारित नहीं कर सकता के लिए कर रहे हैं चेतावनी है।

यह अपने कोड के सभी देखे बिना सुनिश्चित करने के लिए मुश्किल है, लेकिन यह सोचते हैं buf एक सरणी आप कहीं अपने उच्च-स्तरीय समारोह तो उस समारोह से buf पर sizeof ऑपरेटर का उपयोग सरणी के आकार निकलेगा में घोषित किया है ।

हालांकि, जब आप लाइन

func(&inbuf); 

... func पर func को buf का पता पारित केवल कि सरणी के पहले तत्व के लिए सूचक प्राप्त करता है। func से अब आप sizeof का उपयोग सरणी के आकार को निर्धारित करने के लिए नहीं कर सकते - it will just return the size of the pointer - और इसलिए आप उस पॉइंटर को सुरक्षित रूप से लिख नहीं सकते हैं कि सरणी में कितनी जगह है।

यह नाजुक कोड बनाता है, और इसलिए खराब अभ्यास है।

0

Coverity विश्लेषण निम्नलिखित पैटर्न के एक दोष पर चिह्नित करने है (यह से कोई भी Singleton Pattern से कोई लेना देना है):

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 

यह एक बग पैटर्न, अक्सर है, क्योंकि समारोह एक बफर को पॉइंटर की अपेक्षा करता है, लेकिन आप इसे सिंगलटन वैल्यू पर पॉइंटर पास कर रहे हैं। सी/सी ++ में टाइप सिस्टम "पॉइंटर टू ऑब्जेक्ट" और "ऑब्जेक्ट्स की सरणी के पॉइंटर" के बीच अंतर नहीं करते हैं।

+2

पहली पंक्ति नहीं होनी चाहिए: "typeA var [x]; // किसी प्रकार का सरणी चर घोषित करें"? – pmod

+0

नहीं, पूरा बिंदु यह है कि यह एक बग बनाता है कि आप एक सिंगल ऑब्जेक्ट में पॉइंटर पास कर रहे हैं, एक सरणी नहीं। –

संबंधित मुद्दे