PVS-Studio کا آزادانہ جائزہ (Linux, C++)

میں نے ایک اشاعت دیکھی جس کا پی وی ایس نے لینکس کے تحت تجزیہ کرنا سیکھا تھا، اور اسے اپنے پروجیکٹس پر آزمانے کا فیصلہ کیا۔ اور اس سے یہی نکلا۔


مواد

  1. پیشہ
  2. Cons
  3. کے نتائج
  4. بعد میں

پیشہ

قبول حمایت

میں نے آزمائشی کلید کی درخواست کی اور انہوں نے اسی دن مجھے بھیج دیا۔

کافی واضح دستاویزات

ہم بغیر کسی پریشانی کے تجزیہ کار لانچ کرنے میں کامیاب ہوگئے۔ کنسول کمانڈز کے لیے مدد بھی دستیاب ہے (اگرچہ یہاں کچھ شکایات ہیں، سیکشن دیکھیں Cons).

ملٹی تھریڈڈ تجزیہ کا امکان

تجزیہ کار کے پاس "معیاری" اختیار ہے۔ -jمتعدد کاموں میں متوازی طور پر تجزیہ کرنے کی اجازت دیتا ہے۔ اس سے وقت کی بہت بچت ہوتی ہے۔

اچھا تصور

متن سے لے کر چھوٹے ویب مزل تک بہت سے مختلف آؤٹ پٹ فارمیٹس۔ ویب انٹرفیس آسان، جامع ہے، کوڈ میں لائنوں کے آگے اشارے اور تشخیصی وضاحتوں کے لنکس کے ساتھ.

اسمبلی میں آسان انضمام

تمام دستاویزات ان کی ویب سائٹ پر موجود ہیں، میں صرف اتنا کہہ سکتا ہوں کہ اگر آپ کا پروجیکٹ CMake کا استعمال کرتے ہوئے بنایا گیا ہے، تو سب کچھ بہت آسان ہے۔

اچھی تشخیصی وضاحتیں۔

اگر آپ موڈ میں آؤٹ پٹ تیار کرتے ہیں۔ fullhtml، پھر ہر پیغام میں تشخیصی وضاحت کا ایک لنک ہوتا ہے، جس میں وضاحتیں، کوڈ کی مثالیں اور اضافی لنک ہوتے ہیں۔

Cons

تجزیہ کار کی طرف سے C++ زبان سے لاعلمی۔

بدقسمتی سے، PVS بعض اوقات نحو کی غلطیاں کرتا ہے اور کوڈ مکمل طور پر درست ہونے پر غلط مثبت پیغامات پیدا کرتا ہے۔

مثال کے طور پر، ایک فنکشن ہے جو واپس آتا ہے۔ void:

template <typename T>
auto copy (const void * source, void * destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible<T>::value
        >
{
    new (destination) T(*static_cast<const T *>(source));
}

ہاں کلیدی لفظ ہے۔ auto مطلب ہو سکتا ہے۔ void، یہی اس کے لیے ہے۔ آٹو. لیکن PVS نے درج ذیل پیغامات تیار کیے:

dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.

بہت سست سائٹ

جی ہاں، ہر پیغام کے آگے ویب انٹرفیس میں مثالوں کے ساتھ متعلقہ تشخیصی تفصیل کا لنک موجود ہے۔ لیکن جب آپ کسی لنک پر کلک کرتے ہیں، تو آپ کو کافی دیر انتظار کرنا پڑتا ہے، اور بعض اوقات ایسا ہوتا ہے۔ 504 گیٹ وے ٹائم آؤٹ.

زبان

تمام وضاحتیں روسی زبان میں ہیں، جو کہ بہت اچھا ہے۔ لیکن رپورٹ کے لنکس ہمیشہ انگریزی ورژن کی طرف لے جاتے ہیں۔ زبان کو تبدیل کرنے کے قابل ہونا اچھا ہوگا تاکہ آپ فوری طور پر روسی زبان میں تشخیص کو دیکھ سکیں۔ مجھے انٹرفیس میں ایسا کوئی آپشن نہیں ملا۔

کنسول کے ذریعے تشخیصی سطحوں کے ساتھ کام کرنا تکلیف دہ ہے۔

آئیے اس حقیقت کے ساتھ شروع کریں کہ دو کمانڈ استعمال کیے گئے ہیں (یہ pvs-studio-analyzer и plog-converter) تشخیص کی وضاحت کے لیے مختلف فارمیٹس۔

کے لیے مدد کریں۔ pvs-studio-analyzer پڑھتا ہے:

-a [MODE], --analysis-mode [MODE]
    MODE defines the type of warnings:
    1 - 64-bit errors;
    2 - reserved;
    4 - General Analysis;
    8 - Micro-optimizations;
    16 - Customers Specific Requests;
    32 - MISRA.
    Modes can be combined by adding the values
    Default: 4

میں نے یہ جاننے کی کوشش میں کافی وقت گزارا کہ کہاں جانا ہے۔ شامل کریں ("اقدار شامل کرنا") کیز۔ میں نے انہیں کوما سے الگ کرکے فہرست بنانے کی کوشش کی:

pvs-studio-analyzer analyze ... -a 1,4,16

میں نے کئی بار کلید کو رجسٹر کرنے کی کوشش کی:

pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16

اور تب ہی مجھے احساس ہوا کہ یہ بٹ ماسک ہیں! اور آپ کی ضرورت ہے۔ خلاصہاور نہیں شامل کریں معنی مثال کے طور پر، عمومی تشخیص، مائیکرو آپٹیمائزیشن اور MISRA کے لیے تشخیص حاصل کرنے کے لیے، آپ کو ان کا خلاصہ کرنا ہوگا (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

یوزر انٹرفیس میں بٹ ماسک کا استعمال عام طور پر خراب شکل ہے۔ یہ سب اندرونی طور پر خلاصہ کیا جا سکتا ہے، اور جھنڈوں کا ایک سیٹ صارف کے لیے سیٹ کیا جا سکتا ہے۔

اس کے علاوہ، ایک افادیت بھی ہے plog-converter، جو انسانی پڑھنے کے قابل جامد تجزیہ کی معلومات تیار کرتا ہے۔ اسے اور بھی مسائل ہیں۔

پروگرام کے لیے مدد کریں۔ plog-converter رپورٹس:

-a, --analyzer            Specifies analyzer(s) and level(s) to be
                          used for filtering, i.e.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

کچھ "سطحیں" یہاں نمودار ہوئیں جو پہلے وہاں نہیں تھیں، اور مجھے دستاویزات میں بھی ان کے بارے میں کچھ نہیں ملا۔

عام طور پر، یہ واضح نہیں ہے. اس لیے میں نے ہر چیز کو زیادہ سے زیادہ سیٹ کیا ہے۔

کیچ پر بیوقوف قسموں کا ایک گروپ

میں نے جن تین منصوبوں کا تجزیہ کیا ان میں سے دو یونٹ ٹیسٹنگ لائبریری کا استعمال کرتے ہیں۔ پکڑو 2. اور پیغامات کا بڑا حصہ (!!! ایک میں 90 میں سے 138 اور دوسرے میں 297 میں سے 344!!!) درج ذیل شکل رکھتے ہیں:

PVS-Studio کا آزادانہ جائزہ (Linux, C++)

ملٹی تھریڈنگ کو مدنظر نہیں رکھتا

قیاس نہ بدلنے والے متغیرات یا لامتناہی لوپ کے بارے میں بہت سے غلط مثبت ہیں، جبکہ ان متغیرات کے ساتھ کام مختلف تھریڈز سے ہوتا ہے، اور اگر ایسا نہ ہوتا، تو یونٹ ٹیسٹ کام نہیں کرتے۔

PVS-Studio کا آزادانہ جائزہ (Linux, C++)

تاہم، کیا ایک جامد تجزیہ کار اس کو بھی مدنظر رکھ سکتا ہے؟ نہیں معلوم۔

کے نتائج

پی وی ایس کو میرے اوپن سورس پروجیکٹس میں کوئی حقیقی کیڑے نہیں ملے فٹ и پراکسیماکے ساتھ ساتھ ایک ورکنگ ڈرافٹ میں، جو کہ واضح وجوہات کی بنا پر میں پیش نہیں کر سکتا۔ سچ ہے، یہ ذہن میں رکھنے کے قابل ہے کہ کچھ کوتاہیاں پہلے ہی پکڑی جا چکی ہیں اور پہلے استعمال کرتے ہوئے درست کر دی گئی ہیں۔ سی پی پی چیک и scan-build.

عام طور پر، ان تمام تجزیہ کاروں کا تاثر تقریباً ایک جیسا ہے: ہاں، وہ کچھ پکڑتے ہیں، بعض اوقات کچھ اہم بھی، لیکن مجموعی طور پر مرتب کافی ہے۔

یہ ممکن ہے (اور میں ذاتی طور پر ایسا سوچنا چاہتا ہوں) کہ ہماری ٹیم سافٹ ویئر ڈویلپمنٹ کے طریقوں کا استعمال کرتی ہے جو ہمیں کم سے کم مقدار میں شٹی کوڈ بنانے کی اجازت دیتی ہے۔ ان پر بہادری سے قابو پانے سے بہتر ہے کہ مسائل پیدا نہ کریں۔

اس لیے، میں کچھ مشورے دینے کی آزادی لیتا ہوں کہ C++ میں اس طرح لکھنا ہے کہ کسی کی ٹانگیں نہ اُکھڑیں اور نہ ہی کسی کی پیشانی پر ریک سے ماریں۔

کمپائلر تشخیص سے زیادہ سے زیادہ فائدہ اٹھائیں۔

ہماری ٹیم درج ذیل تالیف کے اختیارات استعمال کرتی ہے (اور آپ کو مشورہ دیتی ہے)

-Werror

-Wall
-Wextra
-Wpedantic

-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo

انہیں اپنے پروجیکٹ میں فعال کریں اور اپنے کوڈ کے بارے میں بہت کچھ سیکھیں۔

معیار پر قائم رہیں

پلیٹ فارم پر منحصر چیزوں کو استعمال نہ کرنے کی کوشش کریں اگر معیاری اینالاگ ہیں، اور اگر آپ ان کے بغیر بالکل نہیں کر سکتے ہیں، تو انہیں میکروز (یا کچھ اور) کے لیے خصوصی بلاکس میں لپیٹ دیں اور اپنے کوڈ کو غیر تعاون یافتہ حالات میں مرتب ہونے نہ دیں۔

معیاری آپریشن سیمنٹکس پر قائم رہیں

اضافے کا اضافہ ہونا چاہیے، ضرب کو ضرب ہونا چاہیے، فنکشن کال کو فنکشن کال ہونا چاہیے، کاپی کاپی ہونا چاہیے، کیری ہونا چاہیے، کنٹینر کا تکرار ہونا چاہیے، تکرار کرنے والا پروموشن ہونا چاہیے ++ اور حوالہ دینا *. وغیرہ وغیرہ۔

میرے خیال میں خیال واضح ہے۔ وہاں قائم کنونشنز ہیں جو پابند نہیں ہیں، لیکن آپ کے کوڈ کے تمام صارفین اور قارئین دیکھنے کی توقع کرتے ہیں۔ دوسروں کو پیچھے چھوڑنے کی کوشش نہ کریں، ورنہ آپ اپنے آپ کو پیچھے چھوڑ دیں گے۔

ہم آہنگ کوڈ لکھیں۔

سب سے پہلے، میرا مطلب معیاری لائبریری ہے۔ یہ انتہائی مطلوب ہے کہ آپ کی کلاسز اور فنکشنز کے انٹرفیس کو معیاری اور دیگر لائبریریوں کے ساتھ استعمال کیا جا سکتا ہے (مثال کے طور پر، بوسٹ)۔

بلا جھجھک STL اور Boost انٹرفیس پر ایک نظر ڈالیں۔ غیر معمولی استثناء کے ساتھ، آپ کو وہاں ایک قابل رول ماڈل نظر آئے گا۔

اوپن سورس ٹولز سے زیادہ سے زیادہ فائدہ اٹھائیں۔

اسی جامد تجزیہ کے لیے، کم از کم دو کھلے مفت ٹولز ہیں جو CMake بلڈ سسٹم کے ساتھ کسی بھی پروجیکٹ سے صرف ایک بار منسلک ہو سکتے ہیں۔

آپ میری حالیہ اشاعت میں اس کے بارے میں مزید پڑھ سکتے ہیں۔.

بعد میں

آخر میں، میں اس بات پر زور دینا چاہوں گا کہ میں PVS یا کسی دوسرے جامد تجزیہ کار کو استعمال نہ کرنے کی وکالت نہیں کر رہا ہوں۔ لیکن میں آپ کو اس بارے میں سوچنے کی ترغیب دیتا ہوں کہ یہ کیسے ہوا کہ جامد تجزیہ کار آپ کے کوڈ میں مسلسل اہم خامیاں تلاش کرتا ہے۔

یہ صرف ایک نتیجہ ہے۔ ہمیں اس کی وجہ تلاش کرنے اور اسے ختم کرنے کی ضرورت ہے۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں