तो मैं जो एक साधारण बफर अतिप्रवाह दर्शाता कोड के इस सरल टुकड़ा है:क्या सी में बफर अतिप्रवाह पकड़ कर सकते हैं उपकरण?
#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] ओवरलैप होता है और मुझे लगता है कि यह ऐसा है जो उपकरण को याद करने के कारण होता है।
तो, क्या इसे पकड़ सकता है? लिनक्स पर काम करने वाला कुछ अच्छा होगा।
पट्टी का नवीनतम संस्करण दुर्भाग्य की कोशिश, इस पकड़ नहीं करता है सकते हैं। –
आप सही हैं, यह दुर्भाग्यपूर्ण है, लेकिन 'cppcheck' करता है! – SiegeX
निराशाजनक है कि जीसीसी इसे पकड़ नहीं लेता है, इस बात पर विचार करते हुए कि मुझे कुछ समय पहले एक कंपाइलर बग के आसपास काम करना पड़ा था, जहां यह एक अंत-ऑफ-एरे पॉइंटर के बारे में चेतावनी दे रहा था जिसे अस्वीकार भी नहीं किया गया था। Http://stackoverflow.com/questions/1168525/c-gcc4-4-warning-array-subscript-is-above-array-bounds देखें। मुझे लगता है कि जीसीसी * इसका निदान करने के लिए * कोशिश करता है, भले ही इसकी आवश्यकता नहीं है, इसलिए या तो आपके विकल्प इसे अक्षम करते हैं, या आपको विपरीत कंपाइलर बग मिला है ... –