mikrocontroller.net

Forum: Compiler & IDEs Array OOB zur Laufzeit ermitteln


Autor: Klaus Hase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

gibt es eine Möglichkeit (dynamische Codeanalyse o.ä.) einen 
Array-OOB-Fehler automatisiert zur Laufzeit auszugeben? Ich denke hier 
an die Debug-Version und eine Fehlerausgabe lokal auf dem Rechner. Wenn 
ich bspw. so etwas hier anlege:
static uint16_t MyMap[MAX_ENTRIES]

ist die Größe schon zur Compilerzeit bekannt. Jeder Aufruf im Stile von 
MyMap[i] kann so einfach überprüft werden. Geht so etwas automatisiert 
mit einem Tool?

Autor: Mac (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Sowas gibt es schon, das hängt aber vom Compiler und seiner Version ab. 
Aktuelle Versonen von GCC und CLANG z.B. haben eine Reihe von 
-fsanitize=<option> Optionen mit denen man Laufzeitüberprüfungen 
einschalten kann. Beispiel:
$ cat b.c 
int main()
{
  int k[10]={0}; 
  int s=0; 
  int i=0; 
  for (i=0;i<=10;i++) s+=k[i]; 
  return s;
}
$ clang -fsanitize=bounds b.c
$ ./a.out 
b.c:6:25: runtime error: index 10 out of bounds for type 'int [10]'

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternativ gibt es noch valgrind.

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Alternativ gibt es noch valgrind.

Der kann OOB aber nicht bei statischen Arrays, sondern nur mit 
malloc-alloziertem Speicher, sofern ich das recht erinnere.

GCC-sanitiser geht auch für statische Arrays, habe ich schon getestet. 
Allerdings ausschließlich unter Linux. Unter Windows gibt es zwar 
Cygwin/GCC, das unterstützt dieses Feature aber nicht. Also als 
Windowsnutzer mal eben eine Live-Distri reinbooten, die einen aktuellen 
GCC mitbringt.

Zusätzlich gibt es zur statischen Codeanalyse noch CppCheck, was solche 
Fehler MANCHMAL auch finden kann.

Autor: Klaus Hase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort. Genau das ist eben auch das Problem: ich 
entwickele unter Windows und cppCheck läuft hinten dran auf einem 
Jenkins. Leider tritt genau das auf was du sagst Nop: er erkennt diese 
Fehler leider nicht zuverlässig. Auf die Idee mit der Linux Distribution 
bin ich noch gar nicht gekommen. Danke für den Tipp.

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.