
बहुत पहले नहीं, कर्मचारियों में से एक ने हमारी टीम को छोड़ दिया और एम्बेडेड सिस्टम से संबंधित सॉफ्टवेयर के विकास में लगी कंपनी में शामिल हो गया। इसके बारे में कुछ खास नहीं है, हमेशा और हर जगह, कोई छोड़ देता है, और कोई आता है। यह सब बन्स की संख्या, सुविधा और वरीयताओं पर निर्भर करता है। एक और बात दिलचस्प है। एक आदमी ईमानदारी से काम की एक नई जगह पर कोड की स्थिति के बारे में चिंता करता है, जिसके परिणामस्वरूप, इस संयुक्त लेख में परिणाम हुआ। जब आप जानते हैं कि स्टैटिक कोड विश्लेषण क्या है, तो "बस प्रोग्राम" करना कठिन है।
प्रकृति का भंडार
यह मुझे लगता है कि दुनिया में एक दिलचस्प स्थिति विकसित हुई है। यदि प्रोग्रामिंग विभाग सिर्फ एक छोटा सहायक तत्व है, जिसका संगठन के गतिविधि के मुख्य क्षेत्र से सीधा संबंध नहीं है, तो क्या होगा? एक रिजर्व है। संगठन का दायरा मनमाने ढंग से महत्वपूर्ण और जिम्मेदार (चिकित्सा, सैन्य उपकरण) हो सकता है। वैसे भी, एक दलदल रूपों, जहां नए विचारों को स्थापित किया जाता है और 10 साल पहले की तकनीकों का उपयोग किया जाता है।
मैं आपको परमाणु ऊर्जा संयंत्रों में प्रोग्रामिंग विभाग में काम करने वाले एक व्यक्ति से पत्राचार के बारे में बताता हूं:
और वह मुझे जवाब देता है: हमें गिट की आवश्यकता क्यों है? देखो, मेरी नोटबुक में सब कुछ नीचे लिखा है।...क्या आपके पास किसी प्रकार का संस्करण नियंत्रण है?2 लोग git का उपयोग करते हैं। कार्यालय के बाकी हिस्से सबसे अच्छे नंबर पर हैं। हालांकि ज़िप के बारे में, मैं केवल 1 व्यक्ति के बारे में सुनिश्चित हूं।कृपया डरें नहीं। एनपीपी में विकसित सॉफ्टवेयर अलग है, साथ ही किसी ने हार्डवेयर सुरक्षा को रद्द नहीं किया है। यह विभाग सांख्यिकीय आंकड़ों के संग्रह और प्रसंस्करण में लगा हुआ है। लेकिन फिर भी, जलभराव की प्रवृत्ति स्पष्ट रूप से दिखाई देती है। मुझे नहीं पता कि ऐसा क्यों होता है, लेकिन यह है। इसके अलावा, कंपनी जितनी बड़ी होगी, यह प्रभाव उतना ही मजबूत होगा।
मैं इस बात पर जोर देना चाहता हूं कि बड़े संगठनों में ठहराव एक अंतरराष्ट्रीय घटना है। विदेशियों के लिए, चीजें बिल्कुल समान हैं। मैंने लंबे समय तक खोज की, लेकिन एक बहुत उपयुक्त लेख नहीं मिला। मुझे नाम याद नहीं है। अगर कोई मुझे बताता है, तो मैं एक लिंक जोड़ूंगा। इसमें, प्रोग्रामर कहानी बताता है कि उसने एक सैन्य विभाग में कैसे काम किया। विभाग स्वाभाविक रूप से बहुत गुप्त और बहुत नौकरशाही था। इतना गुप्त और नौकरशाही कि कई महीनों तक वे इस बात पर सहमत नहीं हो सके कि उसे कंप्यूटर के साथ काम करने के लिए क्या अधिकार दिए जाएं। परिणामस्वरूप, उन्होंने नोटपैड (बिना संकलन के) में एक कार्यक्रम लिखा। और फिर उसे अक्षमता के लिए निकाल दिया गया था।
वन
हमारे पूर्व कर्मचारी को वापस। एक नई नौकरी में पहुंचकर, उन्होंने एक छोटे सांस्कृतिक झटके का अनुभव किया। स्थैतिक विश्लेषण उपकरणों के साथ उपद्रव के बाद, यह देखना मुश्किल है कि कंपाइलर चेतावनियों को भी कैसे नजरअंदाज किया जाता है। सामान्य तौर पर, यह एक अलग दुनिया की तरह है, जहां वे अपने स्वयं के कैनन के अनुसार कार्यक्रम करते हैं और अक्सर अपनी शर्तों का उपयोग करते हैं। उनकी कहानियों में से अधिकांश मुझे वाक्यांश "जमीनी स्तर" पसंद आया। हार्डवेयर से निकटता का पता लगाया।
हमें गर्व है कि हम अपनी टीम में एक योग्य विशेषज्ञ के रूप में विकसित हुए हैं जो कोड की गुणवत्ता और विश्वसनीयता की परवाह करता है। उन्होंने वर्तमान स्थिति को चुपचाप स्वीकार नहीं किया, लेकिन इसे ठीक करने की कोशिश कर रहे हैं।
शुरू करने के लिए, उन्होंने निम्न कार्य किया। उन्होंने कंपाइलर चेतावनियाँ पढ़ीं। फिर उन्होंने
Cppcheck का उपयोग करके परियोजना का परीक्षण किया। सुधार करने के अलावा, उन्होंने ठेठ त्रुटियों को रोकने के बारे में सोचा।
पहले चरणों में से एक उत्पन्न कोड की गुणवत्ता में सुधार के उद्देश्य से एक दस्तावेज तैयार करना था। एक और कदम विकास प्रक्रिया में एक स्थिर कोड विश्लेषक की शुरूआत हो सकती है। पीवीएस-स्टूडियो अब तक के सवाल से बाहर है। पहला है लिनक्स। दूसरे, ऐसे संगठनों को सॉफ्टवेयर बेचना आसान नहीं है। अब तक, Cppcheck पर पसंद गिर गई है। स्थैतिक विश्लेषण की कार्यप्रणाली वाले लोगों के पहले परिचित के लिए यह एक बहुत अच्छा उपकरण है।
मैं उसके द्वारा तैयार किए गए "कार्यक्रम कैसे नहीं लिखूं" दस्तावेज से परिचित होने का प्रस्ताव करता हूं। कई बिंदुओं को कप्तान की साक्ष्य शैली में लिखा जा सकता है।
हालांकि, ये वास्तविक समस्याएं हैं जिन्हें वह रोकने की कोशिश कर रहा है।प्रोग्राम कैसे न लिखें
मद N १
संकलक चेतावनी की अनदेखी। उनकी बड़ी सूची के साथ, आप वास्तविक सॉफ़्टवेयर त्रुटियों को आसानी से याद कर सकते हैं जो नए लिखित कोड में दिखाई दिए। इसलिए, सभी चेतावनियों को हटा दिया जाना चाहिए।
मद N2
'यदि' ऑपरेटर की स्थिति में, यह मान की जाँच नहीं करता है, लेकिन इसे असाइन करता है:
if (numb_numbc[i] = -1) { }
,
. :
if (numb_numbc[i] == -1) { }
N3
«using namespace std;» , , . , .
N4
:
unsigned int BufPos;
std::vector<int> ba;
....
if (BufPos * 2 < ba.size() - 1) { }
, :
- ;
- ;
- INT_MAX ( );
- int //… unsigned , unsigned ( );
, 'ba' . «ba.size() — 1» size_t. , 0xFFFFFFFFu.
N5
. :
void foo(std::string &str)
{
if (str = "1234")
{
}
}
'=' '=='. 'str' , .
N6
, :
har TypeValue [4];
...
if (TypeValue == "S") {}
TypeValue «S» 'false'. 'strcmp' 'strncmp'.
N7
:
memset(prot.ID, 0, sizeof(prot.ID) + 1);
, 'prot.ID' .
sizeof() strlen(). sizeof() . strlen() ( ).
N8
:
struct myStruct
{
float x, y, h;
};
myStruct *ptr;
....
memset(ptr, 0, sizeof(ptr));
'*ptr', N (N — ). :
myStruct *ptr;
....
memset(ptr, 0, sizeof(*ptr));
N9
:
if (0 < L < 2 * M_PI) { }
, , 'true' 'false' .
. :
if (0 < L && L < 2 * M_PI) { }
N10
unsigned int K;
....
if (K < 0) { }
...
if (K == -1) { }
.
N11
, . :
short s;
...
If (s==0xaaaa) { }
.N12
'new' 'malloc' 'delete'/'free' . , :
void foo()
{
std::vector<int> *v1 = new std::vector<int>;
std::vector<int> v2;
v2->push_back(*v1);
...
}
, 'v2' 'std::vector<int>'. - , 'int'. , 'v1', . , , 'delete v1' . .
'v1' , :
void foo()
{
std::vector<int> v1;
std::vector<int> v2;
v2->push_back(v1[0]);
...
}
N13
'new[]', 'delete'. — 'new', 'delete[]'. , : "
delete, new[] C++ ".
N14
:
int sum;
...
for (int i = 0; i < 10; i++)
{
sum++;
}
/++ . , . . .
N15
:
char* CreateName()
{
char FileName[100];
...
return FileName;
}
'FileName' , , .
N16
, '-1' . , , , . .
N17
, Unit-.
N18
. :
D = ns_vsk.bit.D_PN_ml + (int)(ns_vsk.bit.D_PN_st) << 16;
, . "
/++ ". , — , . :
#define A 1
#define B 2
#define TYPE A | B
if (type & TYPE) { }
, TYPE . 'type & A', '(type & A ) | B'. — .
N19
:
int mas[3];
mas[0] = 1;
mas[1] = 2;
mas[2] = 3;
mas[3] = 4;
'mas[3] = 4;' , 'int mas[N]' [0...N-1].
N20
'&&' '||'. '&&' . :
if (A || B && C) { }
. , -.
.
N21
:
void foo(int *a, int b)
{
If (b == 10)
{
*a = 10;
}
else
{
a = new int;
}
}
'a' , :
void foo(int *&a, int b) {....}
:
void foo(int **a, int b) {....}
:
- , . ++. . ;
- ++. 101 . , ;
- . . ;
- ++. . ;
- C++. 50 . .
. , - , . .
, . , . . , « », . , , , , .
. ( : TDD, , , , ...), 10 //( - ). , . - - .
? PVS-Studio. . :)