كيفية تجنب تحذير GCC في امتداد Python C عند استخدام py_begin_allow_threads

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

  •  23-09-2019
  •  | 
  •  

سؤال

إن أبسط طريقة لمعالجة 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. هل من الممكن قمع تحذير دول مجلس التعاون الخليجي ،
  2. هل لدى أي شخص أي فكرة عن سبب تفكير مجلس التعاون الخليجي _save قد يتم استخدامه غير مهيأ ، حيث يتم تعيينه على الفور بعد إعلانه ، و
  3. لماذا لم يتم تعريف الماكرو لإعلان المتغير وتهيئته في بيان واحد لتجنب المشكلة؟

(آخر اثنين حقا فقط لفضولي الخاص).

يمكنني تجنب المشكلة من خلال عدم استخدام وحدات الماكرو والقيام بكل ذلك بنفسي ، لكنني لا أفضل ذلك.

هل كانت مفيدة؟

المحلول

  1. نعم ، من الممكن قمع التحذيرات غير المعنية باستخدام البادئة -wno-.

-Wall -Wno-uninitialized

إذا كنت ترغب في إزالة هذا التحذير فقط ، يمكنك ببساطة التهيئة _save إلى مؤشر فارغ حتى لا يعتمد على قيمة إرجاع الوظيفة ... أن سطر رمز واحد والتعليق منطقي بالنسبة لي:

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

نصائح أخرى

سنتى:

  1. يمكنك قمع تحذيرات محددة ، لكنني أعتقد أنك تعرف ذلك بالفعل.
  2. انها تقول ربما كن غير مؤهل :-)
  3. السبب الوحيد الذي جعلني أتخيل هو التوافق مع المترجمين C الأقدم.

حاولت الحفر في المصدر, ، ولكن لم يستطع العثور على أي أدلة جيدة.

نيد ، يمكنك المحاولة واحدة من هذه:

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

أو تجاهل -Wuninitialized؟ وفقًا للوثائق ، يجب عليك القيام بذلك قبل تحديد أي بيانات أو وظائف. ربما سيتيح لك تعطيل التحذير فقط لهذا الملف؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top