Forum: Compiler & IDEs warning: array subscript is above array bounds


von J. V. (janvi)


Lesenswert?

mein GCC bringt obenstehende Warnung, wenn bei einem Feld (bereits im 
statischen Quellcode) der Index zu groß wird. Dabei warnt er, wenn der 
Indexzahl größer als die Arraygröße wird. Eigentlich müsste er doch 
schon bei Indexzahl gleich Arraygröße warnen, weil das Nullte Element ja 
das erste im Array ist und somit Arraygröße -1 das letze Element angibt 
?

von DerAlbi (Gast)


Lesenswert?

Da du keinen Quelltext lieferst, ist es schewr eine aussage zu machen.
Es kann sein dass der Compiler sein eigneen Aliasing berücksichtigt und 
z.B. erkennt, dass, wenn du ein CharArray[5] anlegst, bei 32bit 
ausrichtung der Index CharArray[7] sogar noch gültig ist, auch wenn er 
über den Arraygrenzen liegt. (die nächste variable würde ja erst bei 
CharArray[8] beginnen)

Ist aber nur vermutung.

MFG

von Hc Z. (mizch)


Lesenswert?

> Da du keinen Quelltext lieferst, ist es schewr eine aussage zu machen.

So ist es.

> Es kann sein dass der Compiler sein eigneen Aliasing

... Alignment ...

>berücksichtigt und
> z.B. erkennt, dass, wenn du ein CharArray[5] anlegst, bei 32bit
> ausrichtung der Index CharArray[7] sogar noch gültig ist,

Nein.  Nach Standard verursacht das "Undefined behaviour".  In realen 
Implementationen mag das meist hinhauen, aber "gültig" ist es deshalb 
noch lange nicht.

von der mechatroniker (Gast)


Lesenswert?

Andere Idee:

Nach Standard ist der Pointerwert a+8 bei einem als T a[8] definierten 
Array noch definiert (bedeutet, man kann ne for-Schleife übers Array 
machen und die Abbruchbedingung aus dem laufenden Pointer selbst 
ableiten). Man darf ihn nur nicht dereferenzieren.

a+9 ist dagegen undefined (also auch das Ergebnis der Pointerarithmetik 
selbst; hier kann, je nach Lage von a im Speicher ein Wraparound über 
das Adressraumende oder ein Segmentende auf Plattformen mit 
segmentiertem Speicher stattgefunden haben, so dass ein Vergleich oder 
eine Pointerdifferenz nachher Unsinn liefert).

Kann sein, dass gcc deswegen bei der Warnung genau so prüft, auch, wenn 
es hier nicht genau passt (da je dereferenziert wird).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.