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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren