2017-09-11 15 views
5

मैं निम्नलिखित कोड है:जीसीसी str पर शून्य हो करने में सक्षम नहीं शिकायत

int atoi(const char * str) 
{ 
    int ret = 0, i; 
    if (str) { 
      for (i = 0; str[i] != '\0'; i++) 
        if (str[i] >= '0' && str[i] <= '9') 
          ret = ret * 10 + str[i] - '0'; 
    } 
    return ret; 
} 

जब

[email protected] ~/p/book> make 
gcc -c -o db.o db.c -Wall -Werror -std=c99 -g -DVERSION=\"v0.4\" -Wno- 
unused-variable -Wno-unused-function 
gcc -c -o misc.o misc.c -Wall -Werror -std=c99 -g -DVERSION=\"v0.4\" - 
Wno-unused-variable -Wno-unused-function 
misc.c: In function ‘atoi’: 
misc.c:55:5: error: nonnull argument ‘str’ compared to NULL [-Werror=nonnull-compare] 
    if (str) { 
    ^
cc1: all warnings being treated as errors 
Makefile:54: recipe for target 'misc.o' failed 
make: *** [misc.o] Error 1 

मैं जीसीसी संस्करण का उपयोग कर रहा हूँ के साथ संकलित करने के लिए कोशिश कर रहा है:

[email protected] ~/p/book> gcc --version 
gcc (Debian 6.3.0-18) 6.3.0 20170516 

मुझे चेतावनी नहीं समझती है। एक कॉन्स char * पूर्ण होना चाहिए, है ना?

+2

आपकी समस्या से संबंधित नहीं है, लेकिन आपके फ़ंक्शन में गंभीर त्रुटि है ... उदाहरण का उपयोग करने का प्रयास करें इनपुट के रूप में '123abc456" 'और देखें कि परिणाम क्या होगा। –

+0

शायद 'gcc' उस फ़ंक्शन को इनलाइन करने का प्रयास करता है और जानता है कि इसमें कोई भी पूर्ण तर्क नहीं है। आपके कोड में इस फ़ंक्शन का कितनी बार उपयोग किया जाता है और इसके उपयोग के उदाहरण क्या हैं? – myaut

+1

झूठी सकारात्मक की तरह लगता है। यद्यपि 'if (str)' 'if (str! = NULL) 'की तुलना में मैला शैली है, इसके लिए वास्तव में चेतावनी को टॉस करने की आवश्यकता नहीं है। – Lundin

उत्तर

17

atoi सी पुस्तकालय में एक मानक कार्य है। उस मानक फ़ंक्शन के शीर्षलेख में विशेषता __nonnull है, जो विशेष जीसीसी हैंडलिंग को ट्रिगर करता है।

आपका ओवरराइड कार्यान्वयन उस विशेष हैंडलिंग का उपयोग नहीं करता है (इस धारणा का सम्मान करता है कि तर्क शून्य नहीं है), इस प्रकार चेतावनी।

वास्तविक उत्तर: मानक लाइब्रेरी से किसी फ़ंक्शन से फ़ंक्शन नाम का दोबारा उपयोग न करें।

+1

मैं जीसीसी 6.1.2 के साथ ओपी मुद्दे को पुन: उत्पन्न नहीं कर सकता, लेकिन फिर भी बहुत अच्छा जवाब (10k के लिए बधाई)! –

+0

वही, मैं stdlib.h सहित भी इसे पुन: पेश नहीं कर सकता। – Lundin

+0

मैं ओपी के कोड पेस्ट करके और * # शामिल 'जोड़कर पुन: उत्पन्न कर सकता हूं। यह glibc फ़ंक्शन के लिए '__nonnull' विशेषता में खींच रहा है। इसके बिना, कोई समस्या नहीं है। – Peter

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