2011-01-24 6 views
14

क्या कुछ ध्वज के साथ निम्न फ़ाइल को संकलित करते समय g ++ त्रुटि दिखाई दे सकती है?क्या g ++ में सरणी सीमाओं को जांचना संभव है?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int arr[ 2 ]; 

    cout << arr[ 4 ] << endl; 

    return 0; 
} 

मैं gcc -Wall -O2 main.c जैसे कुछ चीजें हैं जो केवल सी, सी ++ नहीं के साथ काम करता देखा।

+1

'-Wall -Wextra -ansi -pedantic' इस कार्यक्रम के लिए चेतावनियां उत्पन्न नहीं करता है :( – EnabrenTane

उत्तर

3

आप एक स्थिर विश्लेषक जैसे Cppcheck का उपयोग कर सकते हैं। जब आपके ऊपर कोड पर चलने:

 
$ cppcheck --enable=all test.cpp 
Checking test.cpp... 
[test.cpp:6]: (style) Variable 'arr' is not assigned a value 
[test.cpp:8]: (error) Array 'arr[2]' index 4 out of bounds 

आप अपने निर्माण प्रक्रिया में Cppcheck एकीकृत करने और अपने कोड को सफलतापूर्वक केवल बनाया अगर Cppcheck गुजरता है पर विचार कर सकते हैं।

0

आप std::vector साथ सरणियों की जगह ले सकता:

कि के लिए पर एक नज़र डालें। वेक्टर में एक्सेसर सदस्य फ़ंक्शन (std::vector::at) है जो रनटाइम पर जांच करता है।

बफर ओवरफ़्लो के लिए संकलित समय जांच दुर्भाग्यवश, एक बहुत कठिन अनावश्यक समस्या है। यह आमतौर पर एक पूर्ण उड़ा स्थिर विश्लेषण उपकरण द्वारा संभाला जाता है।

2

मैं ffmpeg या x264

की तर्ज पर से एक जीसीसी या जी ++ चेतावनी संदेश देख याद "सरणी के चेतावनी सूचकांक सीमा से बाहर हो सकता है"

http://gcc.gnu.org/ml/gcc/2000-07/msg01000.html

लगता है जैसे कि यह शायद इसी कारण इसमें

बाधा यह है कि आपके ऊपर जैसा उदाहरण है। जैसे ही आपके पास अक्षर के बजाय चर होते हैं, यह संभव नहीं है। शायद एक साधारण पाश में छोड़कर।

+0

[विकिपीडिया के अनुसार] (https://en.wikipedia.org/wiki/AddressSanitizer), ffmpeg पताSanitizer का उपयोग करता है। इसका आउटपुट हो सकता है। पतासंनिटर पर अधिक [ए में एक अन्य क्यू] (// stackoverflow.com/a/17637383/2157640) – Palec

3

कच्चे सरणियों के लिए, मैं ऐसा नहीं सोचता, क्योंकि -fbounds-check अपने उदाहरण और Mingw जी ++ 4.4.1 के साथ काम नहीं किया है, और क्योंकि वर्ष 3.x डॉक्स मैं कहना

-fbounds जाँच करें

सामने समाप्त होता है कि यह समर्थन के लिए, जाँच करने के लिए है कि पहुँच सरणियों के लिए इस्तेमाल किया सूचकांक घोषित सीमा के भीतर हैं अतिरिक्त कोड उत्पन्न करते हैं। यह वर्तमान में केवल जावा और फ़ोरट्रान 77 फ्रंट-एंड द्वारा समर्थित है, जहां यह विकल्प क्रमशः सत्य और गलत पर डिफ़ॉल्ट है।

हालांकि, std::vector के साथ एक से थोड़ा अव्यावहारिक रन-टाइम सीमा-चेकिंग के लिए at उपयोग कर सकते हैं (अपवाद उत्पन्न करता है)। और आप मानक लाइब्रेरी के एक विशेष डीबग संस्करण का उपयोग कर सकते हैं, जो [] के लिए व्यावहारिक रन-टाइम सीमा-जांच प्रदान करता है। उदाहरण के लिए, संकलन और नरक करते समय;

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int> arr(2); 

    cout << arr[ 4 ] << endl; 
} 

और नरकिप; आप अलग अलग क्रमशः गैर जाँच और जी ++ मानक पुस्तकालय कार्यान्वयन की रिहाई और डिबग संस्करणों के लिए जाँच व्यवहार मिलता है:

 
C:\test> g++ x.cpp & a 
4083049 

C:\test> g++ x.cpp -D _GLIBCXX_DEBUG -D _GLIBCXX_DEBUG_PEDANTIC & a 
c:\program files\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/debug/vector:265: 
    error: attempt to subscript container with out-of-bounds index 4, but 
    container only holds 2 elements. 

Objects involved in the operation: 
sequence "this" @ 0x0x22ff1c { 
    type = NSt7__debug6vectorIiSaIiEEE; 
} 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

C:\test> _ 

कथित तौर पर के लिए नए जी ++ संस्करणों (4.0 के बाद) आप _GLIBCXX_DEBUG_PEDANTIC प्रतीक जरूरत नहीं है। विवरण के लिए, GNU documentation देखें।

चीयर्स & एचएचटी।,

+2

'{boost, std :: tr1, std} :: array' में' at' है भी। –

संबंधित मुद्दे