2016-03-22 8 views
1

Für den folgenden Code, Klocwork berichtet Nicht validiert Integer-Wert ‚val‘ aus ‚atoi‘ empfangen und kann verwendet werden, Array zuzugreifenNicht validiert Integer-Wert wird von ‚atoi‘ erhielt

int main(int argc, char **argv) 
{ 
    int i = 0; 
    int val = 0; 
    for (i = 0; i < argc; i++) 
    { 
     if (argv[i]) 
     { 
      val = atoi(argv[i]); 
      ...... 
      ...... 
     } 
    } 
    return 0; 
} 

Ich habe keine Hinweis, um dieses Problem zu lösen. Wenn argv [i] keine Zahl ist, gibt atoi 0 zurück. Was erwartet klocwork hier?

+3

Verwenden Sie 'val' als Array-Index irgendwo? ('xy [val]') – alain

+0

was machst du mit 'val'? –

+0

Ja. Ich benutze Val als Array-Index in einem anderen Stück Code – impulse

Antwort

5

Nun, der erste offensichtliche Rat hier ist: aufhören zu verwenden atoi. atoi ist zum Skizzieren, nicht für echten Code. atoi hat keine Fehlerrückmeldungsmechanismen und erzeugt bei Überlauf undefiniertes Verhalten. Funktionen von ato... Gruppe wurden halb offiziell in C95 halb aufgegeben. Seit diesem Zeitpunkt haben sie sich nur aus Gründen der Rückwärtskompatibilität ausgeklinkt. Ich habe keine Ahnung, warum sie immer noch nicht offiziell veraltet sind.

Sie möchten eine Zeichenfolge in eine ganze Zahl umwandeln - verwenden Sie strtol und denken Sie daran, auf Fehler zu prüfen, indem Sie errono und/oder den Rückgabewert analysieren. Und wie bereits vorgeschlagen, ist es eine gute Idee (und für einen Wert, der von der Außenwelt kommt - es ist ein Muss), wenn Sie den resultierenden Wert als Array-Index verwenden, um sicherzustellen, dass der Index drin ist der richtige Bereich.

+0

Gibt es ein offizielles Dokument, das Ihre Aussage über die Desuse der 'ato *' -Gruppe von Funktionen unterstützt? Ich bin etwas erstaunt. –

+1

@Rafael Campos Nunes: Es ist tatsächlich eine bekannte Tatsache aus der Geschichte der C-Sprache. Im Jahr 1995 wurde die C-Sprache mit Unterstützung für Wide-Characters aktualisiert. Alle zeichenbezogenen Bibliotheksfunktionen haben ihre breite Version (wie 'wcscpy' für' strcpy', 'wcstod' für' strtod' usw.). Es wurde jedoch niemals eine breite Version von Funktionen aus der 'ato ...' Gruppe erstellt, da sie zu dieser Zeit bereits von 'strto ...' Funktionen subsumiert wurden. Sie können darüber in dem ziemlich bekannten "C99 Rationale" Dokument lesen: http: //www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf (siehe 7.20.1.1) – AnT

+0

Vielen Dank für die Information @AnT. –

1

atoi ist definiert als:

int atoi (const char *nPtr)     /*convert the string nPtr to int*/ 

Sie im Auge behalten müssen, dass, wenn der umgewandelte Wert kann nicht in int dargestellt werden. Das Atoi Funktionsverhalten ist undefined (Verwenden Sie es mit Vorsicht).

aktualisiert

Wenn der umgewandelte Wert fällt außerhalb des Bereichs der Rückgabetyp entspricht, ist der Rückgabewert undefiniert. Wenn keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.