كيفية التعامل مع التحذيرات الصادرة عن تحليل التعليمات البرمجية الثابتة clang كأخطاء في Xcode 3؟

StackOverflow https://stackoverflow.com/questions/5033417

سؤال

سؤال

لقد وجد إعداد المشروع 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 في إعدادات البناء لهدفك (أهدافك) المعنية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top