Come evitare di avvertimento gcc in estensione Python C quando si utilizza Py_BEGIN_ALLOW_THREADS
-
23-09-2019 - |
Domanda
Il modo più semplice per manipolare la GIL nelle estensioni Python C è quella di utilizzare le macro fornito:
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-grabbing per piccole parti 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();
Quindi, tre domande:
- E 'possibile sopprimere gli avvisi di gcc,
- Qualcuno ha qualche idea del perché gcc pensa
_save
potrebbe essere utilizzato non inizializzati, dal momento che viene assegnato a subito dopo la sua dichiarazione, e - Perché non il macro sono stati definiti di dichiarare e inizializzare la variabile in un'istruzione per evitare il problema?
(gli ultimi due sono in realtà solo per la mia curiosità).
Posso evitare il problema non usando le macro e facendo tutto da solo, ma io preferirei di no.
Soluzione
- Sì, è possibile eliminare 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 della 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();
Altri suggerimenti
I miei due centesimi:
- È possibile sopprimere avvertenze specifiche, ma credo che si sapeva già che.
- potrebbe essere inizializzato: -)
- L'unico motivo che posso immaginare è la compatibilità con i vecchi compilatori C.
Ho provato scavare la fonte , ma non riusciva a trovare qualche buon indizio.
Ned, si può provare a uno di questi :
#pragma GCC diagnostic warning "-Wno-unitialized"
#pragma GCC diagnostic error "-Wno-uninitialized"
#pragma GCC diagnostic ignored "-Wno-uninialized"
o ignorare -Wuninitialized
? Secondo la documentazione, si deve fare questo prima sono definiti tutti i dati o funzioni. Forse vi permetterà di disattivare l'avviso solo per quel file?