هل هناك أي أدوات C ++ تكتشف سوء استخدام static_cast و dynamic_cast و reinterpret_cast؟
-
20-09-2019 - |
سؤال
تصف الإجابات على السؤال التالي الاستخدام الموصى به لـ static_cast
, dynamic_cast
, ، و reinterpret_cast
في C ++:
متى يجب استخدام static_cast و dynamic_cast و const_cast و reinterpret_cast؟
هل تعرف أي أدوات يمكن استخدامها للكشف عن سوء استخدام هذه الأنواع من الممثلين؟ هل سيفعل أداة التحليل الثابت مثل PC-Lint أو تحليل ثابتة التغطية هذا؟
كانت الحالة المعينة التي دفعت هذا السؤال هي الاستخدام غير المناسب لـ static_cast
لتسجيل مؤشر ، والذي لا يحذره المترجم. أرغب في اكتشاف هذه الحالة باستخدام أداة ، ولا أفترض أن المطورين لن يرتكبوا هذا الخطأ أبدًا.
المحلول
بالنظر إلى أنه لا توجد طريقة موثوقة لمعرفة نوع المؤشر الذي يشير إليه المؤشر في وقت الترجمة ، فهذه مشكلة صعبة للغاية في وقت الترجمة.
تتمثل أبسط طريقة في القيام بالمصيد في وقت التشغيل ، باستخدام الماكرو "Safe_cast" الذي يجمع إلى Dynamic_cast مع تأكيد في التصحيح ، و static_cast في الإصدار.
الآن ، أثناء تصحيح الأخطاء ، إذا كان فريق الممثلين غير مناسبون ، فسوف يعود فريق العمل الديناميكي ، ويؤكد. لا يوجد أيضا النفقات العامة أثناء الإصدار.
نصائح أخرى
Visual Studio لديه تحذيرات لبعض هذه. C4946 ، على سبيل المثال. في الغالب يتم إيقافها بشكل افتراضي.
يوفر Boost وظائف polymorphic_pointer_downcast () و polymorphic_downcast () ، والتي تعمل مثل static_cast ولكنها ستؤكد (عادةً في بناء التصحيح) في حالة فشل Dynamic_cast المكافئ.
يرى http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm للتفاصيل.