¿Cómo evitar la advertencia gcc en extensión de Python C cuando se utiliza Py_BEGIN_ALLOW_THREADS

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

  •  23-09-2019
  •  | 
  •  

Pregunta

La forma más sencilla de manipular el GIL en las extensiones Python C es el uso de las macros siempre que:

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;
}

Esto funciona muy bien, dejando que lanza los GIL para la mayor parte de mi código, pero re-agarrándola por pequeños trozos de código que lo necesitan.

El problema es cuando compilo esto con gcc, me sale:

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

debido Py_BEGIN_ALLOW_THREADS se define así:

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

Por lo tanto, tres preguntas:

  1. ¿Es posible suprimir la advertencia de gcc,
  2. ¿Alguien tiene alguna idea de por qué piensa gcc _save podrían ser utilizados sin inicializar, ya que se asigna a inmediatamente después de su declaración, y
  3. ¿Por qué no la macro se han definido para declarar e inicializar la variable en una instrucción para evitar el problema?

(los dos últimos son en realidad sólo para mi propia curiosidad).

Me puede evitar el problema al no utilizar las macros y hacer todo por mí mismo, pero yo preferiría no hacerlo.

¿Fue útil?

Solución

  1. Si, es posible suprimir las advertencias sin inicializar utilizando el prefijo -Wno-.

-Wall -Wno-uninitialized

Si desea eliminar sólo esta advertencia, podría simplemente _save initialize a un puntero nulo para que no se basa en un valor de retorno de la función ... que una línea de código y un comentario tiene sentido para mí:

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

Otros consejos

Mis dos centavos:

  1. Puede suprimir advertencias específicas, pero supongo que ya lo sabía.
  2. Se dice podría desinicializar: -)
  3. La única razón que puedo imaginar es la compatibilidad con los compiladores de C mayores.

He intentado excavar en la fuente , pero no pudo encontrar ninguna pista buenas.

Ned, se puede tratar uno de estos :

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

O ignorar -Wuninitialized? Según la documentación, lo que tiene que hacer esto antes de definir cualquier dato o funciones. Tal vez le permitirá desactivar la advertencia sólo para ese archivo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top