Как избежать предупреждения gcc в расширении Python C при использовании Py_BEGIN_ALLOW_THREADS

Самый простой способ управлять GIL в расширениях Python C состоит в том, чтобы использовать обеспеченные макросы:

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

Это работает отлично, позволяя мне выпустить GIL для объема моего кода, но повторно захватывая его для маленьких битов кода, которым нужен он.

Проблема состоит в том, когда я компилирую это с gcc, я добираюсь:

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

потому что Py_BEGIN_ALLOW_THREADS определяется как это:

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

Так, три вопроса:

  1. Действительно ли возможно подавить предупреждение gcc,
  2. Делает у любого есть любая идея, почему gcc думает _save мог бы использоваться неинициализированный, так как этому присваивают сразу после его объявления, и
  3. Почему макрос не был бы определен, чтобы объявить и инициализировать переменную в одном операторе для предотвращения проблемы?

(последние два действительно только для моего собственного любопытства).

Я могу избежать проблемы, не используя макросы и делая все это сам, но я быть бы нет.

7
задан Ned Batchelder 27 January 2010 в 15:23
поделиться

3 ответа

  1. Да, можно подавлять неинициализированные предупреждения, используя -wnopix.

-Wall -Wno-неинициализирован

Если вы хотите удалить только это предупреждение, вы можете просто инициализировать _save на нулевой указатель, чтобы он не полагался на значение возвращаемого функции. , Эта одна строка кода и комментарий имеет смысл для меня:

PyThreadState *_save; 
_save = 0; /* init as null pointer value */
_save = PyEval_SaveThread();
3
ответ дан 7 December 2019 в 14:32
поделиться

NED, вы можете попробовать один из них :

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

или игнорировать -WUnИнициализированные ? Согласно документации, вы должны сделать это до определения любых данных или функций. Может быть, это позволит вам отключить предупреждение только для этого файла?

0
ответ дан 7 December 2019 в 14:32
поделиться

Мои два цента:

  1. Вы можете подавлять конкретные предупреждения, но я думаю, вы уже знали это.
  2. Это говорит о быть неинициализированным: -)
  3. Единственная причина, по которой я могу представить, это совместимость со старыми компиляторами C.

Я пытался копать источник , но не мог найти никаких хороших подсказков.

1
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: