2010-01-27 14 views
7

Il modo più semplice per manipolare la GIL nelle estensioni Python C è quello di utilizzare le macro fornite:Come evitare avvertimento gcc in estensione Python C quando si utilizza Py_BEGIN_ALLOW_THREADS

my_awesome_C_function() 
{ 
    blah; 

    Py_BEGIN_ALLOW_THREADS 

    // do stuff that doesn't need the GIL 

    if (should_i_call_back) { 
     Py_BLOCK_THREADS 
     // do stuff that needs the GIL 
     Py_UNBLOCK_THREADS 
    } 

    Py_END_ALLOW_THREADS 

    return blah blah; 
} 

Questa grande opera, facendomi rilasciare il GIL per la maggior parte del mio codice, ma ri-afferrandolo per piccoli bit di codice che ne hanno bisogno.

Il problema è quando compilo questo con gcc, ottengo:

ext/engine.c:548: warning: '_save' might be used uninitialized in this function 

perché Py_BEGIN_ALLOW_THREADS è definita in questo modo:

#define Py_BEGIN_ALLOW_THREADS { \ 
     PyThreadState *_save; \ 
     _save = PyEval_SaveThread(); 

Così, tre domande:

  1. Is è possibile sopprimere l'avviso di gcc,
  2. Qualcuno ha qualche idea del perché gcc pensa che il _save possa essere usato non inizializzato, poiché è assegnato immediatamente dopo la sua dichiarazione, e
  3. Perché la macro non sarebbe stata definita per dichiarare e inizializzare la variabile in una dichiarazione per evitare il problema?

(gli ultimi due sono in realtà solo per mia curiosità).

Posso evitare il problema non utilizzando i macro e facendo tutto da solo, ma preferirei di no.

risposta

3
  1. Sì, è possibile sopprimere gli avvisi non inizializzati utilizzando il prefisso -Wno-.

-Wall -Wno-uninitialized

Se si desidera rimuovere solo questo avviso, si potrebbe semplicemente inizializzare _save ad un puntatore nullo in modo che non si basa su un valore di ritorno funzione ... che una riga di codice e un commento ha senso per me:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */ 
_save = PyEval_SaveThread(); 
+0

Speravo in un modo molto localizzato per disabilitare solo questo avvertimento su questa linea. Preferisco non disabilitare tutti gli avvisi non inizializzati. –

+0

se si desidera evitare solo questo avviso, aggiungere una riga prima di chiamare 'PyEval_SaveThread()' per inizializzare '_save' su un puntatore nullo (vedere risposta aggiornata sopra) –

1

I miei due centesimi:

  1. È possibile eliminare gli avvisi specifici, ma Immagino che tu lo sapessi già.
  2. Dice potrebbe essere :-) inizializzato
  3. L'unico motivo che posso immaginare è la compatibilità con i vecchi compilatori C.

Ho provato a scavare nel the source, ma non ho trovato alcun indizio valido.

+1

1. Sapevo di poter disabilitare intere classi di avvisi sul riga di comando, ma speravo in un pragma che potesse disabilitare solo questo avvertimento. –

0

Ned, si può provare one of these:

#pragma GCC diagnostic warning "-Wno-unitialized" 
#pragma GCC diagnostic error "-Wno-uninitialized" 
#pragma GCC diagnostic ignored "-Wno-uninialized" 

o ignorare -Wuninitialized? Secondo la documentazione, è necessario farlo prima che vengano definiti dati o funzioni. Forse ti permetterà di disabilitare l'avviso solo per quel file?

Problemi correlati