declared with attribute warn_unused_result
-
Hi
ich bekomme diese Warnungen, wenn ich die Funktionen strtoull, bzw. strtod verwende:
$ make ... [ 95%] Building C object cu_inifile/CMakeFiles/cu_inifile.dir/cu_inifile.c.o ../../cu_inifile/cu_inifile.c: In function ‘inifile_iter_get_vtype_locked’: ../../cu_inifile/cu_inifile.c:1434: warning: ignoring return value of ‘strtoull’, declared with attribute warn_unused_result ../../cu_inifile/cu_inifile.c:1441: warning: ignoring return value of ‘strtod’, declared with attribute warn_unused_result
Mir ist klar, was sie heißt, aber ich verwende an genau diese Stellen strtoull, um zu überprüfen, ob der gelesene Wert überhaupt ein int64 ist oder nicht (der Wert ist mir an der Stelle egal, denn eine andere Baustelle kümmert sich um die Evaluation. Es geht im prinzip um eine Funktion der Art
bool inifile_keyval_is_integer(inifile *ini) { char *error; strtoull(ini->str, &error, 0); return *error ? false : true; }
Gibt es eine Möglchkeit diese Warnung für diesen einen Aufruf unterzudrücken? Bis jetzt kriege ich sie weg nur wenn ich sowas machen
bool inifile_keyval_is_integer(inifile *ini) { unsigned long long int ignore_warning; char *error; ignore_warning = strtoull(ini->str, &error, 0); ignore_warning++; return *error ? false : true; }
das finde aber blöd.
Übrigend, ich verwende den GNU GCC
$ gcc --version gcc (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Danke
-
supertux schrieb:
... das finde aber blöd.
Ja, das ist blöd. Du musst aber den Rückgabewert der Funktion prüfen, damit der Code sauber wird, und auch den Zeiger error... Da geht kein Weg vorbei.
Ich sehe in der Funktion, nur weil ich QAC-Checker geschädigt bin, ein Paar mögliche Warnungen:
1. Zwei mal nicht initialisierte Variablen.
2. Zeiger error ist möglicherweise NULL.
3. Variable wird geschrieben, aber nie gelesen.
4. ?: sind nicht erlaubt.
5. ini sollte "inifile * const ini" sein.
-
abc.w schrieb:
Ja, das ist blöd. Du musst aber den Rückgabewert der Funktion prüfen, damit der Code sauber wird, und auch den Zeiger error...
richtig, bei einer Funktion wie 'fwrite' muss man wirklich schauen, ob die Funktion richtig gearbeitet hat. Aber nicht bei strtoull, da habe ich einen Fall, bei dem mir der Rückgabewert wirklich sowas von egal ist. Also, ich finde, dass strtoull nicht mit dem warn_unused_result Attribut deklariert werden müsste.
abc.w schrieb:
1. Zwei mal nicht initialisierte Variablen.
2. Zeiger error ist möglicherweise NULL.
3. Variable wird geschrieben, aber nie gelesen.
4. ?: sind nicht erlaubt.
5. ini sollte "inifile * const ini" sein.
1. je nach gcc Version, wird sie sicherlich meckern. Ein
char *error = NULL
oderchar *error = "error"
wäre schon besser, aber das geht meiner Meinung nach zu weit, denn strtoull garantiert, das zweite Parameter auf das erste nicht erlaubte Zeichen zu setzen bzw. auf \0, wenn alles gut lief.2. nein, siehe 1.
3. welche denn?
4. Wieso denn das?
5. naja, drüber kann man sich streiten, genaugenommen müsste es
const inifile * const ini
aber das geht mir wieder zu weit, weil es offensichtlich ist.
-
Ich habe die Warnungen der statischen Codeanalyse gemeint.
supertux schrieb:
3. welche denn?
Die "workaround" Variable
ignore_warning
.supertux schrieb:
4. Wieso denn das?
MISRA Regel, glaube ich.
supertux schrieb:
5. naja, drüber kann man sich streiten, genaugenommen müsste es
const inifile * const ini
aber das geht mir wieder zu weit, weil es offensichtlich ist.Ich bin für
const inifile * const ini
-
Geht
(void)strtoull(ini->str, &error, 0);
nicht?
so hat man das zumindest bei lint gemacht.
-
rüdiger schrieb:
Geht
(void)strtoull(ini->str, &error, 0);
nicht?
so hat man das zumindest bei lint gemacht.
nein, das hat leider auch nichts gebracht