【问题标题】:How to avoid gcc warning in Python C extension when using Py_BEGIN_ALLOW_THREADS使用 Py_BEGIN_ALLOW_THREADS 时如何避免 Python C 扩展中的 gcc 警告
【发布时间】:2010-01-27 13:11:32
【问题描述】:

在 Python C 扩展中操作 GIL 的最简单方法是使用提供的宏:

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. 为什么不定义宏来在一个语句中声明和初始化变量以避免该问题?

(最后两个真的只是为了我自己的好奇心)。

我可以通过不使用宏并自己做所有事情来避免这个问题,但我宁愿不这样做。

【问题讨论】:

    标签: python gcc gil cextension


    【解决方案1】:
    1. 是的,可以使用 -Wno- 前缀抑制未初始化的警告。

    -Wall -Wno-uninitialized

    如果你只想删除这个警告,你可以简单地将_save初始化为一个空指针,这样它就不会依赖于函数返回值......那一行代码和一个注释对我来说很有意义:

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

    【讨论】:

    • 我希望有一种非常本地化的方法来禁用这一行上的这个警告。我宁愿不禁用所有未初始化的警告。
    • 如果您只想阻止此警告,请在调用 PyEval_SaveThread() 之前添加一行以将 _save 初始化为空指针(请参阅上面的更新答案)
    【解决方案2】:

    我的两分钱:

    1. 您可以隐藏特定警告,但我想您已经知道这一点。
    2. 它说可能未初始化:-)
    3. 我能想到的唯一原因是与旧 C 编译器的兼容性。

    我尝试挖掘the source,但找不到任何好的线索。

    【讨论】:

    • 1.我知道我可以在命令行上禁用所有类别的警告,但我希望有一个编译指示可以只禁用这一个警告。
    【解决方案3】:

    内德,你可以试试one of these

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

    还是忽略-Wuninitialized?根据文档,您必须在定义任何数据或函数之前执行此操作。也许它会让您禁用该文件的警告?

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 2019-02-21
      • 2016-12-25
      • 2021-02-04
      • 2016-06-05
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多