PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WARNING: array subscript is above array bounds [-Warray-bounds]



Liquidator
20.04.2016, 01:07
Hallo liebe Gemeinde,

ich bin jetzt auch mal in der Gegenwart angekommen und bin derzeit dabei, meine Projekte in das AtmelStudio zu portieren.
Es gab anfangs ein Paar unverständliche Meldungen und Fehler, aber nach etwas Meditation (und Kaffee) konnte ich das Meiste lösen.

Jetzt zum eigentlichen Thema: Während einiger Projekte ist mir die titelgebende Compilerzeile ausgespuckt worden. Es war kein "Error", sondern ein "Warning", da das Programm kompilliert wurde und auch vollständig funktionierte (so wie auch vorher).
Mir ist aufgefallen, dass diese Warnung kommt, wenn ich bei einer Array-Bearbeitung/-Ausgabe mit den Parameterangaben spiele.
Beispiele:

1. In einer Bedingung

if ((!RetFct)&&(module==CD_MOD)&&
(cdFreq_x10[module][channel-1]\
- cdStepFreq_x10[module][channel-1]\
< cdMinMaxFreq_x10[filterType][1][channel-1]))
{

}



2. Bei einer schrittweise-Inkrementierung


cdFreq_x100[mod][filterType] += cdStepFreq_x100[mod][filterType];


Wie gesagt, der Code lief einwandfrei und tut es auch mit AtmelStudio. Weshalb nun der Fehler/Warnung?
Die Parameter sind ganzzahlig, überschreiten niemals die vorgegebenen Grenzen...

Grüße,
Nik

Peter(TOO)
20.04.2016, 05:50
Hallo Nik,

Wie gesagt, der Code lief einwandfrei und tut es auch mit AtmelStudio. Weshalb nun der Fehler/Warnung?
Die Parameter sind ganzzahlig, überschreiten niemals die vorgegebenen Grenzen...
Nun, es ist eine Warnung!

Der Compiler will dir nur mitteilen, dass hier etwas schief gehen könnte, zumindest fehlen dem Compiler die Angaben um garantieren zu können, dass der Code nicht versucht auf Bereiche ausserhalb des Array zuzugreifen.

Das ist halt der "Fluch" der immer intelligenteren Compiler.
Ganz früher gab es eigentlich gar keine Warnungen des Compiler und man hatte oft tagelang einen Bug gesucht, welcher dann z.B. nur in der Zuweisung an einen kleineren Datentyp bestand :-( Es gab damals ein Zusatzprogramm, namens "lint", welches recht penibel solche, nicht explizit gecasteten, Zuweisungen aufgezeigt hat. Heute ist die Entsprechung von lint in jedem Compiler implementiert und wurde natürlich auch weiter entwickelt.

Das Überschreiten von Array-Grenzen ist ein typisches Problem von C, wie das verwenden von nicht initialisierten Zeigern. Solche Bugs zerschiessen dann gerne den Stack (Auto Variablen), überschreiben ganz andere Variablen oder können sogar Fehler in einem ganz anderen Task erzeugen. Da kann man dann tagelang den Bug suchen.

Du kannst natürlich einfach die entsprechende Warnung im Compiler abschalten :-(

Ich bevorzuge die Methode, die Warnung nur für die entsprechende Funktion, oder nur Zeile, abzuschalten (#pragma).
Damit dokumentiert man, dass man sich diese Stelle angesehen hat und die nicht ganz saubere Programmierung so gewollt ist.

An anderer Stelle im Code wird dann weiterhin die Warnung angezeigt, wenn d etwas nicht sauber ist.

MfG Peter(TOO)

Liquidator
20.04.2016, 21:45
Hallo Peter,

ich dachte auch an den überintelligenten Compiler, was mich lediglich verwirrte war die Tatsache, dass diese Warnung auch nach dem Einfügen einer Untersuchung der Arrayparameter auf ihre erlaubten Grenzen hin fortbestand.
Man darf das also eher als einen Hinweis als eine Warnung verstehen...

Mal schauen, zu was für Erleuchtungen man während der Bekanntschaft mit AtmelStudio noch so kommt :)
Ich danke für die Info (evtl. melde ich mich nochmal zu Wort in diesem Thread :D )

Grüße,
Nik

Liquidator
04.05.2016, 13:45
Eine knappe Ergänzung zu der ganzen Geschichte:

Auch nachdem ich eine Abfrage eingefügt habe im Hinblick auf Überprüfung der Array-Parameter und ihrer maximalen Grenzen, hat der Compiler trotzdem rumgemeckert. Und dann ist mir an einer Stelle aufgefallen, dass ich dort das '\0' -Endzeichen manuell gesetzt habe. Und das war der Grund wieso er eigentlich rumgemeckert hat!
Aus irgendeinem Grund hat der Compiler wohl gemeint, ich schreibe ihm in den unerlaubten Bereich was rein. Ist mir bisher nicht passiert, auch in anderen Programmen mit der manuellen Setzung des Zeichens, aber naja...
Eigentlich war der Schritt auch überflüssig (falsch jedoch nicht).

Auf jeden Fall ist die Warnung endgültig weg *das Programm funktioniert nach wie vor, yay*

Grüße,
Nik

Klebwax
04.05.2016, 15:39
Auch nachdem ich eine Abfrage eingefügt habe im Hinblick auf Überprüfung der Array-Parameter und ihrer maximalen Grenzen, hat der Compiler trotzdem rumgemeckert.
Der Compiler überprüft die Sinnhaftigkeit deiner Rechnungen nicht. Im ist egal, ob die Arraygrenzen überprüfst.

Und dann ist mir an einer Stelle aufgefallen, dass ich dort das '\0' -Endzeichen manuell gesetzt habe. Und das war der Grund wieso er eigentlich rumgemeckert hat!
Hat der Compiler denn keine Zeilennummer zur Warnung angegeben? Diese heiß, wie du schreibst "WARNING: array subscript is above array bounds" und nicht könnte oder so. Und da wirst du auch hinten aus deinem Array hinausgeraten sein. Ist so der Standardfehler in C:

char text[20];
text[20] = '\0';


Aus irgendeinem Grund hat der Compiler wohl gemeint, ich schreibe ihm in den unerlaubten Bereich was rein.
Unerlaubt ist das nicht, dann wäre es ein Error und das Programm würde nicht Compilieren.


Eigentlich war der Schritt auch überflüssig (falsch jedoch nicht).

Zeig mal die relevante Codestelle incl der Arraydeklaration. Da wird schon was falsch sein. Geh mal einfach davon aus, daß der Compiler die Sprache viel besser als du kennt. Und das ein Programm trotzdem oft funktioniert ist normal.

MfG Klebwax