Statische Codekontrolle

Nicht (nur) statisch:

PC-Lint erkennt auch das:

  int bar[10], i;
  for(i = 0; i <= 10; ++i){
     bar[i] = i;
  }

Probleme mit char-Konstanten bei Splint:

 unsigned char n;
 n = 1; // "Assignment of int to unsigned char"

Ein cast verringert die Sicherheit, weil dann Überläufe nirgendwo mehr erkannt werden. +charint schaltet alle int->char Tests ab.

Wie ist das mit den proprietären Erweiterungen der Embedded-Compiler (Cosmic, Hi-Tech)?

Besonders unangenehm ist #pragma asm / endasm, weil der Splint-Parser mit dem Assemblerteil nicht fertig wird. Das müßte man auslagern.

Dann gibt es noch vielfach Modifier it einem "@", die der Splint-Parser ebenfalls nicht verdaut, z.B. für Variablen mit absolute Adressen (um Ports usw. zu definieren):

volatile unsigned char PORTA @0x12;

kann man auch so schreiben:

#define PORTA *(char *) 0x12

bzw. mit einem Makro:

#define placed_variable(Type, Address) (*(Type *)(Address))

aber das gibt keinen Eintrag in der Symboltabelle. Man kann die Definition aber in eine anderes Modul packen (globale Variable).

Dann weiß der Compiler aber nicht, daß das in der Zero Page liegt. Da kann man bei Cosmic aber nachhelfen:

#pragma space extern [] @tiny

Naja, viel kompatibler wird das nicht. Eleganter wäre etwas wie

#pragma place(PORTA,0x12)
volatile unsigned char PORTA;

Qualifier für Funktionen: @interrupt und ggf. @nostack @packed muß man für einen sturen Lint immer in defines verpacken.


KategorieProgrammieren