يمكن أن يقال رنة ليس لتحليل بعض الملفات؟
سؤال
وأنا أحاول أن استخدام رنة لمحة مشروع أعمل على. ويشتمل المشروع على مكتبة ثابتة كبيرة بدلا من أن يتم تضمينها في كسكودي ك تبعية.
وأود حقا رنة لعدم تحليل ملفات التبعيات، كما يبدو لجعل رنة تفشل. هل هذا ممكن؟ لقد تم قراءة الوثائق رنة، وأنا لا يمكن العثور عليه.
المحلول 2
وهكذا، وهذا ليس حقا جوابا، لكنه يعمل جيدا بما فيه الكفاية.
ما انتهى بي الأمر القيام تم بناء مكتبة ثابتة في وقت مبكر، ومن ثم بناء المشروع باستخدام المسح والبناء. ولما كان هناك بالفعل بناء ما يصل إلى تاريخ مكتبة ثابتة، لم يكن بناؤه، وبالتالي لم يكن الممسوحة ضوئيا.
وأنا لا زلت أحب أن يكون الجواب الحقيقي لهذا، وإن كان.
نصائح أخرى
وكملاذ أخير، هناك خيار القوة الغاشمة.
وهذا إضافة إلى بداية الملف:
// Omit from static analysis.
#ifndef __clang_analyzer__
وهذا إضافة إلى النهاية:
#endif // not __clang_analyzer__
وورنة سوف --analyze لا ترى محتويات الملف.
وإشارة: السيطرة ثابت محلل تشخيص
وأنا لا أستعمل كسكودي، ولكن باستخدام المسح والبناء في لينكس الأعمال التالية بالنسبة لي. أنا حالتي، وأنا أريد لتشغيل تحليل ثابت على كل طرف الأول، رمز غير الذي تم إنشاؤه. ومع ذلك، أريد أن تجنب تشغيل على THIRD_PARTY رمز والشفرة التي تم إنشاؤها.
في سطر الأوامر، يتم التوصيل رنة محلل في بناء عند المسح والبناء ويحدد المتغيرات CC والبيئة CXX لمجلس التعاون الجمركي محلل وج ++ - أماكن محلل. كتبت اثنين من النصوص بسيطة تسمى ccc-analyzer.py وج ++ - analyzer.py والتوصيل لهم في لترجمة بدلا من الافتراضي. في هذه النصوص المجمع، نظرت ببساطة في مسار الملف يجري تجميع ثم قم بتشغيل إما مترجم الخام مباشرة (إذا كنت ترغب في تجنب تحليل ثابت) أو (ج) * -analyzer (إذا كنت ترغب في تحليل ثابت أن يحدث). بلدي السيناريو هو في بيثون وتعادل لنظام بلدي بنية معينة، ولكن على سبيل المثال يحتاج تعديل:
import subprocess
import sys
def main(argv):
is_third_party_code = False
for i in range(len(argv)):
arg = argv[i]
if arg == '-c':
file_to_compile = argv[i + 1]
if '/third_party/' in file_to_compile or \
file_to_compile.startswith('gen/'):
is_third_party_code = True
break
if is_third_party_code:
argv[0] = '/samegoal/bin/clang++'
else:
argv[0] = '/samegoal/scan-build/c++-analyzer'
return subprocess.call(argv)
if __name__ == '__main__':
sys.exit(main(sys.argv))