PVS-اسٽوڊيو جو آزاد جائزو (لينڪس، C++)

مون هڪ اشاعت ڏٺي ته PVS لينڪس جي تحت تجزيو ڪرڻ سکيو هو، ۽ ان کي ڪوشش ڪرڻ جو فيصلو ڪيو منهنجي پنهنجي منصوبن تي. ۽ اھو اھو آھي جيڪو ان مان نڪتو.


Contents

  1. Плюсы
  2. Минусы
  3. نتيجو
  4. پوء

Плюсы

جوابي حمايت

مون هڪ آزمائشي چاٻي جي درخواست ڪئي ۽ انهن مون کي ساڳئي ڏينهن موڪليو.

ڪافي واضح دستاويز

اسان بغير ڪنهن مسئلي جي تجزيي کي لانچ ڪرڻ ۾ ڪامياب ٿي ويا. ڪنسول حڪمن لاءِ مدد پڻ دستياب آهي (جيتوڻيڪ هتي ڪجهه شڪايتون آهن، سيڪشن ڏسو Минусы).

گھڻن موضوعن جي تجزيو جو امڪان

تجزيه ڪندڙ وٽ "معياري" اختيار آهي -j، تجزيو ڪرڻ جي اجازت ڏئي ٿو متوازي طور تي ڪيترن ئي ڪمن ۾. هي گهڻو وقت بچائيندو آهي.

سٺي نموني

ڪيترائي مختلف آئوٽ پٽ فارميٽ، ٽيڪسٽ کان وٺي نن web muzzle تائين. ويب انٽرفيس آسان، جامع آهي، اشارن سان گڏ ڪوڊ ۾ لائينن جي اڳيان ۽ تشخيصي تفصيلن جي لنڪ.

اسيمبلي ۾ آسان انضمام

سڀئي دستاويز انهن جي ويب سائيٽ تي آهن، مان صرف اهو چئي سگهان ٿو ته جيڪڏهن توهان جو منصوبو ٺاهيو ويو آهي CMake استعمال ڪندي، پوء هر شيء بلڪل سادي آهي.

سٺي تشخيصي وضاحت

جيڪڏهن توهان موڊ ۾ پيداوار پيدا ڪريو fullhtml، پوءِ هر پيغام ۾ تشخيصي وضاحت جي لنڪ آهي، وضاحتن، ڪوڊ مثالن ۽ اضافي لنڪن سان.

Минусы

تجزيه نگار طرفان 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-اسٽوڊيو جو آزاد جائزو (لينڪس، C++)

ملٽي ٿريڊنگ ۾ نه ٿو اچي

غير تبديل ٿيندڙ متغيرن يا لاتعداد لوپ بابت ڪيترائي غلط مثبت آھن، جڏھن ته انھن متغيرن سان ڪم مختلف موضوعن مان ٿئي ٿو، ۽ جيڪڏھن ائين نه ھجي، ته پوءِ يونٽ ٽيسٽ ڪم نه ڪندا.

PVS-اسٽوڊيو جو آزاد جائزو (لينڪس، C++)

تنهن هوندي به، هڪ جامد تجزيه نگار به هن حساب ۾ وٺي سگهي ٿو؟ خبر ناهي.

نتيجو

PVS منهنجي اوپن سورس پروجيڪٽ ۾ ڪي به حقيقي بگ نه مليا پٿرن и ويجھو، انهي سان گڏ هڪ ڪم ڪندڙ مسودي ۾، جيڪو، واضح سببن جي ڪري، مان پيش نٿو ڪري سگهان. سچ، اهو ذهن ۾ رکڻ جي قابل آهي ته ڪجهه گهٽتائي اڳ ۾ ئي پڪڙيا ويا آهن ۽ اڳ ۾ استعمال ڪندي درست ڪيو ويو آهي سي پي پي چيڪ и 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 ۽ بوسٽ انٽرفيس تي هڪ نظر وجهڻ لاءِ آزاد ٿيو. نادر استثنا سان، توهان اتي هڪ قابل ڪردار نموني ڏسندا.

اوپن سورس ٽولز مان وڌ کان وڌ استعمال ڪريو

ساڳئي جامد تجزيو لاء، گهٽ ۾ گهٽ ٻه کليل مفت اوزار آهن جيڪي صرف هڪ ڀيرو ڳنڍيل هوندا آهن ڪنهن به منصوبي سان CMake تعمير سسٽم سان.

توھان ھن بابت وڌيڪ پڙھي سگھو ٿا منھنجي تازي اشاعت ۾.

پوء

آخرڪار، مان زور ڀرڻ چاهيان ٿو ته مان PVS يا ڪنهن ٻئي جامد تجزيي کي استعمال نه ڪرڻ جي صلاح نه ڪري رهيو آهيان. پر مان توهان کي حوصلا افزائي ڪريان ٿو انهي بابت سوچڻ لاءِ ته اهو ڪيئن ٿيو ته جامد تجزيي ڪندڙ مسلسل توهان جي ڪوڊ ۾ اهم غلطيون ڳولي ٿو.

اهو صرف هڪ نتيجو آهي. اسان کي ان جو سبب ڳولڻ ۽ ختم ڪرڻ جي ضرورت آهي.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو