Comment éviter d'avertissement de gcc en extension Python C lors de l'utilisation Py_BEGIN_ALLOW_THREADS

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

  •  23-09-2019
  •  | 
  •  

Question

La façon la plus simple de manipuler le GIL dans les extensions Python C est d'utiliser les macros fourni:

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

Cela fonctionne très bien, me laisser libérer le GIL pour la majeure partie de mon code, mais re-saisir pour les petits bouts de code qui en ont besoin.

Le problème est quand je compile cela avec gcc, je reçois:

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

parce que Py_BEGIN_ALLOW_THREADS est défini comme suit:

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

Alors, trois questions:

  1. Est-il possible de supprimer l'avertissement de gcc,
  2. Est-ce que quelqu'un a une idée pourquoi gcc pense _save pourrait être utilisé non initialisée, car il est attribué immédiatement après sa déclaration, et
  3. Pourquoi pas la macro ont été définis pour déclarer et initialiser la variable dans une instruction pour éviter le problème?

(les deux derniers sont vraiment juste pour ma propre curiosité).

Je peux éviter le problème en n'utilisant les macros et de le faire moi-même, mais je préfère ne pas.

Était-ce utile?

La solution

  1. Oui, il est possible de supprimer les avertissements non initialisées en utilisant le préfixe -Wno-.

-Wall -Wno-uninitialized

Si vous voulez simplement supprimer cet avertissement, vous pouvez simplement initialiser _save à un pointeur NULL afin qu'elle ne repose pas sur une valeur de retour de la fonction ... qu'une ligne de code et un commentaire me semble logique:

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

Autres conseils

Mes deux cents:

  1. Vous pouvez supprimer des avertissements spécifiques, mais je suppose que vous le saviez déjà.
  2. Il dit peut être non initialisé: -)
  3. La seule raison pour laquelle je peux imaginer la compatibilité avec les anciens compilateurs C.

J'ai essayé de creuser dans source, mais n'a pas pu trouver de bons indices.

Ned, vous pouvez essayer un de ces :

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

Ou ignorer -Wuninitialized? Selon la documentation, vous devez le faire avant toutes les données ou les fonctions sont définies. Peut-être qu'il vous permettra de désactiver l'avertissement pour ce fichier?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top