
पीवीएस-स्टूडियो में सी ++ / सीएलआई में लिखी गई परियोजनाओं का समर्थन प्राथमिकता नहीं है। ऐसी कुछ परियोजनाएँ हैं, लेकिन फिर भी, समय-समय पर हम उनके सामने आते हैं। Microsoft वर्तमान में C ++ / CLI भाषा का समर्थन बंद करने की योजना नहीं बना रहा है, इसलिए हमने इस तरह की भाषा का समर्थन करने का निर्णय लिया है।
C ++ / CLI समर्थन
विकिपीडिया:
C ++ / CLI - C ++ प्रोग्रामिंग लैंग्वेज को Microsoft .NET प्रोग्रामिंग वातावरण में बाँधना। यह कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर (सीएलआर) के हिस्से के रूप में यूनिफाइड टाइप सिस्टम (यूटीएस) के साथ आईएसओ मानक के सी ++ को एकीकृत करता है। यह मूल स्तर और प्रबंधित C ++ से संकलित निष्पादन योग्य फ़ाइलों के स्रोत स्तर और अंतर दोनों का समर्थन करता है। C ++ / CLI C ++ के एक और विकास का प्रतिनिधित्व करता है।
हमने अधिकांश परियोजनाओं का परीक्षण करने के लिए पर्याप्त स्तर पर पीवीएस-स्टूडियो में सी ++ / सीएलआई के लिए समर्थन लागू किया। हालांकि, हमारे पास परीक्षण के लिए पर्याप्त परियोजनाएं नहीं थीं और कुछ भाषा निर्माणों को सही ढंग से संसाधित नहीं किया जा सकता है या स्पष्ट रूप से गलत सकारात्मक उत्पादन करेगा। हर चीज़ पर नज़र रखना मुश्किल है। यदि आपको अपनी परियोजनाओं की जाँच में कोई समस्या आती है, तो कृपया हमें बताएँ।
यह लेख पूरा हो सकता है, लेकिन यह दिलचस्प नहीं है। इसलिए, हमने एक छोटी परियोजना स्लिमडएक्स की जाँच की कि नीचे क्या बताया जाएगा।
SlimDX
Wikipedia:
SlimDX एक खुला स्रोत एपीआई है। .NET रनटाइम (सीएलआर के कारण) के तहत किसी भी भाषा से स्लिमडीएक्स का उपयोग किया जा सकता है। SlimDX का उपयोग मल्टीमीडिया और इंटरैक्टिव एप्लिकेशन (जैसे गेम) विकसित करने के लिए किया जा सकता है। उच्च निष्पादन ग्राफिकल प्रतिनिधित्व को सक्षम करना और .NET फ्रेमवर्क के अंदर काम करते हुए प्रोग्रामर को आधुनिक ग्राफिकल हार्डवेयर का उपयोग करने में सक्षम बनाना।
आधिकारिक वेबसाइट:
http://slimdx.org/पीवीएस-स्टूडियो कोड विश्लेषक का उपयोग करके चेक किया गया था। चूंकि यह परियोजना छोटी है और एक अन्य पुस्तकालय के ऊपर एक आवरण है, इसलिए बहुत कम संदिग्ध स्थान थे। हालांकि, वे उनके बारे में लिखने के लिए पर्याप्त हैं।
मान्यता परिणाम
नीचे कोड स्निपेट हैं जो मुझे गलत लगे।
टुकड़े टुकड़े करना N १ContainmentType BoundingBox::Contains( BoundingBox box, BoundingSphere sphere ) { .... if( box.Minimum.X + radius <= sphere.Center.X && sphere.Center.X <= box.Maximum.X - radius && box.Maximum.X - box.Minimum.X > radius && <<<=== box.Minimum.Y + radius <= sphere.Center.Y && sphere.Center.Y <= box.Maximum.Y - radius && box.Maximum.Y - box.Minimum.Y > radius && box.Minimum.Z + radius <= sphere.Center.Z && sphere.Center.Z <= box.Maximum.Z - radius && box.Maximum.X - box.Minimum.X > radius) <<<=== return ContainmentType::Contains; .... }
PVS-Studio चेतावनी: V501 समान उप-अभिव्यक्तियाँ हैं 'box.Maximum.X - box .inimum.X> त्रिज्या' बाईं ओर और '&&' संचालक के दाईं ओर। बाउंडबॉक्सबॉक्स 94
सबसे अधिक संभावना है कि यह कोड कॉपी-पेस्ट का उपयोग करके लिखा गया था और अंतिम पंक्ति में परिवर्तन करना भूल गया था। अभिव्यक्ति के अंत में "box.Maximum.Z - box.inimum.Z> त्रिज्या" लिखा होना चाहिए।
टुकड़ा करना N2 typedef struct DIJOYSTATE2 { .... LONG rglSlider[2]; .... LONG rglVSlider[2]; .... LONG rglASlider[2]; .... LONG rglFSlider[2]; .... } DIJOYSTATE2, *LPDIJOYSTATE2; void JoystickState::AssignState(const DIJOYSTATE2 &joystate) { .... for( int i = 0; i < 2; i++ ) { sliders[i] = joystate.rglSlider[i]; asliders[i] = joystate.rglASlider[i]; vsliders[i] = joystate.rglVSlider[i]; fsliders[i] = joystate.rglVSlider[i]; } .... }
चेतावनी PVS-Studio: V525 समान ब्लॉकों के संग्रह वाला कोड। चेक आइटम 'rglSlider', 'rglASlider', 'rglVSlider', 'rglVSlider' लाइनों 93, 94, 95, 96 में। joystickstate.cpp 93
मुझे लगता है कि इस कोड में एक टाइपो है। अंतिम पंक्ति को शायद rglFSlider सरणी का उपयोग करना चाहिए:
sliders[i] = joystate.rglSlider[i]; asliders[i] = joystate.rglASlider[i]; vsliders[i] = joystate.rglVSlider[i]; fsliders[i] = joystate.rglFSlider[i];
टुकड़ा करना N3 array<SoundEffectResult>^ SecondarySoundBuffer::SetEffects( array<Guid>^ effects ) { DWORD count = effects->Length; .... if( effects != nullptr && count > 0 ) .... }
PVS- स्टूडियो चेतावनी: V595 'प्रभाव' पॉइंटर को nullptr के खिलाफ सत्यापित करने से पहले उपयोग किया गया था। चेक लाइनें: 66, 73. गौण गौण
शुरुआत में, 'इफेक्ट्स' पॉइंटर को डिफाइन किया जाता है। फिर नीचे दिए गए कोड में यह समानता के लिए शून्य की जाँच की जाती है।
टुकड़ा करना N4एक वर्ग 'TVariable' है जिसमें आभासी कार्य शामिल हैं:
template<typename IBaseInterface> struct TVariable : public IBaseInterface { virtual BOOL IsValid() { .... } .... };
इस वर्ग से SMember वर्ग विरासत में मिला है। ध्यान दें कि शून्य को ZeroMemory () फ़ंक्शन का उपयोग करके इस वर्ग के क्षेत्रों में लिखा जाता है।
struct SMember : public TVariable<TMember<ID3DX11EffectVariable> > { }; CEffectVectorOwner<SMember> m_pMemberInterfaces; ZeroMemory HRESULT CEffect::CopyMemberInterfaces(....) { .... ZeroMemory( &m_pMemberInterfaces[i], sizeof(SMember) * ( Members - i ) ); .... }
PVS-Studio चेतावनी: V598 'मेमसेट' फ़ंक्शन का उपयोग 'SMember' वर्ग के क्षेत्रों को शून्य करने के लिए किया जाता है। वर्चुअल विधि तालिका इससे क्षतिग्रस्त हो जाएगी। effectnonruntime.cpp 1739
चूँकि वर्चुअल फ़ंक्शंस हैं, इसलिए SMember क्लास में वर्चुअल तरीकों की तालिका के लिए एक पॉइंटर होता है। जब आप ZeroMemory () फ़ंक्शन को कॉल करते हैं तो यह पॉइंटर दूषित हो जाएगा।
इसी तरह:
- effectload.cpp 1106
- effectload.cpp 1107
टुकड़े करना N5 #pragma warning(disable: 4369) public enum class WaveFormatTag : System::Int32 { Pcm = WAVE_FORMAT_PCM, AdPcm = WAVE_FORMAT_ADPCM, IeeeFloat = WAVE_FORMAT_IEEE_FLOAT, MpegLayer3 = WAVE_FORMAT_MPEGLAYER3, DolbyAC3Spdif = WAVE_FORMAT_DOLBY_AC3_SPDIF, WMAudio2 = WAVE_FORMAT_WMAUDIO2, WMAudio3 = WAVE_FORMAT_WMAUDIO3, WmaSpdif = WAVE_FORMAT_WMASPDIF, Extensible = WAVE_FORMAT_EXTENSIBLE, }; #pragma warning(default: 4369)
PVS-Studio चेतावनी: V665 संभवतः, इस संदर्भ में '#pragma चेतावनी (डिफ़ॉल्ट: X)' का उपयोग गलत है। इसके बजाय '#Pagma चेतावनी (पुश / पॉप)' का उपयोग किया जाना चाहिए। चेक लाइनें: 1089, 1102. enums.h 1102
कंपाइलर चेतावनी गलत तरीके से दबा दी जाती है। अंत में, डिफ़ॉल्ट मान पुनर्स्थापित किया जाता है। यह शुरुआत में सेटिंग्स की स्थिति को बचाने के लिए अधिक सही है, और फिर इसे पुनर्स्थापित करें। इसे गंभीर गलती नहीं कहा जा सकता। हालांकि, पुस्तकालयों के लिए यह महत्वपूर्ण है कि वे उपयोगकर्ता परियोजनाओं में चेतावनी स्तर की सेटिंग्स को खराब न करें। अलर्ट को दबाने के लिए सही दृष्टिकोण के लिए अलर्ट
V665 का विवरण
देखें ।
हेडर फ़ाइल "enums.h" में कई और समान दोष हैं। लाइन नंबर: 224, 267, 346।
निष्कर्ष
मैं स्वीकार करता हूं कि C ++ / CLI परियोजना की जाँच के बारे में पहला लेख उबाऊ और संक्षिप्त है। पहला पैनकेक गांठदार है। मुझे उम्मीद है कि भविष्य में कुछ बड़े और अधिक दिलचस्प प्रोजेक्ट को सत्यापित करने में सक्षम हो सकूंगा।
मेरा सुझाव है कि
पीवीएस-स्टूडियो का उपयोग करके अपनी सी ++ / सीएलआई परियोजनाओं को डाउनलोड करना और परीक्षण करना। हमें आपकी प्रतिक्रिया और टिप्पणी प्राप्त करने में खुशी होगी।
यह लेख अंग्रेजी में है।
यदि आप इस लेख को अंग्रेजी बोलने वाले दर्शकों के साथ साझा करना चाहते हैं, तो कृपया अनुवाद के लिंक का उपयोग करें: एंड्री कारपोव।
C ++ / CLI अब PVS-Studio में समर्थित है ।