2012-06-07 10 views
7

ho qualche codice che è come questo (Questo non è il codice di produzione. Solo un codice di esempio)Cos'è un puntatore Singleton in C?

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

func(&inbuf); 


..... 

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

} 

Coverity strumento dice che "Prendendo indirizzo con & inbuf produce un Singleton". Ho sentito il termine singleton rispetto a C++. Ma cosa significa un puntatore singleton in termini di C?

+0

Un singleton è come un globale che verrà creato una sola volta e accessibile in qualsiasi momento. Controlla questo per ulteriori informazioni: http://www.infernodevelopment.com/singleton-c – NKamrath

+1

mostraci la linea che dichiara buf. –

risposta

8

Che cosa significa un puntatore singleton in termini di C?

In questo caso ritengo Coverity si riferisce alla differenza tra un array di char * e un puntatore a una singola char* creato prendendo l'indirizzo di tale matrice.

Coverity che passando l'indirizzo del primo elemento di buf a func, si sta rendendo più difficile per voi stessi a scrivere in modo sicuro a tale matrice, perché non è possibile determinare con facilità la sua dimensione è di avviso.

E 'difficile essere sicuri senza vedere tutto il codice, ma assumendo buf è un array che hai dichiarato da qualche parte nella vostra funzione di primo livello quindi utilizzando l'operatore sizeof su buf da quella funzione produrrà la dimensione dell'array .

Tuttavia, quando si passa l'indirizzo di buf per func alla linea

func(&inbuf); 

... func solo riceve un puntatore al primo elemento di tale matrice. Da func non è più possibile utilizzare sizeof per determinare la dimensione dell'array - it will just return the size of the pointer - e quindi non è possibile scrivere in modo sicuro su quel puntatore senza una comprensione implicita di quanto spazio contiene la matrice.

Questo rende fragile il codice, e quindi è una cattiva pratica.

(Niente di tutto questo è nulla a che fare con la Singleton Pattern)

0

L'analisi Coverity langue un difetto del seguente schema:

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 

Questo è un modello di bug, di frequente, perché la funzione si aspetta un puntatore a un buffer, ma lo si passa a un puntatore a un valore singleton. I sistemi di tipi in C/C++ non distinguono tra "puntatore a un oggetto" e "puntatore a matrice di oggetti".

+2

Non dovrebbe essere la prima riga: "tipoA var [x]; // dichiara una variabile di matrice di qualche tipo"? – pmod

+0

no, l'intero punto è ciò che lo rende un bug è si passa un puntatore a un oggetto singleton, non un array. –