Verifikation von C-Programmen
Vorlesung 2 vom 30.10.2014: Der C-Standard: Typkonversionen und Programmausführung
Christoph Lüth
Universität Bremen
Wintersemester 2014/15
Rev. –revision– 1 [1]
Fahrplan heute
ITypkonversionen (Typwechsel ohne Anmeldung)
IFelder vs. Zeiger — Das C-Speichermodell
IZeiger in C:
I Dynamische Datenstrukturen
I Arrays
I Funktionen höherer Ordnung
2 [1]
Verschiedene Typen im Standard
IObjecttypes,incompletetypes,functiontypes (§6.2.5)
IBasictypes: standard/extended signed/unsigned integer types, floating types (§6.2.5)
IDerivedtypes: structure, union, array, function types IQualifiedType (§6.2.5)
Ifloat const *qualified (qualified pointer to type)
Iconst float *notqualified (pointer to qualified type)
ICompatibleTypes (§6.2.7)
IAssignable Types (§6.5.16, §6.5.2.2)
3 [1]
Typkonversionen in C
IInteger promotion (§6.3.1.1):
I char,enum,unsigned char,short,unsigned short,bitfield
Ifloatpromoted todouble
IT []promoted toT *
IUsual arithmetic conversions (§6.3.1.8)
IKonversion von Funktionsargumenten:
I Nurbei K&R-artigen Deklarationen,nichtbei Prototypen!
I Moral:Stil bei Prototyp und Definition nichtmischen!
4 [1]
Zeiger und Felder
IZeigersind Adressen i n t ∗x ;
IFeld: reserviert Speicherbereich fürnObjekte:
i n t y [ 1 0 0 ] ;
IIndex beginntimmermit 0
IMehrdimensionale Felder . . . möglich IAber:x6∼y
5 [1]
Wann sind Felder Zeiger?
IWann kann einArrayin einZeigerkonvertiert werden?
ExterneDeklaration:extern char a[] KeineKonversion Definition:char a [10] KeineKonversion Funktionsparameter:f(char a[]) Konversionmöglich In einemAusdruck:x= a[3] Konversionmöglich
IWenn Konversionmöglich, dann durch Semantikerzwungen
ITückisch: Externe Deklaration vs. Definition
IGröße:sizeof
6 [1]
Mehrdimensionale Felder
IDeklaration:int foo[2][3][5];
IBenutzung:foo[i][j][k];
IStored inRow major order(Letzter Index variiert am schnellsten) (§6.5.2.1)
IKompatible Typen:
Iint (* p)[3][5] = foo;
Iint (*r)[5]= foo[1];
Iint *t = foo[1][2];
Iint u = foo[1][2][3];
7 [1]
Mehrdimensionale Felder als Funktionsparameter
IRegel 3 giltnichtrekursiv:
I Array of ArraysistArray of Pointers, nichtPointer to Pointer
IMögliches Matching:
Parameter Argument
char (*c)[10]; char c[8][10]; char (*c)[10];
char **c; char *c[10]; char **c;
char c[][10]; char c[8][10]; char (*c)[10];
If(int x[][]);nicht erlaubt
(§6.7.5.2)
I NB. Warum istint main(int argc, char *argv[])erlaubt?
8 [1]
Mehrdimensionale Felder als Funktionsparameter
IRegel 3 giltnichtrekursiv:
IArray of ArraysistArray of Pointers, nichtPointer to Pointer
IMögliches Matching:
Parameter Argument
char (*c)[10]; char c[8][10]; char (*c)[10];
char **c; char *c[10]; char **c;
char c[][10]; char c[8][10]; char (*c)[10];
If(int x[][]);nicht erlaubt (§6.7.5.2)
INB. Warum istint main(int argc, char *argv[])erlaubt?
8 [1]
Programmausführung (§5.1.2.3)
IStandard definiertabstrakte Semantik
IImplementation darfoptimieren
ISeiteneffekte:
I Zugriff aufvolatileObjekte;
I Veränderung von Objekten;
I Veränderung von Dateien;
I Funktionsaufruf mit Seiteneffekten.
IReihenfolge der Seiteneffektenicht festgelegt!
ISequenzpunkten(Annex C) sequentialisieren Seiteneffekte.
9 [1]
Semantik: Statements
IFull statement, Block §6.8
IIteration §6.8.5
10 [1]
Semantik: Speichermodell
IDer Speicher besteht ausObjekten
Ilvalue§6.3.2.1:Expression with object type or incomplete type other thanvoid
Ilvalues sindReferenzen, keineAdressen
IWerdenausgelesen, außer
I als Operand von&,++,–,sizeof
I als Linker Operand von.und Zuweisung
I lvalue (has) array tyoe IWoher kommen lvalues?
I Deklarationen
I Indirektion (*)
I malloc IAdressen:
I Adressoperator (&)
I Zeigerarithmetik (§6.5.6)
11 [1]
Ausdrücke (in Auszügen)
IEinfache Bezeichner: lvalue
IBezeichner von Array-Typ: Zeiger auf das erste Element des Feldes (§6.3.2.1)
IFelder:6.5.2.1
Ia[i]definiertals*((a)+(i))
IDamit:a[i]=*((a)+(i))=*((i)+(a))=i[a]
IZuweisung:6.5.16
IReihenfolge der Auswerung nicht spezifiziert!
12 [1]
Funktionsaufrufe §6.5.2.2
IImplizite Konversionen:
I Nur wenn kein Prototyp
I Integer Promotions,floattodouble
IArgumente werden ausgewertet, und den Parametern zugewiesen
I Funktionsparameter sind wie lokale Variablen mit wechselnder Initialisierung
IReihenfolge der Auswertung von Funktionausdruck und Argumenten nicht spezifiziert, aber Sequenzpunkt vor Aufruf.
13 [1]
Zusammenfassung
ITypkonversionenin C: meist klar, manchmal überraschend
IAuswertungdurch eineabstrakte Maschinedefiniert
ISpeichermodell:
ISpeicher besteht ausObjekten
IDurchcharaddressiert (byte)
IReferenzen auf Objekte:lvalue
14 [1]