2009-11-15 8 views
7

तो मैं जो एक साधारण बफर अतिप्रवाह दर्शाता कोड के इस सरल टुकड़ा है:क्या सी में बफर अतिप्रवाह पकड़ कर सकते हैं उपकरण?

#include <stdio.h> 

int main(void) 
{ 
    char c[4] = { 'A', 'B', 'C', 'D' }; 
    char d[4] = { 'W', 'X', 'Y', 'Z' }; 

    printf("c[0] is '%c'\n", c[0]); 

    d[4] = 'Z'; /* Overflow that overwrites c[0] */ 

    printf("c[0] is '%c'\n", c[0]); 

    return 0; 
} 

उत्पादन:

$ ./a.out 
c[0] is 'A' 
c[0] is 'Z' 

मैं निम्नलिखित जीसीसी विकल्पों के साथ इस कोड संकलन की कोशिश की है और यह उड़ान के साथ पारित रंग:

gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \ 
    -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ 
    -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ 
    -Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \ 
    -Wstack-protector -fstack-protector-all -std=c99 -pedantic -O0 -ggdb3 

मैं भी libefence और valgrind की कोशिश की। मैं के बाद से यह सीमा से बाहर पकड़ने के लिए पढ़ने/ढेर पर लिखते हैं बना दिया है पारित करने के लिए libefence की उम्मीद है, लेकिन मैं हैरान हूँ कि valgrind पारित कर दिया था।

यह कोड सेगफॉल्ट उत्पन्न नहीं करता है क्योंकि सी [4] और डी [0] ओवरलैप होता है और मुझे लगता है कि यह ऐसा है जो उपकरण को याद करने के कारण होता है।

तो, क्या इसे पकड़ सकता है? लिनक्स पर काम करने वाला कुछ अच्छा होगा।

+0

पट्टी का नवीनतम संस्करण दुर्भाग्य की कोशिश, इस पकड़ नहीं करता है सकते हैं। –

+0

आप सही हैं, यह दुर्भाग्यपूर्ण है, लेकिन 'cppcheck' करता है! – SiegeX

+0

निराशाजनक है कि जीसीसी इसे पकड़ नहीं लेता है, इस बात पर विचार करते हुए कि मुझे कुछ समय पहले एक कंपाइलर बग के आसपास काम करना पड़ा था, जहां यह एक अंत-ऑफ-एरे पॉइंटर के बारे में चेतावनी दे रहा था जिसे अस्वीकार भी नहीं किया गया था। Http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-bounds देखें। मुझे लगता है कि जीसीसी * इसका निदान करने के लिए * कोशिश करता है, भले ही इसकी आवश्यकता नहीं है, इसलिए या तो आपके विकल्प इसे अक्षम करते हैं, या आपको विपरीत कंपाइलर बग मिला है ... –

उत्तर

5

cppcheck की कोशिश करो। यह मेरे लिए काम किया।

+0

'cppcheck' पर अच्छी कॉल। मैंने पहले कभी इस स्रोत विश्लेषक के बारे में नहीं सुना है लेकिन * यह त्रुटि * त्रुटि पाता है! – SiegeX

+1

नया यूआरएल है: http://cppcheck.sourceforge.net/ –

+0

@ एंड्रयूस्कूल धन्यवाद; यूआरएल अपडेट किया गया। – Teddy

0

यदि यह लिनक्स पर है तो मैं पहले वाल्ग्रिंड का प्रयास करूंगा, मुझे लगता है कि यह इसे संभालेगा।

संपादित करें: अगर ऐसा है SiegeX का कहना है की तरह मुझे लगता है कि valgrind नहीं है (जो समझ में आता है, क्योंकि यह स्टैक पर गार्ड सम्मिलित करने के लिए के रूप में यह केवल प्रक्रिया क्रम में शामिल है कोई रास्ता नहीं है)। यह वैसे भी एक अच्छा उपकरण है जो आपके टूलबॉक्स में लायक है इसलिए मैं पोस्ट रखूंगा।

+3

वालग्रिंड * प्रश्न में स्पष्ट रूप से यह नहीं कहा गया है । कृपया इसे रोकना बंद करें। – SiegeX

+0

-1 संपादन के बाद वास्तव में उचित imho नहीं था। – Fredrik

+0

@ घेराबंदी: "वालग्रिंड भी पास" मुझे लगता है, क्योंकि यह इसे पकड़ता है। मुझे कहना होगा कि मैं थोड़ा आश्चर्यचकित था, क्योंकि मुझे उम्मीद नहीं थी कि इससे निपटने की उम्मीद है, क्योंकि यह स्मृति को पकड़ने के लिए डिज़ाइन किया गया है जिसे आवंटित किया गया है। – Vatine

-1

मुझे लगता है कि इस मामले में एक अंतर्निहित शून्य चरित्र है, क्योंकि आप एक शाब्दिक स्ट्रिंग का संदर्भ दे रहे हैं। इसलिए, डी [4] अभी भी सीमा में है (डी को कॉन्स चार * के रूप में कल्पना करें) .... हालांकि मैं गलत हो सकता हूं।

+1

अगर मैंने इसे सी [5] = "एबीसीडी" घोषित किया था; तो कंपाइलर अंत में एनयूएल बाइट में फेंक दिया होता। लेकिन चूंकि एनयूएल बाइट के लिए केवल 4 अक्षरों के लिए कोई जगह नहीं है, इसलिए इसे छोड़ दिया जाता है। हालांकि, मैंने भ्रम को कम करने के लिए प्रारंभिकरण के लिए स्पष्ट रूप से वर्णों का उपयोग करने के लिए कोड बदल दिया है। स्थिर स्रोत विश्लेषकों की सिफारिश करने के लिए – SiegeX

2

valgrind द्विआधारी पर काम करता है के रूप में, यह कुछ भी इस कोड के साथ गलत नहीं देखा। इन (http://www.thefreecountry.com/programming/debuggers.shtml) स्थिर स्रोत कोड विश्लेषक की जाँच करें, वे चाहिए। यदि वे काम नहीं करते हैं, तो पीसी-लिंट (http://www.gimpel.com/html/pcl.htm) इसे संभाल लेंगे ....

+0

+1 ... यह और/या सहकर्मी समीक्षा शायद इसे पकड़ने की सबसे अधिक संभावना है यदि वाल्ग्रिंड जैसी चीजें नहीं होती हैं (और इसके बारे में सोचते हुए, मुझे एहसास है कि कोई रास्ता नहीं है जब तक कि यह इसे तब तक नहीं ढूंढ सकता संकलन प्रक्रिया में शामिल हो जाता है) – Fredrik

+0

हालांकि आपका 'debuggers.shtml' लिंक 'cppcheck' (स्वीकृत उत्तर) के बारे में बात नहीं करता है, यह अन्यथा एक बहुत अच्छा लिंक है। धन्यवाद – SiegeX

+0

मैंने पहले cppcheck के बारे में नहीं सुना है। सबसे पुरानी रिलीज 2007 में थी, इसलिए यह अपेक्षाकृत नया है। विशेष रूप से जब पीसी-लिंट की तुलना में ... – Malkocoglu

1

तर्कसंगत शुद्धता बफर ओवरफ्लो, मेमोरी लीक, भ्रष्टाचार इत्यादि का पता लगाने के साथ काफी अच्छी तरह से काम करती है। हालांकि यह काफी महंगा है।

ज्ञात पैकेज in this SO answer एक और विकल्प हो सकता है।

1

Coverity (एक स्थिर विश्लेषण उपकरण) इस पकड़ लेंगे।

0

बफर ओवरफ्लो सी में पकड़ने के लिए काफी कठिन हैं क्योंकि वे रनटाइम तक नहीं होते हैं। किसी को उत्पन्न करने का मौका कम करने के लिए आपको कुछ हद तक सुरक्षित मानक लाइब्रेरी फ़ंक्शंस का उपयोग करना चाहिए जो कुछ सीमाओं की जांच करते हैं - उदा। fgets() के बजाय()।

यदि आप मैन्युअल रूप से बहुत सारे सरणी में हेरफेर करते हैं तो आपको शायद अपने एल्गोरिदम में किनारे के मामलों की जांच करने के लिए यूनिट परीक्षण लिखना चाहिए। Cmockery उदाहरण के लिए सी

+0

यह विशिष्ट बफर ओवरडुन शॉउड कैच करने योग्य संकलन-समय हो सकता है, क्योंकि कोड (स्थिर रूप से) * (सी + 4) एक्सेस करता है, जहां आवंटन के साथ सी + 3 अंतिम मान्य पता होता है। – Vatine

0

वाल्ग्रींड स्वचालित और स्थैतिक भंडारण में अतिप्रवाह नहीं पकड़ता है। कम से कम डिफ़ॉल्ट रूप से नहीं। आईआईआरसी इसे काम करने के लिए आपको या तो "विकास में" उपकरण के कुछ विकल्प या रन को चालू करना चाहिए, जो डिफ़ॉल्ट "memcheck" नहीं है।

+0

मैंने नवीनतम valgrind 3.5.0 में अपग्रेड किया और --tool = exp-ptrcheck का उपयोग किया और यह अभी भी शून्य चेतावनियों और त्रुटियों के साथ पारित हुआ। – SiegeX

0

विजुअल स्टूडियो (-ज़ी मुझे लगता है, लेकिन मैं गलत हो सकता हूं) इस रनटाइम स्टैक चेकर के साथ इस तरह के असाइनमेंट को पकड़ता है। यह आपके द्वारा पसंदीदा लिनक्स समाधान नहीं है, लेकिन यह अच्छी तरह से काम करता है।

2

बगफाइटर सी/सी ++ के साथ प्रयास करें।

मैं इसे हर दिन उपयोग करता हूं और यह array[5][5][5] जैसे बहुआयामी सरणी के साथ भी ठीक काम करता है।

बगफाइटर वेब पेज www.bugfighter-soft.com है।

2

valgrind के Memcheck ढेर स्मृति

ढेर के लिए के बारे में पता लगा रहा है, तो आप valgrind के SGCheck