Forum: Compiler & IDEs Array OOB zur Laufzeit ermitteln


von Klaus Hase (Gast)


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?

von Mac (Gast)


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]'

von Dr. Sommer (Gast)


Lesenswert?

Alternativ gibt es noch valgrind.

von Nop (Gast)


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.

von Klaus Hase (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.