استخدام PVS-Studio عند التحقق من مشروعات محرك غير واقعي على نظام التشغيل Windows

الصورة 2

تركز هذه المقالة على تفاصيل فحص مشاريع Unreal Engine مع محلل ثابت PVS-Studio على نظام التشغيل Windows: كيفية تثبيت المحلل ، والتحقق من المشروع ، ومكان وكيفية عرض تقرير عن الخطأ.

جزء لا يتجزأ من سلسلة مقالاتنا هي الموضوعات المتعلقة بصناعة الألعاب. تحقق من وجود محرك فعلي مستخدم في ألعاب AAA - مرحبًا بك ، وتوصل إلى أفضل الأخطاء في صناعة الألعاب - تابع ، ابحث عن الأخطاء في أحد أشهر محركات الألعاب Unreal Engine (UE) - وهو أمر سهل بما فيه الكفاية . في تطوير اللعبة ، وكذلك مع أي تطبيق آخر ، فإن جودة الكود مهمة. من الأفضل العثور على الأخطاء في أقرب وقت ممكن ، والخيار الأفضل هو القيام بذلك تلقائيًا - وهذا هو المكان الذي يقدم فيه محللو الكود الثابت مساعدة المبرمجين.

في هذه المقالة ، سأحاول التحدث بإيجاز عن كيفية استخدام محلل ثابت PVS-Studio للتحقق من المشاريع التي تم إنشاؤها في UE. يمكن أن يساعدك برنامج PVS-Studio في تحسين رمز مشروعك من خلال البحث عن الأخطاء فيه ، مما يتيح لك تقليل الوقت الذي تقضيه في مراجعة التعليمات البرمجية.

يرجى ملاحظة أن هذه المقالة هي إضافة إلى الوثائق الموجودة حول تحليل مشاريع UE ولا تخدم الغرض من استبدالها ، إلى حد كبير استعارة محتويات الوثائق.

PVS- استوديو التثبيت


أسهل طريقة لتثبيت محلل PVS-Studio هي تنزيل ملف التثبيت الخاص به. لكي تتمكن من تحليل المشروعات التي تم إنشاؤها في UE ، تحتاج إلى تحديد المكونات التالية عند تثبيت PVS-Studio: "C و C ++ Compiler Monitor" و "Integration with Microsoft Visual Studio (Visual C ++ / C #)." النقطة الأخيرة هي المسؤولة عن دمج المكوّن الإضافي لـ PVS-Studio في IDE Visual Studio ، والذي من خلاله مناسب للعمل مع سجل الأخطاء والإعدادات العامة للمحلل نفسه.

للعمل بشكل كامل مع PVS-Studio ، تحتاج إلى إدخال ترخيص. يمكنك القيام بذلك عن طريق فتح Visual Studio (VS) IDE وإدخال الترخيص في "PVS-Studio | Options ... | Registration". في VS 2019 ، تم نقل قائمة PVS-Studio إلى قائمة "الامتدادات" ، يبدو المسار إلى نافذة إدخال الترخيص كما يلي: "الامتدادات" | "PVS-Studio | الخيارات ... | التسجيل". الترخيص متاح على موقعنا.

لإنشاء مشاريع UE ، يتم استخدام برنامج UnrealBuildTool (UBT) مخصص من Epic Games ، وليس نظام بناء قياسي ، يُستخدم في VS (MSBuild). في هذا الصدد ، لا يتمكن المكون الإضافي لـ PVS-Studio من تنفيذ سيناريو معتاد للتحقق من مشاريع C ++ / C # ، التي تم إنشاؤها في VS: "PVS-Studio -> Check -> المشروع الحالي". هناك العديد من الحلول لتجنب هذا القيد.

إجراء التحليل باستخدام نظام مراقبة التجميع


تتمثل الطريقة الأولى والأسهل للتحقق من مشروع UE في استخدام البرنامج C و C ++ Compiler Monitoring (المسمى Standalone.exe) ، الموجود في دليل تثبيت PVS-Studio. مبدأ عملها هو أنها تراقب عمليات برنامج التحويل البرمجي التي تتوافق مع برنامج التحويل البرمجي الهدف (في هذه الحالة ، cl.exe) وتقوم بتجميع كافة المعلومات اللازمة للمعالجة المسبقة والتحليل الإضافي للملفات المصدر. بعد أن قمت بفتح مراقبة برنامج التحويل البرمجي C و C ++ ، استخدم القائمة "أدوات" واختر الخيار "تحليل ملفاتك (C و C ++) ...". اضغط على "بدء المراقبة" وسترى النافذة الموجودة في الركن السفلي الأيسر تخبرك بأن مراقبة مكالمات المترجم قيد التنفيذ:

الصورة 1

بعد ذلك ، قم ببناء مشروع UE الخاص بك واضغط على "Stop Monitoring".

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

يمكن إجراء مكالمات برنامج التحويل البرمجي المماثلة والتحليل اللاحق للملفات المكتشفة باستخدام برنامج وحدة التحكم CLMonitor.exe ، الموجود في نفس المجلد ، حيث تم تثبيت PVS-Studio. يشتمل CLMonitor.exe على وضعي تشغيل: وضع خادم عند إطلاق عمليات التشغيل (المقابلة للمترجم المستهدف) ويتم مراقبة وضع العميل (عندما يتم تحليل ملفات المصدر ، المكتشفة في مرحلة المراقبة ، يتبعها تقرير بنتائج التحليل) . لتشغيل CLMonitor.exe في وضع الخادم ، قم بتنفيذ الأمر التالي:

CLMonitor.exe monitor 

بعد ذلك ، قم ببناء مشروع UE الخاص بك وتنفيذ الأمر أدناه:

 CLMonitor.exe analyze -l "c:\ptest.plog" 

يعمل الأمر "تحليل" على تشغيل CLMonitor.exe في وضع العميل وإغلاق مثيل تشغيل هذا البرنامج ، ويعمل في وضع الخادم. بعد تنفيذ هذا الأمر ، سيبدأ CLMonitor.exe في تنفيذ تحليل الملفات. المعلمة الخاصة بخيار "- l" هي مسار إلى الملف ، حيث سيتم كتابة نتائج المحلل.

إجراء التحليل باستخدام Key -StaticAnalyzer = PVSStudio


نهج مختلف وأكثر ملاءمة لتحليل مشاريع UE هو التكامل المباشر مع نظام UBT المدمج. للقيام بذلك ، افتح نافذة خاصية مشروع UE الخاص بك في VS واختر "NMake" في قائمة "خصائص التكوين". أضف -StaticAnalyzer = PVSStudio في حقل النص للخاصية "Build Command Line". كمثال ، قد تبدو قيمة الحقل "Build Command Line" كما يلي:

 C:\Program Files\Epic Games\UE_4.22\Engine\Build\BatchFiles\Build.bat" MyProject Win64 DebugGame -Project="$(SolutionDir)$(ProjectName).uproject" -WaitMutex -FromMsBuild -StaticAnalyzer=PVSStudio 

يجب أن يؤخذ في الاعتبار أنه عند إجراء إنشاء مشروع ، سيتم تحليله فقط وليس بناءه. سيتم وصف السيناريو الذي تم فيه بناء المشروع وتحليله على حد سواء. تجدر الإشارة أيضًا إلى أنه سيتم فقط تحليل ملفات المصدر التي تم تغييرها منذ إنشاء المشروع الأخير. لا يعد تغيير أي ملف .h مضمن سببًا لإجراء التحليل أثناء الإنشاء التالي. من أجل إجراء تحليل كامل ، تحتاج إلى إضافة العلامة نفسها في حقل نص الخاصية "Rebuild All Command Line". الآن عند إعادة بناء المشروع ، ستحصل على نتيجة تحليل المشروع بأكمله.

إجراء التحليل عبر تعديل ملفات الحزمة


الآن لننظر في سيناريو آخر لمحلل PVS-Studio يدمج في نظام بناء UBT. أثناء القيام بذلك ، يبدأ التحليل مباشرة بعد تنفيذ بناء / إعادة بناء المشروع. بمعنى آخر ، يمكنك الحصول على مشروع مدمج وملف به نتائج التحليل. ربما لاحظت أن الحقل Build Command Line يحتوي على المسار إلى الملف الدفعي Build.bat ، والذي يحتوي بدوره على إرشادات لتشغيل UBT باستخدام الوسائط المطلوبة. يعمل Build.bat في بداية الإنشاء.

النقطة المهمة هي تغيير ملف الدُفعات بحيث يمكنه أولاً تشغيل UBT باستخدام وسيطات الإنشاء القياسية ، ثم إذا تم إكمال البناء بنجاح ، قم بتشغيل نفس UBT ، ولكن بالفعل مع إشارة إضافية -StaticAnalyzer = PVSStudio. لتطبيق السيناريو أعلاه ، يمكنك تغيير ملف الدُفعات Build.bat. من الأفضل إنشاء نسخته المسماة ، على سبيل المثال ، BuildAndAnalyze.bat. إليك ما عليك القيام به لتنفيذ السيناريو الموضح. مباشرة بعد الأمر popd ، أدخل الإرشادات التالية:

 SET "UBT_ERR_LEVEL=!ERRORLEVEL!" SET "NEED_TO_PERFORM_ANALYSIS" IF "!UBT_ERR_LEVEL!"=="0" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF "!UBT_ERR_LEVEL!"=="2" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF DEFINED NEED_TO_PERFORM_ANALYSIS ( pushd "%~dp0\..\..\Source" ECHO Running static analysis ..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -StaticAnalyzer=PVSStudio -DEPLOY popd SET "UBT_ERR_LEVEL=!ERRORLEVEL!" ) 

إذا كانت العلامة -StaticAnalyzer = PVSStudio مثبتة مسبقًا في حقل Build Command Line في إعدادات المشروع "خصائص | خصائص التكوين | NMake" ، فيجب إزالتها.

المشكلة في هذا الأسلوب هي أنه سيتم تحليل الملفات التي تم تجميعها فقط أثناء الإنشاء. أي أنك لن تتلقى ملف تقرير مع فحص كامل لمشروعك. بالإضافة إلى ذلك ، لن يتم أيضًا مراعاة أي تغييرات تم إجراؤها على ملفات .h المضمنة. لذلك ، لا يمكننا استدعاء هذا التحليل بشكل تزايدي ، حيث أن التغييرات في ملفات الرأس لن تؤدي إلى التحليل أثناء الإنشاء التالي. في هذه الحالة ، يمكنك إعادة إنشاء المشروع ، والحصول على نتيجة التحليل للمشروع بأكمله. ومع ذلك ، قد يستغرق البناء الكامل وقتًا طويلاً ، لذا يمكنك اتباع هذا السيناريو: إنشاء بنية ، وحذف ملف التخزين المؤقت ActionHistory.bin ، وتشغيل الإنشاء باستخدام العلامة -StaticAnalyzer = PVSStudio ، واستعادة ملف ذاكرة التخزين المؤقت. يحتوي ملف ActionHistory.bin على المعلومات اللازمة لتنفيذ إنشاء تزايدي وكذلك محفوظات تشغيل محلل للملفات المحددة.

للوهلة الأولى ، قد لا يبدو هذا السيناريو هو الأسهل ، لذلك سنقدم مجموعة كاملة من الإرشادات حول كيفية تغيير ملف Build.bat الأصلي. تجدر الإشارة إلى أن هذه التغييرات ذات صلة فقط بـ Unreal Engine الإصدار 4.21 والإصدارات الأحدث. بعد الأمر setlocal enableelayedexpansion ، قم بتعريف المتغيرات التالية:

 SET PROJECT_NAME=%1% SET PLATFORM=%2% SET UPROJECT_FILE=%~5 SET ACTIONHISTORY_FOLDER= %UPROJECT_FILE%\..\Intermediate\Build\%PLATFORM%\%PROJECT_NAME% SET ACTION_HISTORY=ActionHistory.bin SET ACTION_HISTORY_BAC=%ACTION_HISTORY%.bac SET ACTIONHISTORY_PATH="%ACTIONHISTORY_FOLDER%\%ACTION_HISTORY%" SET ACTIONHISTORY_BAC_PATH= "%ACTIONHISTORY_FOLDER%\%ACTION_HISTORY_BAC%" 

مباشرة بعد تعليمات popd ، أدخل هذه الأوامر:
 SET "UBT_ERR_LEVEL=!ERRORLEVEL!" SET "NEED_TO_PERFORM_ANALYSIS=" IF "!UBT_ERR_LEVEL!"=="0" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF "!UBT_ERR_LEVEL!"=="2" ( SET "NEED_TO_PERFORM_ANALYSIS=TRUE" ) IF DEFINED NEED_TO_PERFORM_ANALYSIS ( pushd "%~dp0\..\..\Source" ECHO Running static analysis IF EXIST %ACTIONHISTORY_PATH% ( ECHO Copying %ACTION_HISTORY% to %ACTION_HISTORY_BAC% COPY %ACTIONHISTORY_PATH% %ACTIONHISTORY_BAC_PATH% ECHO Removing %ACTION_HISTORY%: %ACTIONHISTORY_PATH% DEL %ACTIONHISTORY_PATH% ) ..\..\Engine\Binaries\DotNET\UnrealBuildTool.exe %* -StaticAnalyzer=PVSStudio -DEPLOY popd SET "UBT_ERR_LEVEL=!ERRORLEVEL!" IF EXIST %ACTIONHISTORY_BAC_PATH% ( ECHO Recovering %ACTION_HISTORY% COPY %ACTIONHISTORY_BAC_PATH% %ACTIONHISTORY_PATH% ECHO Removing %ACTION_HISTORY_BAC%: %ACTIONHISTORY_BAC_PATH% DEL %ACTIONHISTORY_BAC_PATH% ) ) 

لاحظ أن المتغيرات PROJECT_NAME و PLATFORM و UPROJECT_FILE ، اللازمة لتحديد المسار الصحيح إلى ملف ذاكرة التخزين المؤقت ، ستحصل على قيمها من وسيطات سطر الأوامر Build.bat. إذا كان لديك ترتيب مختلف لهذه الوسائط ، فيجب عليك تغيير تهيئة المتغيرات الثلاثة الموضحة أعلاه بشكل مناسب.

تحليل تدريجي للمشروع عبر تعديل UBT


PVS-Studio قادر على العمل في وضع التحليل التزايدي. المقصود التحليل التزايدي للتحقق فقط من تلك الملفات التي تم تغييرها منذ الإنشاء الأخير. في وضع التحليل التزايدي ، يتم تشغيل PVS-Studio تلقائيًا على كمبيوتر مطور في وضع الخلفية مباشرة بعد تجميع التعليمات البرمجية وتحليل جميع الملفات المعدلة. يمكنك العثور على دليل أكثر تفصيلاً حول استخدام PVS-Studio في وضع التحليل التزايدي في وثائقنا.

مع تنفيذ وضع التحليل التزايدي لمشاريع UE ، يصبح كل شيء مرة أخرى أكثر تعقيدًا قليلاً من السيناريو القياسي. في هذه الحالة ، لتتمكن من إجراء التحليل التزايدي (مع مراعاة التغييرات في ملفات h. المضمنة) ، سيكون عليك تقديم تعديلات في نظام UBT للبناء بنفسك. للقيام بذلك ، يمكنك الوصول إلى مستودع UE على github.com واستنساخه إلى جهازك. لتخصيص مستودع المستنسخة بشكل أكبر ، ستحتاج إلى إكمال الخطوات ، المدرجة في قسم "بدء التشغيل" ، القسم الفرعي "Windows". يمكنك العثور على هذا القسم على الصفحة الأولى لمستودع UE الرسمي. بمجرد إعداد مستودعك ، يمكنك البدء في إجراء تغييرات في UBT. للقيام بذلك ، اتبع هذا المسار إلى مستودع cloned: \ UnrealEngine \ Engine \ Source \ Programs \ UnrealBuildTool. افتح الحل UnrealBuildTool.sln وابحث عن ملف PVSToolChain.cs في Solution Explorer. في هذا الملف ، أضف سطور التعليمات البرمجية التالية في فئة PVSApplicationSettings:

 /// <summary> /// Whether need incremental analysis or not /// </summary> public bool IncrementalAnalysis; 

يمكّن هذا السطر من التعليمات البرمجية من إلغاء تحديد خيار IncrementalAnalysis من ملفات إعدادات PVS-Studio. لا تنسَ تمكين وضع التحليل التدريجي لـ PVS-Studio نفسه. للقيام بذلك ، في VS ، افتح "Extensions" في القائمة الرئيسية ، القائمة الفرعية "PVS-Studio" ، "التحليل بعد الإنشاء (الملفات المعدلة فقط)" ، "ممكّن". الآن قم بإضافة سطور التعليمات البرمجية التالية مباشرة بعد إعلان المتغير BaseFileName:

 // Get pvslog file FileReference OutputFileLocation = FileReference. Combine(OutputDir, BaseFileName + ".pvslog"); FileItem OutputFileItem = FileItem.GetItemByFileReference(OutputFileLocation); if (ApplicationSettings.IncrementalAnalysis && OutputFileItem.Exists) { // Get object file FileReference ObjectFileLocation = FileReference. Combine(OutputDir, BaseFileName + ".obj"); FileItem ObjectFileItem = FileItem.GetItemByFileReference(ObjectFileLocation); if (ObjectFileItem.Exists && (ObjectFileItem.LastWriteTimeUtc < OutputFileItem.LastWriteTimeUtc)) { continue; } } 

ثم قم بإزالة التعريفات السابقة للمتغيرات OutputFileLocation و OutputFileItem أدناه.

أثناء إنشاء مشروع UE ، يتم إنشاء ملف .obj للكائن لكل ملف .cpp مصدر. هذا التحليل التزايدي يدور حول التحقق من ملفات .cpp المصدر فقط التي يكون تاريخ إنشاء / تعديل ملف الكائن الخاص بها بعد تاريخ ملف تقرير .pvslog. يتم إنشاء ملف .pvslog منفصل لكل ملف مصدر ، في المستقبل سيتم دمج جميع ملفات .pvslog في ملف .pvslog نهائي واحد). بمجرد إجراء التغييرات المذكورة أعلاه ، قم بإنشاء UBT وانسخ الملف الثنائي المدمج حديثًا إلى موقع UBT الأصلي.

الآن أصبح جاهزًا ، ستتلقى سجل تقارير عند إجراء إنشاء مشروع UE الخاص بك ، والذي يحتوي على نتائج محلل للملفات المصدر المترجمة فقط. ضع في اعتبارك أن مثل هذا التعديل لـ UBT يكون منطقيًا فقط إذا قمت بتعديل ملف Build.bat بطريقة أدت إلى إزالة ملف ذاكرة التخزين المؤقت ActionHistory.bin (تم تقديم وصف تفصيلي لهذا السيناريو أعلاه). لتعطيل وضع التحليل التزايدي ، ما عليك سوى تثبيت الخيار "التحليل بعد الإنشاء (الملفات المعدلة فقط)" الموضح أعلاه في الوضع "معطل".

اسمحوا لي أن أذكرك مرة أخرى: إذا قمت بتثبيت العلم -StaticAnalyzer = PVSStudio في الحقل Build Command Line في إعدادات المشروع "خصائص | خصائص التكوين | NMake" ، فيجب إزالته في هذا السيناريو.

فتح ملف تقرير محلل والتحميل التلقائي في Visual Studio


بشكل افتراضي عند إجراء تحليل مشروع UE ، لن يتم عرض ملف تقرير في نافذة PVS-Studio في VS. يتم تخزينه فقط نسبياً إلى مجلد المشروع عن طريق المسار التالي: \ YouProject \ Saved \ PVS-Studio \. لفتح هذا الملف في VS ، تحتاج إلى استخدام الأمر التالي: "PVS-Studio | فتح / حفظ | فتح تقرير التحليل" وحدد نوع ملف "الإخراج غير المحول". يمكنك أيضًا فتح تقرير الملف في برنامج C و C ++ Compiler Monitoring ، باستخدام الأمر التالي: "ملف | فتح سجل PVS-Studio" وأيضًا اختيار نوع الملف "إخراج غير محلول".

هناك خيار آخر أكثر ملاءمة لفتح سجل تقرير التحليل ، وهو التحميل التلقائي في VS. لكي يتم تحميله تلقائيًا في نافذة PVS-Studio في VS بعد اكتمال التحليل ، تحتاج إلى تمكين الخيار المناسب: "PVS-Studio | خيارات | إعدادات محلل محددة | حفظ / تحميل (تقرير محلل) | AutoloadUnrealEngineLog" .

قم بتنزيل وتجربة PVS-Studio


بصفتي مؤلف هذا المقال ، وكذلك أحد الأشخاص الذين يعملون بشكل مباشر على تنفيذ ودعم وظائف PVS-Studio المتعلقة بتحليل المشاريع ، التي بنيت على أساس محرك UE ، أنا مستعد لمساعدة القراء . إذا كنت تواجه مشكلة في استخدام PVS-Studio مع مشروع UE لديك أو لديك أي أسئلة بعد قراءة هذه المقالة ، سأكون سعيدًا بالدردشة معك. اكتب إلى دعمنا ، سأتلقى رسائل عن UE والقضايا ذات الصلة. شكرا لاهتمامكم

روابط إضافية


  1. أندريه كاربوف. فحص طال انتظاره من محرك غير واقعي 4 . (14 أبريل 2014)
  2. بول إريمييف ، سفياتوسلاف رازميسلوف. كيف قام فريق PVS-Studio بتحسين كود محرك غير واقعي . (20 يونيو 2015)
  3. أندريه كاربوف. تحليل ثابت كجزء من عملية التطوير في Unreal Engine . (27 يونيو 2017)

Source: https://habr.com/ru/post/ar466477/


All Articles