اللغز:
لماذا هو std::function، مكونًا لا يتجزأ من قواعد بيانات لغة C الحديثة، ولا يتمتع بقدرات المقارنة المتساوية؟ لقد حيّر هذا السؤال المبرمجين منذ بدايته، مما أدى إلى ارتباك وصعوبات في إدارة مجموعات الكائنات القابلة للاستدعاء.
الغموض المبكر:
في مسودة مبكرة للغة C تم الإعلان عن معيار 11، والأحمال الزائدة للمشغل== والمشغل!= ولكن تم حذفهما، مما ترك فراغًا لم يتم شرحه بشكل كافٍ. ألمح التعليق المصاحب "إغلاق الثغرة المحتملة في نظام الكتابة" إلى خلل مخفي، لكن طبيعته ظلت غامضة.
الثغرة والحماية:
تنبع "الثغرة" المشتبه بها من وجود دالة تحويل منطقية. في غياب عوامل مقارنة المساواة الصريحة، يمكن أن تسمح هذه الوظيفة بإجراء مقارنات ضمنية عبر == أو !=. ومع ذلك، يمكن أن تؤدي هذه الثغرة إلى سلوك غير متوقع، كما هو موضح بواسطة:struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b!
}
قدمت لغة C 03 لغة المنطق الآمن ونفذت لغة C 11 وظيفة تحويل منطقية صريحة لمنع هذه الثغرة.التباين مع std::shared_ptr:
على عكس std::function، std::shared_ptr له دلالات مساواة محددة جيدًا. يكون المؤشران متساويين إذا كانا فارغين أو إذا كانا غير فارغين ويشيران إلى نفس الكائن. سمح هذا التعريف الواضح بتنفيذ عوامل مقارنة المساواة في std::shared_ptr.كشف اللغز:
الأساس المنطقي لعدم جعل المساواة في الوظيفة std::function قابلة للمقارنة ينبع من التحدي المتأصل المتمثل في تحديد معيار مساواة ذي معنى للأنواع التعسفية القابلة للاستدعاء. إذا تم فرضه، فإنه سيضع عبئًا على جميع منفذي الكائنات الوظيفية، وقد يؤدي إلى مقارنات غامضة بسبب الاختلافات في الوسائط الملزمة. علاوة على ذلك، فإن غياب عوامل المساواة يسد بشكل فعال الثغرة التي تنشأ من التحويلات الضمنية.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3