- LiTime Speicher und Akkus         
Ergebnis 1 bis 5 von 5

Thema: WARNING: array subscript is above array bounds [-Warray-bounds]

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78

    WARNING: array subscript is above array bounds [-Warray-bounds]

    Anzeige

    Powerstation Test
    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
    Code:
    	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
    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Nik,
    Zitat Zitat von Liquidator Beitrag anzeigen
    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)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78
    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 )

    Grüße,
    Nik

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    16.04.2011
    Beiträge
    78
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Liquidator Beitrag anzeigen
    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
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. LED Array
    Von filth im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 09.12.2008, 13:06
  2. Array
    Von infection im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 26.05.2008, 22:47
  3. Array auf zweidimensionale Array
    Von semicolon im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 25.05.2007, 13:48
  4. Nur Nummern in Array / nur Variablentyp byte als Array?
    Von Crashmichl im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 28.04.2006, 00:15
  5. array verlauf auf lcd..
    Von xlostx im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 18.03.2006, 15:33

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus