كيفية التعامل مع التحذيرات الصادرة عن تحليل التعليمات البرمجية الثابتة clang كأخطاء في Xcode 3؟
-
14-11-2019 - |
سؤال
سؤال
لقد وجد إعداد المشروع RUN_CLANG_STATIC_ANALYZER ("تشغيل المحلل الثابت") مشكلات مهمة في مشروعنا.لقد تناولناها ونريد منع تسلل المشكلات المستقبلية.
نحن نحاول الحصول على تحذيرات تحليل Clang ليتم التعامل معها كأخطاء كسر بنيتنا.لم ينجح حتى الآن على الرغم من تمكين -Werror ("معاملة التحذيرات كأخطاء").
مثال للمشكلة
تم إنشاء استدعاء التحليل التالي داخل Xcode:
/Developer/usr/bin/clang -x object-c [...] --analyze [...]/TroubledCode.m -o [...]/TroubledTarget.build/StaticAnalyzer/normal/i386/TroubledCode. plist
ينتج تحذيرًا لتحليل التعليمات البرمجية الثابتة:
[...]/TroubledCode.m:38:34: warning: Potential leak of an object allocated on line 38 and stored into 'leakingManager'
Manager *leakingManager = [[Manager alloc] init];
^
1 warning generated.
لكن تقارير Xcode تفيد بأن "الإنشاء ناجح...1 نتيجة محلل".الحل الذي نبحث عنه سيجعل المثال أعلاه يولد "فشل البناء".
حل
أخذت بنصيحة جيم وأنشأت نصًا للبناء.
ولتجنب الإنذارات الكاذبة، واجهت مشكلة التأكد من أنها تتجاهل بقايا التحليل الدخيلة.يجب أن يعمل هذا الحل عند البناء من Xcode IDE وعند إنشاء مشروعك باستخدام xcodebuild
.
لتحويل تحذيرات تحليل Xcode 3 إلى أخطاء بناء:
- انقر نقرًا مزدوجًا فوق المشروع أو الهدف المعني.
- ضمن علامة التبويب "إنشاء"، حدد المربع الموجود ضمن الإعدادات > الارتباط > كتابة ملف خريطة الارتباط
يُعرف هذا الإعداد أيضًا باسم LD_GENERATE_MAP_FILE
.
- ضمن "المجموعات والملفات" > "الأهداف"، انقر فوق مثلث الكشف الخاص بالهدف الذي ترغب في إضافة هذه الميزة إليه.
- انقر بزر الماوس الأيمن على مرحلة "ربط الملف الثنائي بالمكتبات".
- حدد إضافة > مرحلة بناء جديدة > مرحلة بناء البرنامج النصي الجديد
- خياري:أعد تسمية مرحلة "تشغيل البرنامج النصي" التي أضفتها للتو إلى "معاملة تحذيرات Clang كأخطاء".
- انقر نقرًا مزدوجًا فوق مرحلة البرنامج النصي الجديد إذا لم تكن مفتوحة بالفعل.
انسخ المحتوى أدناه والصقه في قسم "البرنامج النصي".
error_count=0
##
function verify_clang_analysis_at_path()
{
local analysis_path=$1
local plist_tool=/usr/libexec/PlistBuddy
local diagnostics=$($plist_tool -c "print diagnostics" $analysis_path)
if [[ $diagnostics != $'Array {\n}' ]]
then
((error_count++))
fi
}
function verify_clang_analysis_for_object_file()
{
local object_file=$1
local analysis_directory=$TARGET_TEMP_DIR/StaticAnalyzer/$CURRENT_VARIANT/$CURRENT_ARCH
local analysis_path=$analysis_directory/${object_file%.*}.plist
# if this object file corresponds to a source file that clang analyzed...
if [ -e $analysis_path ]
then
verify_clang_analysis_at_path $analysis_path
fi
}
##
object_directory=$OBJECT_FILE_DIR-$CURRENT_VARIANT/$CURRENT_ARCH
object_path_pattern=${object_directory}'/\(.\)\+\.o$'
index_pattern='\[[[:space:]0-9]*\][[:space:]]'
object_paths=$(
grep $object_path_pattern $LD_MAP_FILE_PATH | sed s/$index_pattern//
)
##
for object_path in $object_paths
do
object_file=${object_path##*/}
verify_clang_analysis_for_object_file $object_file
done
if [ $error_count -gt 0 ]
then
echo "Clang static code analysis failed for" $error_count "source file(s)."
fi
exit $error_count
تحديث
مايك فوسلر لديه نسخة مطورة من هذا البرنامج النصي لـ Xcode 5.
المحلول
لقد كنا نخطط لاتخاذ خطوة بناء منفصلة لتشغيل المحلل والتحقق من النتائج.سنفشل في البناء على خادم البناء بهذه الطريقة.لكن هذا لن يساعدك محليًا.
نصائح أخرى
يحتوي Xcode على مربع اختيار "معاملة التحذيرات كأخطاء".إذا لم تتمكن من العثور عليه، وهو ما قيل بالنسبة لبعض مشاريع iPhone، فما عليك سوى إضافة "-Werror" إلى WARNING_CFLAGS في إعدادات البناء لهدفك (أهدافك) المعنية.