www.mikrocontroller.net

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


Autor: J. V. (janvi)
Datum:

Bewertung
0 lesenswert
nicht 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 
?

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.