كشفت Google في اليوم الآخر عن مصادر محلل ملف robots.txt. لماذا لا تقوم بتشغيل المشروع الذي تم التحقق منه بالفعل على نطاق واسع بالفعل باستخدام PVS-Studio وربما تجد خطأً. هكذا قال ذلك. ولكني أتمنى أن نجد شيئًا ذا معنى. حسنًا ، فليكن مجرد سبب لإعطاء علامات كاملة لمطوري Google.
ملف robots.txt - هو ملف فهرس يحتوي على قواعد لبرامج البحث. وهو يعمل لبروتوكولات https و http و FTP. أتاحت Google المحلل اللغوي لملف robots.txt للجميع. اقرأ المزيد حول هذا الخبر هنا:
تفتح Google الشفرة المصدرية لمحلل robots.txtأعتقد أن معظم قرائنا يعرفون ماذا يفعل PVS-Studio. ولكن إذا كانت هذه هي المرة الأولى على مدونتنا ، فسوف أقدم إشارة مختصرة. PVS-Studio هو محلل ثابت للكود يسمح لك بالعثور على مجموعة متنوعة من الأخطاء ونقاط الضعف والعيوب في المشاريع المكتوبة بلغات C و C ++ و C # و Java. بمعنى آخر ، يعد PVS-Studio حلاً
SAST ويمكنه العمل على أجهزة المستخدمين وإنشاء الخوادم
والسحابة . يحب فريق PVS-Studio أيضًا كتابة
المقالات حول عمليات فحص المشروعات المختلفة. لذلك دعونا نصل إلى النقطة ونحاول العثور على أخطاء في الكود المصدري للمحلل من Google.
لسوء الحظ ، ولكن من دواعي سرور الجميع ، لم يتم العثور على أخطاء. فقط بضع عيوب بسيطة ، والتي سوف أخبر عنها. حسنا ، لا بد لي من كتابة شيء عن المشروع :). يرجع عدم وجود أخطاء إلى قلة المشروع وجودة الكود نفسه. هذا لا يعني عدم وجود أخطاء خفية ، ولكن التحليل الثابت كان عاجزًا في تلك اللحظة.
لذلك حدث أن يكون هذا المقال بروح مقال آخر بعنوان "
أقصر مقال حول التحقق من nginx ".
لقد وجدت قضية مع التحسين ممكن:
V805 انخفاض الأداء. من غير الفعال تحديد سلسلة فارغة باستخدام بناء 'strlen (str)> 0'. الطريقة الأكثر فعالية هي التحقق من: str [0]! = '\ 0'. robots.cc 354
bool RobotsTxtParser::GetKeyAndValueFrom(char **key, ....) { .... *key = line; .... if (strlen(*key) > 0) { .... return true; } return false; }
من غير الفعال استدعاء دالة
strlen لمعرفة ما إذا كانت السلسلة فارغة. يمكن أن يكون هذا الفحص أكثر بساطة:
if (* key [0]! = '\ 0'). بهذه الطريقة لن تضطر إلى اجتياز السلسلة بأكملها ، إذا لم تكن فارغة.
تم إنشاء كائن
V808 'path' من النوع 'basic_string' ولكن لم يتم استخدامه. robots.cc 123
std::string GetPathParamsQuery(....) { std::string path; .... }
يتم الإعلان عن السلسلة ، ولكن لا تستخدم كذلك. في بعض الحالات ، قد تشير المتغيرات غير المستخدمة إلى حدوث خطأ. في هذه الحالة ، يبدو أن هذا المتغير قد استخدم بطريقة أو بأخرى ، ولكن بعد إجراء التغييرات أصبح غير ضروري. وبالتالي ، يساعد المحلل غالبًا في جعل الشفرة أكثر نظافة ويساعد على تجنب الأخطاء بمجرد إزالة المتطلبات المسبقة لمظهرها.
في الحالة التالية ، يوصي المحلل بإضافة
عائد افتراضي بعد تنفيذ
الرئيسي بالكامل. ربما يستحق الأمر إضافة عبارة
إرجاع في النهاية لفهم أن كل شيء قد نجح بالفعل. ومع ذلك ، إذا كان المقصود مثل هذا السلوك ، لا شيء يحتاج إلى تغيير. إذا كنت لا ترغب في رؤية هذا التحذير ، في PVS-Studio ، يمكنك إيقافه وعدم رؤيته مرة أخرى :).
V591 لا تُرجع الدالة "الرئيسية" قيمة ، أي ما يعادل "إرجاع 0". من الممكن أن يكون هذا سلوكًا غير مقصود. ملف robots_main.cc 99
int main(int argc, char** argv) { .... if (filename == "-h" || filename == "-help" || filename == "--help") { ShowHelp(argc, argv); return 0; } if (argc != 4) { .... return 1; } if (....) { .... return 1; } .... if (....) { std::cout << "...." << std::endl; } }
لقد وجدت أيضًا أنه تم تنفيذ وظيفتين أدناه لهما أسماء مختلفة بالطريقة نفسها. ربما هذا هو نتيجة حقيقة أن هذه الوظائف في وقت سابق كان لها منطق مختلف ، ولكن جاء إلى واحد. قد يكون ذلك خطأ مطبعي تسلل في مكان ما ، لذلك يجب التحقق من هذه التحذيرات بعناية.
V524 من الغريب أن يكون نص وظيفة "MatchDisallow" مكافئًا تمامًا لجسم وظيفة "MatchAllow". robots.cc 645
int MatchAllow(absl::string_view path, absl::string_view pattern) { return Matches(path, pattern) ? pattern.length() : -1; } int MatchDisallow(absl::string_view path, absl::string_view pattern) { return Matches(path, pattern) ? pattern.length() : -1; }
إنه المكان الوحيد الذي أشك فيه. يجب التحقق من ذلك من قبل مؤلفي المشروع.
وبالتالي ، أظهر التحقق من محلل robots.txt من Google أن هذا المشروع ، الذي تم فحصه عدة مرات ويستخدم على نطاق واسع ، ذو جودة عالية. حتى أن بعض العيوب التي تم العثور عليها لا يمكن أن تفسد الانطباع بأن برامج الترميز من Google تكتب هذا المشروع :)
نقترح عليك أيضًا
تنزيل وتجربة PVS-Studio في المشروع الذي تهتم به.