如何在使用Py时避免Python C扩展中的gcc警告

在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();

所以,三个问题:

  • 是否可以抑制gcc的警告,
  • 有没有人有任何想法,为什么gcc认为_save可能会被使用未初始化,因为它被声明后立即分配,并且
  • 为什么宏定义不能在一个语句中声明和初始化变量以避免该问题?
  • (最后两个真的只是为了我自己的好奇心)。

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


  • 是的,可以使用-Wno-前缀来抑制未初始化的警告。
  • -Wall -Wno-uninitialized

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

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

    我的两分钱:

  • 你可以禁止特定的警告,但我想你已经知道了。
  • 它说可能是未初始化的:-)
  • 我能想象的唯一原因是与旧版C编译器的兼容性。
  • 我试着挖掘源代码,但找不到任何好的线索。


    内德,你可以尝试其中的一种:

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

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

    链接地址: http://www.djcxy.com/p/44363.html

    上一篇: How to avoid gcc warning in Python C extension when using Py

    下一篇: BufferedIterator implementation