2012-06-07 9 views
7

ich einen Code haben, die wie folgt ist (dies ist nicht der Produktion Code ist. Nur ein Beispielcode)Was ist ein Singleton Zeiger in C?

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

func(&inbuf); 


..... 

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

} 

Coverity-Tool sagt, dass „Adresse mit & Unter INBUF Singleton ergibt“. Ich habe den Begriff Singleton in Bezug auf C++ gehört. Aber was bedeutet ein Singleton-Zeiger in Bezug auf C?

+0

Ein Singleton ist wie ein Global, das nur einmal erstellt wird und jederzeit aufgerufen werden kann. Überprüfen Sie dieses für mehr: http://www.infernodevelopment.com/singleton-c – NKamrath

+1

zeigen Sie uns die Linie, die buf erklärt. –

Antwort

8

Was bedeutet ein Singleton-Zeiger in Bezug auf C?

In diesem Fall denke ich Coverity zwischen einem Array von char * und einem Zeiger auf eine einzelnen char* indem die Adresse dieses Array erstellt, die die Differenz bezieht.

Coverity warnt Sie, dass die Adresse des ersten Elements von buf zu func vorbei, Sie machen es schwieriger für sich selbst sicher zu diesem Array zu schreiben, weil man nicht einfach seine Größe bestimmen können.

Es ist schwierig, sicher zu sein, ohne den gesamten Code zu sehen, aber buf Annahme ist ein Array Sie irgendwo in Ihrem Top-Level-Funktion deklariert haben dann die Verwendung sizeof Operator auf buf aus dieser Funktion wird die Größe des Arrays ergeben .

Wenn jedoch die Adresse des zu buffunc an der Linie

func(&inbuf); 

passieren ... func lediglich empfängt einen Zeiger auf das erste Element des Arrays. Von func können Sie sizeof nicht mehr verwenden, um die Größe des Arrays zu bestimmen - it will just return the size of the pointer - und so können Sie nicht sicher in diesen Zeiger schreiben, ohne implizit zu verstehen, wie viel Speicherplatz das Array enthält.

Dies macht für fragile Code und ist daher schlechte Praxis.

(Nichts davon ist etwas mit dem Singleton Pattern zu tun)

0

Die Coverity-Analyse ist das Markieren eines Defekts folgendem Muster:

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 

Dies ist ein Bug-Muster, häufig, weil die Funktion erwartet einen Zeiger auf einen Puffer, aber Sie übergeben ihm einen Zeiger auf einen Singleton-Wert. Die Typsysteme in C/C++ unterscheiden nicht zwischen "Zeiger auf ein Objekt" und "Zeiger auf ein Array von Objekten".

+2

Sollte nicht die erste Zeile sein: "typeA var [x]; // eine Array-Variable eines bestimmten Typs deklarieren"? – pmod

+0

nein, der ganze Punkt ist, was es zu einem Fehler macht, dass Sie einen Zeiger auf ein Singleton-Objekt, nicht ein Array übergeben würden. –