Array OOB zur Laufzeit ermitteln

Gast #4700063
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.