كيفية تجنب تحذير GCC في امتداد Python C عند استخدام py_begin_allow_threads
-
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();
لذلك ، ثلاثة أسئلة:
- هل من الممكن قمع تحذير دول مجلس التعاون الخليجي ،
- هل لدى أي شخص أي فكرة عن سبب تفكير مجلس التعاون الخليجي
_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
؟ وفقًا للوثائق ، يجب عليك القيام بذلك قبل تحديد أي بيانات أو وظائف. ربما سيتيح لك تعطيل التحذير فقط لهذا الملف؟