warning: operation on 'a' may be undefined

05/01/2008 - 18:56 von Juergen Beisert | Report spam
Hallo zusammen,

so ganz verstehe ich das nicht. Ist das in meinem Fall wirklich nur eine
Warnung oder übersehe ich da etwas?

1 char *a;
2 a = <irgendwas>;
3 bla = strtol(++a, &a, 10);

Die Meldung im Betreff kommt in allen Zeilen, die aussehen wie Zeile 3. Über
welches der beiden ersten Argumente beschwert sich der Compiler? "++a"
oder "&a". "&a" ist eine Konstante. Hat der vielleicht "++a" noch nicht
wieder gesichert, wenn strtol() aufgerufen wird, so daß strtol() sein *a
schreibt, aber dieser Aufruf dann den alten "++a" darüber schreibt?

Ich habe es mal damit ausprobiert:

#include <stdio.h>
#include <stdlib.h>

char buffer[] = {'\0', '1', '2', '3', '\0', '4', '5', '6', '\0'};

int main (int argc, char *argv[])
{
int i1, i2;
char *a;

a = buffer;
i1 = strtol(++a, &a, 10);
i2 = strtol(++a, &a, 10);

printf("Erste Zahl (123): %d, Zweite Zahl (456): %d", i1, i2);

return 0;
}


gcc -Wall test.c -o test


test.c: In function 'main':
test.c:15: warning: operation on 'a' may be undefined
test.c:16: warning: operation on 'a' may be undefined

./test


Erste Zahl (123): 123, Zweite Zahl (456): 456

Das Programm verhàlt sich erwartungsgemàß. Zufall? Sollte ich das lieber
nicht so schreiben? Meistens hat der gcc ja doch Recht, wenn er meckert.

Gruß
Juergen
 

Lesen sie die antworten

#1 Stefan Reuther
05/01/2008 - 19:59 | Warnen spam
Hallo,

Juergen Beisert wrote:
so ganz verstehe ich das nicht. Ist das in meinem Fall wirklich nur eine
Warnung oder übersehe ich da etwas?

1 char *a;
2 a = <irgendwas>;
3 bla = strtol(++a, &a, 10);

Die Meldung im Betreff kommt in allen Zeilen, die aussehen wie Zeile 3. Über
welches der beiden ersten Argumente beschwert sich der Compiler?



Ich würde das jetzt spontan als Fehlalarm einsortieren. Er beschwert
sich ja auch "may be undefined", nicht "is undefined". Da es zwischen
dem Auswerten der Funktionsargumente und dem eigentlichen Aufruf einen
Sequenzpunkt gibt (6.5.2.2p10), muss '++a' zuende ausgewertet sein bevor
'strtol' 'a' überschreibt.

Ich sehe allerdings keinen Grund, hier '++a' zu schreiben; 'a+1' sollte
das gleiche tun und ist IMHO sauberer.


Stefan

Ähnliche fragen