Array OOB zur Laufzeit ermitteln

Gast #4700063
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:
1
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?
Gast #4700091
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:
1
$ cat b.c 
2
int main()
3
{
4
  int k[10]={0}; 
5
  int s=0; 
6
  int i=0; 
7
  for (i=0;i<=10;i++) s+=k[i]; 
8
  return s;
9
}
10
$ clang -fsanitize=bounds b.c
11
$ ./a.out 
12
b.c:6:25: runtime error: index 10 out of bounds for type 'int [10]'
Gast #4700154
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.
Gast #4700373
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.