Oliver S. schrieb:
> „Die anderen“ sind bei der Warnung auch nicht ganz fehlerfrei. Das
> verhindern von false positives scheint nicht so trivial zu sein.
Ob eine Variable initialisiert ist oder nicht, ist nicht allgemein
entscheidbar. g++ und clang gehen mit diesem Problem auf verschiedene
Weise um:
g++ sagt "‘<variable>' may be used uninitialized", wenn er trotz
durchgeführter Kontrolflussanalyse sich nicht absolut sicher ist, dass
die Variable initialisiert ist. Das ist insbesondere dann der Fall, wenn
die Initialisierung der Variable fehlt und eine Zuweisung nur bedingt
erfolgt. Er verwendet das Wörtchen "may", um auf seine Unsicherheit
hinzuweisen.
clang++ sagt "'<variable>' is uninitialized when used here", wenn er
sich absolut sicher ist, dass die Variable uninitialisiert ist. Das ist
immer dann der Fall, wenn die Initialisierung der Variable fehlt und
keine Zuweisung (auch keine bedingte) vor der ersten Lesezugriff
erfolgt. Dadurch kann es allerdings passieren, dass bei einer
tatsächlich uninitialisierten Variable die Warnung ausbleibt.
Da er MS-Compiler mitunter auch dann warnt, wenn selbst ohne großartige
Kontrolflussanalyse offensichtlich ist, dass die Variable initialisiert
ist, wäre er gut beraten, seine Warnung "Using uninitialized memory
'<variable>' etwas weniger strikt (bspw. mit einem "Possibly" davor) zu
formulieren ;-)