SCAN-BUILD(1) General Commands Manual SCAN-BUILD(1)

scan-build — تحلیل‌گر ایستای Clang

scan-build [-ohkvV] [-analyze-headers] [-enable-checker [checker_name]] [-disable-checker [checker_name]] [--help] [--help-checkers] [--html-title [=title]] [--keep-going] [-plist] [-plist-html] [--status-bugs] [--use-c++ [=compiler_path]] [--use-cc [=compiler_path]] [--view] [-constraints [model]] [-maxloop N] [-no-failure-reports] [-stats] [-store [model]] build_command [build_options]

scan-build یک اسکریپت Perl است که تحلیل‌گر ایستای Clang را فراخوانی می‌کند. گزینه‌های مورد استفاده توسط scan-build یا توسط تحلیل‌گر ابتدا می‌آیند، و در ادامه build_command و هر build_options که معمولاً برای ساخت سیستم هدف استفاده می‌شود، قرار می‌گیرند.

تحلیل‌گر ایستا از فهرست بلندی از الگوریتم‌های بررسی استفاده می‌کند؛ به بررسی‌کننده‌ها (CHECKERS) مراجعه کنید. خروجی را می‌توان در قالب استاندارد .plist و/یا HTML نوشت.

گزینه‌های زیر پشتیبانی می‌شوند:

توابع موجود در فایل‌های گنجانده‌شده (#included) را نیز تحلیل می‌کند.
checker_name, -disable-checker checker_name
فعال/غیرفعال کردن checker_name. به بررسی‌کننده‌ها (CHECKERS) مراجعه کنید.
, --help
نمایش این پیام راهنما.
فهرست کردن بررسی‌کننده‌های پیش‌فرض؛ به بررسی‌کننده‌ها (CHECKERS) مراجعه کنید.
[=title]
مشخص کردن عنوان مورد استفاده در صفحات HTML تولیدشده. اگر title مشخص نشود، یک عنوان پیش‌فرض ایجاد می‌شود.
, --keep-going
افزودن گزینهٔ “ادامه دادن (keep on going)” به build_command. در حال حاضر از make و xcodebuild پشتیبانی می‌کند. این یک گزینهٔ تسهیل‌کننده است؛ می‌توان این رفتار را مستقیماً با استفاده از گزینه‌های ساخت نیز مشخص کرد.
دایرکتوری هدف برای فایل‌های گزارش HTML. زیردایرکتوری‌ها بر حسب نیاز برای نمایش فراخوانی‌های جداگانهٔ تحلیل‌گر ایجاد خواهند شد. اگر این گزینه مشخص نشود، دایرکتوری‌ای در /tmp (متغیر TMPDIR در Mac OS X) برای ذخیرهٔ گزارش‌ها ایجاد می‌شود.
خروجی دادن نتایج به صورت مجموعه‌ای از فایل‌های .plist. (به طور پیش‌فرض خروجی scan-build مجموعه‌ای از فایل‌های HTML است.)
خروجی دادن نتایج به صورت مجموعه‌ای از فایل‌های HTML و .plist.
در صورت یافتن باگ‌های احتمالی وضعیت خروج را روی 1 و در غیر این صورت روی 0 تنظیم می‌کند. به طور پیش‌فرض، وضعیت خروج scan-build همان مقدار بازگردانده‌شده توسط build_command است.
[=compiler_path]
حدس زدن کامپایلر پیش‌فرض برای کدهای C++ و Objective-C++. از این گزینه برای تعیین یک کامپایلر جایگزین استفاده کنید.
[=compiler_path]
حدس زدن کامپایلر پیش‌فرض برای کدهای C و Objective-C. از این گزینه برای تعیین یک کامپایلر جایگزین استفاده کنید.
خروجی پرحرّاف (verbose) از scan-build و تحلیل‌گر. آوردن یک v دوم و سوم میزان جزئیات خروجی را افزایش می‌دهد.
, --view
مشاهدهٔ نتایج تحلیل در یک مرورگر وب پس از پایان ساخت.
[model]
تعیین موتور قیود (constraint engine) مورد استفاده توسط تحلیل‌گر. به طور پیش‌فرض مدل ‘range’ استفاده می‌شود. تعیین ‘basic’ از یک مدل قید ساده‌تر و با قدرت کمتر استفاده می‌کند که در checker-0.160 و نگارش‌های پیشین استفاده می‌شد.
N
تعیین تعداد دفعاتی که یک بلوک پیش از صرف‌نظر کردن می‌تواند پیمایش شود. مقدار پیش‌فرض 4 است. برای پوشش جامع‌تر به قیمت کاهش سرعت، این مقدار را افزایش دهید.
از ایجاد یک زیردایرکتوری ‘failures’ که شامل گزارش‌های خرابی (crash) تحلیل‌گر و فایل‌های منبع پیش‌پردازش‌شده است، خودداری می‌کند.
تولید آمار پیمایش برای پروژه‌ای که در حال تحلیل است.
[model]
تعیین مدل ذخیره‌سازی (store model) مورد استفاده توسط تحلیل‌گر. به طور پیش‌فرض، مدل ذخیره‌سازی ‘region’ استفاده می‌شود. ‘region’ یک مدل ذخیره‌سازی حساس به فیلد (field-sensitive) را مشخص می‌کند. کاربران همچنین می‌توانند ‘basic’ را مشخص کنند که دقت بسیار کمتری دارد اما می‌تواند کد را با سرعت بیشتری تحلیل کند. ‘basic’ مدل ذخیره‌سازی پیش‌فرض برای checker-0.221 و پیش از آن بود.

scan-build مقدار بازگردانده‌شده توسط build_command را برمی‌گرداند مگر اینکه --status-bugs یا --keep-going استفاده شده باشد.

بررسی‌کننده‌های فهرست‌شده در زیر را می‌توان با استفاده از گزینه‌های -enable-checker و -disable-checker فعال یا غیرفعال کرد. یک گروه پیش‌فرض از بررسی‌کننده‌ها اجرا می‌شوند مگر اینکه صریحاً غیرفعال شده باشند. اینکه دقیقاً کدام بررسی‌کننده‌ها گروه پیش‌فرض را تشکیل می‌دهند وابسته به سیستم‌عامل مورد استفاده است؛ این موارد با --help-checkers فهرست می‌شوند.

core.AdjustedReturnValue
بررسی می‌کند آیا مقدار بازگشتی یک فراخوانی تابع با آنچه فراخواننده انتظار دارد تفاوت دارد یا خیر (برای نمونه، فراخوانی‌ها از طریق اشاره‌گرهای تابع).
core.AttributeNonNull
بررسی اشاره‌گرهای تهی (null) پاس داده‌شده به عنوان آرگومان به تابعی که آرگومان‌های آن با مشخصهٔ ‘nonnull’ علامت‌گذاری شده‌اند.
core.CallAndMessage
بررسی خطاهای منطقی در فراخوانی‌های تابع و عبارات پیام Objective-C (مانند آرگومان‌های مقداردهی‌نشده، اشاره‌گرهای تابع تهی).
core.DivideZero
بررسی تقسیم بر صفر.
core.NullDereference
بررسی ارجاع‌زدایی از اشاره‌گرهای تهی.
core.StackAddressEscape
بررسی اینکه آدرس‌های حافظهٔ پشته (stack) از تابع خارج نشوند.
core.UndefinedBinaryOperatorResult
بررسی نتایج تعریف‌نشده برای عملگرهای دودویی.
core.VLASize
بررسی اعلان‌های VLA با اندازهٔ صفر یا تعریف‌نشده.
core.builtin.BuiltinFunctions
ارزیابی توابع توکار (builtin) کامپایلر، مانند ().
core.builtin.NoReturnFunctions
ارزیابی توابع ‘panic’ که مشخص است مقداری را به فراخواننده بازنمی‌گردانند.
core.uninitialized.ArraySubscript
بررسی مقادیر مقداردهی‌نشده که به عنوان اندیس آرایه استفاده شده‌اند.
core.uninitialized.Assign
بررسی انتساب مقادیر مقداردهی‌نشده.
core.uninitialized.Branch
بررسی مقادیر مقداردهی‌نشده که به عنوان شرط‌های شاخه‌بندی استفاده شده‌اند.
core.uninitialized.CapturedBlockVariable
بررسی بلوک‌هایی که مقادیر مقداردهی‌نشده را تسخیر (capture) می‌کنند.
core.uninitialized.UndefReturn
بررسی مقادیر مقداردهی‌نشده که به فراخواننده بازگردانده می‌شوند.
deadcode.DeadStores
بررسی مقادیر ذخیره‌شده در متغیرهایی که پس از آن هرگز خوانده نمی‌شوند.
debug.DumpCFG
نمایش گراف‌های جریان کنترل (Control-Flow Graphs).
debug.DumpCallGraph
نمایش گراف فراخوانی (Call Graph).
debug.DumpDominators
چاپ درخت تسلط (dominance tree) برای یک گراف جریان کنترل مشخص.
debug.DumpLiveVars
چاپ نتایج تحلیل متغیرهای زنده (live variable analysis).
debug.Stats
صدور هشدارها به همراه آمار تحلیل‌گر.
debug.TaintTest
علامت‌گذاری نمادهای آلوده (tainted) به عنوان آلوده.
debug.ViewCFG
مشاهدهٔ گراف‌های جریان کنترل با استفاده از GraphViz.
debug.ViewCallGraph
مشاهدهٔ گراف فراخوانی با استفاده از GraphViz.
llvm.Conventions
بررسی کد برای انطباق با قراردادهای پایه‌کد LLVM.
osx.API
بررسی استفادهٔ صحیح از APIهای مختلف Mac OS X.
osx.AtomicCAS
ارزیابی فراخوانی توابع OSAtomic.
osx.SecKeychainAPI
بررسی استفادهٔ صحیح از APIهای Secure Keychain.
osx.cocoa.AtSync
بررسی اشاره‌گرهای تهی مورد استفاده به عنوان موتکس برای @synchronized.
osx.cocoa.ClassRelease
بررسی ارسال مستقیم ‘retain ،’ ‘release’ یا ‘autorelease’ به یک Class.
osx.cocoa.IncompatibleMethodTypes
هشدار دربارهٔ امضای متدهای Objective-C با ناسازگاری‌های نوع داده.
osx.cocoa.NSAutoreleasePool
هشدار در مورد استفاده‌های نامطلوب از NSAutoreleasePool در حالت GC مربوط به Objective-C.
osx.cocoa.NSError
بررسی استفاده از پارامترهای **NSError.
osx.cocoa.NilArg
بررسی آرگومان‌های ممنوع nil در فراخوانی‌های متد Objective-C.
osx.cocoa.RetainCount
بررسی نشت حافظه و مدیریت نادرست شمارش ارجاع.
osx.cocoa.SelfInit
بررسی اینکه ‘self’ درون متد مقداردهی اولیه (initializer) به درستی مقداردهی شده باشد.
osx.cocoa.UnusedIvars
هشدار دربارهٔ متغیرهای نمونهٔ خصوصی (ivars) که هرگز استفاده نمی‌شوند.
osx.cocoa.VariadicMethodTypes
بررسی ارسال انواع غیر Objective-C به متدهای با تعداد آرگومان متغیر (variadic) که تنها انواع Objective-C را انتظار دارند.
osx.coreFoundation.CFError
بررسی استفاده از پارامترهای *CFErrorRef.
osx.coreFoundation.CFNumber
بررسی استفادهٔ صحیح از ().
osx.coreFoundation.CFRetainRelease
بررسی آرگومان‌های تهی به (،) () و ().
osx.coreFoundation.containers.OutOfBounds
بررسی خارج از محدوده بودن اندیس هنگام استفاده از API مربوط به CFArray.
osx.coreFoundation.containers.PointerSizedValues
هشدار در صورتی که CFArray ، CFDictionary یا CFSet با مقادیری با اندازه‌ای غیر از اندازهٔ اشاره‌گر ایجاد شده باشند.
security.FloatLoopCounter
هشدار در صورت استفاده از مقدار ممیز شناور به عنوان شمارندهٔ حلقه (CERT: FLP30-C, FLP30-CPP).
security.insecureAPI.UncheckedReturn
هشدار در مورد استفاده از توابعی که مقادیر بازگشتی آن‌ها همواره باید بررسی شوند.
security.insecureAPI.getpw
هشدار در مورد استفاده از ().
security.insecureAPI.gets
هشدار در مورد استفاده از ().
security.insecureAPI.mkstemp
هشدار زمانی که در رشتهٔ قالب () کمتر از ۶ نویسهٔ X داده شده باشد.
security.insecureAPI.mktemp
هشدار در مورد استفاده از ().
security.insecureAPI.rand
هشدار در مورد استفاده از (،) () و توابع مرتبط.
security.insecureAPI.strcpy
هشدار در مورد استفاده از () و ().
security.insecureAPI.vfork
هشدار در مورد استفاده از ().
unix.API
بررسی فراخوانی‌های توابع مختلف UNIX/Posix.
unix.Malloc
بررسی نشت حافظه، آزادسازی دوباره (double free) و استفاده پس از آزادسازی (use-after-free).
unix.cstring.BadSizeArg
بررسی آرگومان اندازهٔ پاس داده‌شده به توابع رشتهٔ C برای الگوهای خطای متداول.
unix.cstring.NullArg
بررسی ارسال اشاره‌گرهای تهی به عنوان آرگومان به توابع رشتهٔ C.

scan-build -o /tmp/myhtmldir make -j4

مثال بالا باعث می‌شود گزارش‌های تحلیل در یک زیردایرکتوری از /tmp/myhtmldir قرار گیرند و make با گزینهٔ -j4 اجرا شود. هر بار که scan-build پروژه‌ای را تحلیل می‌کند، یک زیردایرکتوری متفاوت ایجاد می‌شود. تحلیل‌گر باید از بیشتر ساخت‌های موازی پشتیبانی کند، اما از ساخت‌های توزیع‌شده پشتیبانی نمی‌کند.

scan-build توسط Ted Kremenek نوشته شده است. مستندات توسط James K. Lowden ⟨jklowden@schemamania.org⟩ مشارکت شده است.

August 18, 2024 clang 20