2012-06-07 19 views
7

mam jakiś kod, który jest podobny do tego (to nie jest kod produkcji. Wystarczy przykładowy kod)Co to jest wskaźnik Singleton w C?

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

func(&inbuf); 


..... 

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

} 

Coverity Narzędzie mówi, że „Biorąc adres z & inbuf plony pojedyncza”. Słyszałem termin singleton w odniesieniu do C++. Ale co oznacza singletowy wskaźnik w kategoriach C?

+0

Singleton jest podobny do globalnego, który zostanie utworzony tylko raz i będzie dostępny za każdym razem. Sprawdź to dla więcej: http://www.infernodevelopment.com/singleton-c – NKamrath

+1

pokaż nam linię, która deklaruje buf. –

Odpowiedz

8

Co oznacza wskaźnik singletowy pod względem C?

W tym przypadku myślę Coverity odnosi się do różnicy między tablicą char * i wskaźnik do pojedynczego char* utworzonego poprzez adres tej tablicy.

Coverity ostrzega, że ​​przekazując adres pierwszego elementu buf do func, robisz to trudniejsze dla siebie, aby bezpiecznie pisać na tej tablicy, ponieważ nie można łatwo określić jej rozmiar.

Trudno mieć pewność, nie widząc wszystkich kodzie, ale zakładając buf jest tablicą już ogłoszony gdzieś w funkcji najwyższego poziomu, a następnie przy użyciu operatora sizeof na buf z tej funkcji przyniesie rozmiar tablicy .

Jednak kiedy przechodzą adres buf do func na linii

func(&inbuf); 

... func jedynie odbiera wskaźnik do pierwszego elementu tej tablicy. Od func nie można już używać sizeof do określenia rozmiaru tablicy - it will just return the size of the pointer - i dlatego nie można bezpiecznie pisać do tego wskaźnika bez pewnego domyślnego zrozumienia, ile miejsca zawiera tablica.

To powoduje, że kod jest niestabilny i dlatego jest kiepską praktyką.

(Nic z tego nie ma nic wspólnego z Singleton Pattern)

0

Analiza Coverity jest wiotczejącą wad poniższego wzoru:

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 

Jest to wzór bug, często, ponieważ funkcja oczekuje wskaźnika na bufor, ale przekazujesz mu wskaźnik do wartości singleton. Systemy typów w C/C++ nie rozróżniają "wskaźnika na jeden obiekt" i "wskaźnik na tablicę obiektów".

+2

Nie powinien być pierwszym wierszem: "typeA var [x]; // zadeklarować zmienną tablicową pewnego typu"? – pmod

+0

nie, cały punkt jest tym, co sprawia, że ​​jest to błąd polegający na przekazywaniu wskaźnika do obiektu singleton, a nie tablicy. –