Come evitare di avvertimento gcc in estensione Python C quando si utilizza Py_BEGIN_ALLOW_THREADS

StackOverflow https://stackoverflow.com/questions/2147029

  •  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:

  1. E 'possibile sopprimere gli avvisi di gcc,
  2. 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
  3. 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.

È stato utile?

Soluzione

  1. 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:

  1. È possibile sopprimere avvertenze specifiche, ma credo che si sapeva già che.
  2. potrebbe essere inizializzato: -)
  3. 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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top