Home

Entwicklung eines Programms zur automatischen Analyse

image

Contents

1. A N L Start i gt G i Y generiere Code in rbCEval_0 c rbCEval_5 c b wiederhole b Y bis ein wiederhole Build Prozess Ergebnis fiir jeden gefunden ist dynamischen Test y SC Schreibe das Ergebnis in N nur f r Bezeichner compResult txt i gt Y kopiere vordefinierte Funktion nach rbCEval_0 c y erzeuge rbCEval_4 c in der die 3 vordefinierte Funktion aufgerufen wird wiederhole f r jede vordefinierte y Funktion elen Build Prozess u u existiert ST rer schreibe eine Fehlermeldung in compResult txt a a generiere dynamischen Quellcode erzeuge Maschinencode f r Yy den Programmlauf kopiere vordefinierte Funktionen y Build Prozess A h d schreibe eine Fehlermeldung in lt lt existiert roCEval_compile txt _ nein 0 u compResult txt Abbildung 5 6 Ablaufdiagramm runl pl 71 Kapitel 5 Implementierung run2 pl run3 pl Die Untersuchungen von Modulo durch Null und der Division durch Null k nnen zu Programmabst rzen f hren Deshalb m ssen sie getrennt durchgef hrt werden run2 pl run3 pl So wird sicher gestellt dass die anderen Analysen davon nicht betroffen sind run4 pl Die Analyse des Inhalts von Makros wird aus zwei Gr nden separat in run4 pl durchgef hrt 1 Je nach An
2. Evaluation Date 2007 09 10 Date 2007 09 10 Compilescript TestEnvBuild bat lt gt Compilescript freescale bat Identifier Identifier The maximum length for an external identifier is 254 characters test lt gt The maximum length for an external identifier is 1023 characters tes ed up to 1023 ted up to 1023 External identifiers are case sensitive External identifiers are case sensitive Macro names can have a length of 1023 tested up to 1023 Macro names can have a length of 1023 tested up to 1023 Negative Representation is Negative Representation is two s complement two s complement Right shift is done Right shift is done arithmetic dependent on sign arithmetic dependent on sign Endianess Endianess big endian byte order high byte first e g 4 3 2 1 big endian byte order high byte first e g 4 3 2 1 Number of Bits in one Byte char 8 Number of Bits in one Byte char 8 Plain char is interpreted as Plain char is interpreted as unsigned char lt gt signed char The character set of the execution environment is ASCII The complete ASCII set is usable extended ASCII Standard charset for preprocessing is implemented in ASCII C style comments are accepted comment The various types have the following size in bits void Char not known 8 The character set of the execution environment is ASCII Th
3. 25 normaler Code Da aber auch hier in den meisten F llen der ASCII Zeichensatz verwendet wird gen gt dessen berpr fung und eine Warnung an den Anwender falls dies nicht der Fall sein sollte Der Standard sieht die Pr prozessoranweisung pragma f r compilerspezifische Befehle und Anweisungen vor Ob und welche Anweisungen ein Hersteller f r seinen Compiler vorsieht kann allgemein nicht gesagt werden und wird deshalb nicht weiter behandelt Der Anwender muss in diesem Fall auf das Handbuch des Compilers zur ckgreifen Auch die restlichen implementationsabh ngigen Pr prozessoranweisungen sind f r diese Analyse nicht weiter interessant oder k nnen nicht gepr ft werden beispielsweise die Me thode zum Auffinden von eingebundenen Quelldateien eingebunden ber include und ob diese auch in Anf hrungsstrichen stehen k nnen Hierbei handelt es sich um Eigenschaf ten des Entwicklungssystems Es wird vorausgesetzt dass der Compiler beides vern nftig implementiert hat 3 1 14 Library functions Laut dem Standard C90 sind f r freistehende Umgebungen freestanding environments also Umgebungen in denen sich das Entwicklungssystem vom ausf hrenden System un terscheidet alle Bibliotheksfunktionen implementationsabh ngig Aus diesem Grund wird es bei Bosch weitestgehend vermieden vordefinierte Bibliotheken zu verwenden Es w rde au erdem den Rahmen dieser Arbeit sprengen alle im Standard vorgegebenen Funktione
4. 108 Anhang CECR Evaluation Date 2007 09 10 Compilescript TestEnvBuild bat Identifier The maximum length for an external identifier is 254 characters tested up to 1023 External identifiers are case sensitive Macro names can have a length of 1023 tested up to 1023 Negative Representation is two s complement Right shift is done arithmetic dependent on sign Endianess big endian byte order high byte first e g 4 3 2 1 Number of Bits in one Byte char 8 Plain char is interpreted as unsigned char The character set of the execution environment is ASCII The complete ASCII set is usable extended ASCII Standard charset for preprocessing is implemented in ASCII C style comments comment are accepted The various types have the following size in bits void not known char 8 wchar 16 short 16 int 16 long 32 longlong not defined float 32 double 64 longdouble 64 sizeof 16 pointer 16 pointerDiff 16 functionPointer 16 There is an integerdatatype with more than 32 bits The various types have the following alignment char 1 short 1 int 1 109 Anhang Long 1 longlong not defined float 1 double 1 longdouble 1 pointer 1 functionPointer 1 Enumerations size in bytes and signedness 1 signed 0 unsigned type size sign sizeof a a b c 1 0 2 a 1 b SE 2 a 128 b c 1 o 2 a 1 b 128
5. 18 verschiebe das Bit um 1 Byte x 19 endian_u var_l lt 8 20 Es wird ein union endian_u erzeugt das ein char sizeof long array_c und ein long var_1 enth lt Laut Definition eines union C90 berlappen sich die Speicherbe 50 Kapitel 5 Implementierung reiche von array_c und var 1 genau Wird nun ein Bit von einem Byte der 1ong Variable var_l zum n chsten geschoben Zeile 19 und verglichen in welchem der Elemente des char Arrays es sich dann befindet Zeile 14 17 erh lt man die interne Anordnung der Bytes Am Ende enth lt das Array order_c die Kombination 1 2 3 4 f r Little Endian und 4 3 2 1 f r Big Endian 5 2 2 10 Bitfelder Referenz Bei Bitfeldern werden die folgenden Punkte untersucht 1 Abh ngigkeit der Gr e von den genutzten Bits 2 Anordnung der einzelnen Bits 3 Alignment Verwendung von F llbits 4 Signedness von einfachen int Bitfeldern und signed int Bitfeldern 5 Datentypen von Bitfeldern Die Erkl rungen beziehen sich auf ein System in dem int 16 Bit gro ist Sie sind aber auch f r andere Systeme anwendbar Die Analysen finden mit Hilfe von Strukturen und Unions statt Gr e Ob die Gr e eines Bitfeldes von den genutzten Bits abh ngt wird gepr ft indem ein Bitfeld mit nur einem Bit erzeugt wird Ist dessen mit sizeof Bitfeld ermittelte Gr e kleiner als die Gr e eines int optimiert der Compiler die Gr e automatisch Anordung Mit einem w
6. 3 int var_i 4 char varl c 5 intern_str 6 char var2_c 7 test_str Ist die Differenz der Adressen der beiden char Elemente gr er als 1 wird ein Fiillbyte verwendet Dies wird in der folgenden Abbildung 5 1 veranschaulicht 49 Kapitel 5 Implementierung wer IN 0x00F0 0x00F1 vari intern_str lt Ox00F1 0x00F2 var cl var_c1 0x00F2 Ox00F3 F llbyte gt test_str var_c2 Ox00F3 0x00F4 yar c2 0x00F4 Ox00F5 F llbyte J 0x00F5 Abbildung 5 1 F llbyte am Ende von Strukturen 5 2 2 9 Endianess Referenz 3 1 9 Mit Hilfe von Unions und Arrays kann die Anordnung der Bytes von gro en Datentypen berpr ft werden Da der Datentyp char immer ein Alignment von 1 hat gibt es keine F llbytes Somit bildet ein char Array den internen Speicher Byte f r Byte ab Wird nun ein char Array mit einer Variable vom Datentyp long kombiniert l sst sich die interne Verteilung der Bytes in einem long herausfinden wie das folgende Beispiel zeigt union 2 char array_c sizeof long 3 long var 4 endian_u 5 Array zum speichern der Byteanordnung 6 char order c sizeof long 7 int i j s Aa setze das erste Bit 9 endian_u var_l 1 10 u for i 0 i lt sizeof long i 12 order_c i 0 13 suche das Byte in dem das Bit gesetzt wurde 14 for j 0 j lt sizeof long j 4 15 if endian_u array_c j 1 16 order_c iJ j 1 17
7. 3 result_i 1 a if 9 5 lt 0 5 result_i 2 6 if 9 5 lt 0 7 result_i 4 Die Variable result_i hat danach einen Wert von 0 bis 7 so dass alle acht M glichkeiten abgedeckt sind Das Gleiche wird in hnlicher Form f r den Pr prozessor durchgef hrt Division und Modulo mit Null Viele Compiler fangen eine Division durch eine Nullkonstante direkt ab x 3 0 Das hei t es werden f r beide Operationen zwei Tests durchgef hrt Einerseits ob der Compi ler eine ung ltige Operation mit einer Nullkonstante erkennt und einen Fehler ausgibt und andererseits wie sich das Programm zur Laufzeit verh lt Die Untersuchung w hrend des Programmablaufs kann nicht ber eine Konstante erfolgen Hier wird eine mit volatile deklarierte Variable auf Null gesetzt und durch diese dividiert Die Angabe von volatile zeigt dem Compiler dass sich die Variable ohne Einfluss der Software ndern kann und deshalb nicht wegoptimiert werden darf Wegen der Gefahr eines Programmsabsturzes m ssen diese Tests getrennt von den anderen stattfinden da ein Absturz auch Auswir kungen auf deren Ergebnisse haben k nnte Dies ist einer der Gr nde warum mehrere Programml ufe n tig sind 5 2 2 6 Bitverschiebung Referenz 3 1 5 Um herauszufinden ob eine Bitverschiebung nach rechts bei signed Werten arithmetisch oder logisch stattfindet wird wie in beschrieben eine signed int Variable mit 1 47 Kapitel 5 Implementierun
8. 88 100 108 Kapitel 1 Einleitung Das American National Standards Institute ANSI hat 1989 auf Grund der schon da mals weiten Verbreitung der Programmiersprache C eine Standardisierung vorgenonmmen Dieser als ANSI C bekannte Standard wurde 1990 mit kleineren nderungen als interna tionaler Standard ISO IECH 9899 15090 festgelegt Der Inhalt der beiden Standards ist identisch nur der Aufbau unterscheidet sich Wik07b MIS04 Er wurde 1993 original getreu in die europ ische Norm EN 29899 bernommen Im weiteren Verlauf wird der Einfachheit halber die allgemein bekannte Abk rzung C90 f r diesen Standard verwen det Zu dieser ersten Version gab es 1993 einen Zusatz 1999 wurde der Standard komplett berarbeitet und in der neuen Version ISO IEC 9899 1999 ISO99 herausgebracht folgend als C99 bezeichnet Auch wenn der C90 Standard schon mehr als 15 Jahre alt ist wird er im Bereich von eingebetteten Systemen immer noch anstatt des neueren C99 angewandt 1 1 Motivation Als der gr te Automobilzulieferer der Welt setzt die Firma Bosch in vielen Systemen elektronische Steuerger te ein in die Mikroprozessoren eingebettet sind Je nach Anwen dung werden unterschiedliche Prozessoren eingesetzt Obwohl die Steuerger te in ihrer Funktionalit t v llig unterschiedlich sein k nnen sind viele Grundfunktionen der verwen deten Prozessoren gleich oder hnlich sodass sich auch die Software f r diese Funktionen hnelt Aus
9. Bitverschiebung Im letzten Punkt des Integerabschnitts geht es um die Bitverschiebung Auch hier handelt es sich nur um das Verhalten bei signed Werten Die Frage ist ob bei einer Rechtsver schiebung die Bits immer mit 0 oder mit dem Inhalt des h chstwertigen Bits aufgef llt werden In diesem Zusammenhang wird auch von einer logischen Verschiebung bzw einer arithmetischen Verschiebung gesprochen 1 signed int a 1l 2a a gt gt l Ob a nun immer noch 1 ist oder 32767 liegt am Compiler Wie schon erw hnt wird das allgemein bliche Zweierkomplement vorausgesetzt und int ist in diesem Fall 16 Bit gro arithmetisch 0 A aaa 1 1 logisch Abbildung 3 1 Rechtsverschiebung bei signed Werten 3 1 6 Floating point Auch bei den drei Gleitkommatypen float double und long double ist nur eine Min destgr e angegeben IS090 6 1 2 5 Hier ist neben der Gr e aber auch die maximale Genauigkeit interessant Zurzeit werden Gleitkommazahlen eher selten in Steuerger ten eingesetzt da f r deren Berechnungen zu viel Zeit ben tigt wird und deren Verwendung das Einbinden gr erer Bibliotheks Funktionen beinhaltet Dies wird sich aber mit neu en leistungsf higeren Mikroprozessoren und neuen Anforderungen ndern Deshalb ist es interessant die Genauigkeit und Gr e der einzelnen Typen zu kennen Im Gegensatz zur internen Darstellung von Integer Typen ist die Darstellung der drei
10. The era for the clock function 7 12 2 1 G 4 Locale specific behavior The following characteristics of a hosted environment are locale specific The content of the execution character set in addition to the required members 5 2 1 The direction of printing 5 2 2 The decimal point character 7 1 1 The implementation defined aspects of character testing and case mapping functions 7 3 The collation sequence of the execution character set 7 11 4 4 The formats for time and date 7 12 3 5 Portability issues 207 ISO IEC 9899 1990 E Annexes G 5 Common extensions The following extensions are widely used in many systems but are not portable to all implementations The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming Examples of such extensions are new keywords or library functions declared in standard headers or predefined macros with names that do not begin with an underscore G 5 1 Environment arguments In a hosted environment the main function receives a third argument char envp that points to a null terminated array of pointers to char each of which points to a string that provides information about the environment for this execution of the process 5 1 2 2 1 G 5 2 Specialized identifiers Characters other than the underscore _ letters and digits that are not defined in the required source character se
11. The shift states for the mblen mbtowc and wctomb functions are not explicitly reset to the initial state when the LC_CTYPE category of the current locale is changed 7 10 7 An array written to by a copying or concatenation function is too small 7 11 2 7 11 3 An invalid conversion specification is found in the format for the str time function 7 12 3 5 G 3 Implementation defined behavior Each implementation shall document its behavior in each of the areas listed in this subclause The following are implementation defined G 3 1 Translation How a diagnostic is identified 5 1 1 3 G 3 2 Environment The semantics of the arguments to main 5 1 2 2 1 What constitutes an interactive device 5 1 2 3 G 3 3 Identifiers The number of significant initial characters beyond 31 in an identifier without external linkage 6 1 2 The number of significant initial characters beyond 6 in an identifier with external linkage 6 1 2 Whether case distinctions are significant in an identifier with external linkage 6 1 2 G 3 4 Characters The members of the source and execution character sets except as explicitly specified in this International Standard 5 2 1 The shift states used for the encoding of multibyte characters 5 2 1 2 The number of bits in a character in the execution character set 5 2 4 2 1 The mapping of members of the source character set in character cons
12. ches Verhalten das anhand des folgenden Codebeispiels erkl rt werden soll Dabei wird angenommen dass int 16 Bit gro ist 1 enum enl a b c a 0 b 1 c 2 x 2 enum en2 d e 400 f d 0 e 400 f 401 3 enum en3 g 4 h 3 i g 4 h 3 i 4 4 enum en4 j 2 k 40000 1 j 2 k 40000 1 40001 x Zeile 1 zeigt die Deklaration eines Enums ohne explizite Zuweisung Dem ersten Element wird in diesem Fall automatisch der Wert 0 zugewiesen Jedes folgende Element erh lt einen um 1 h heren Wert solange kein anderer Wert bestimmt wird Als Datentyp f r die Elemente des Enums sind in diesem Fall alle Integertypen m glich da sich die Zahlen 0 1 und 2 in allen Datentypen speichern lassen F r die Elemente von en2 ist mindestens ein short erforderlich wobei dieses signed oder unsigned sein kann Interessant wird es in Zeile 3 da f r die Elemente von en3 auf jeden Fall ein signed Datentyp verwendet werden muss Nur im vierten Fall ist der Datentyp anhand der Werte vorgegeben Er muss die Zah len 1 und 40001 abdecken Durch die Zahl 1 muss der Datentyp signed sein und die Zahl 40001 kann nur durch ein long dargestellt werden Deshalb hat en4 den Datentyp signed 1ongf Einige Compiler verwenden f r Enumerations generell den Datentyp unsigned long und wechseln nur dann auf signed long wenn Elemente explizit negativ deklariert werden Andere hingegen passen den Datentyp den Werten der Elemente an Das hei t sie
13. 2 int bitsl 1 3 int bits2 5 4 bitFeld str bitFeld_str bits1 Fe A Abbildung 3 5 Anordnung der Bits Viele Compiler bieten die M glichkeit Bitfelder zu optimieren indem nur soviel Speicher reserviert wird wie von den einzelnen Bits ben tigt wird Das hei t obwohl ein Bitfeld als int definiert wird wird es intern in einem char abgelegt Wenn der Compiler den Datentyp ndert weil nur wenige Bits verwendet werden kann es sein dass das erste Bit von zwei int Bitfeldern an verschiedenen Positionen liegt wie in der Abbildung 3 6 dargestellt amp bitFeld_str gt oxFo HHHH sizeof bitFeld_str sizeof char oxF1 LSB amp bitFeld_str gt 0xF0 OxF4 sizeof bitFeld_str sizeof int H I 1 U T U I H 1 tot F llbits Abbildung 3 6 Verschiebung des LSB bei Big Endian SLeast significant bit Most significant bit 21 Kapitel 3 Zu analysierende Eigenschaften Das Gleiche gilt auch f r das MSB bei Little Endian Enumeration Mit dem Datentyp enum lassen sich in C Integer Werte mit Namen belegen Wenn Enu merations verwendet werden wird intern dennoch mit Zahlen gearbeitet Von welchem Integertyp die Enumerations sind ist implementationsabh ngig Das hei t der Compiler entscheidet ob die Elemente eines Enums als signed oder unsigned Wert gespeichert werden und welche Gr e der entsprechende Datentyp hat Es gibt dabei unterschiedli
14. Annexes G 3 10 Qualifiers What constitutes an access to an object that has volatile qualified type 6 5 5 3 G 3 11 Declarators The maximum number of declarators that may modify an arithmetic structure or union type 6 5 4 G 3 12 Statements The maximum number of case values in a switch statement 6 6 4 2 G 3 13 Preprocessing directives Whether the value of a single character character constant in a constant expression that controls conditional inclusion matches the value of the same character constant in the execution character set Whether such a character constant may have a negative value 6 8 1 The method for locating includable source files 6 8 2 The support of quoted names for includable source files 6 8 2 The mapping of source file character sequences 6 8 2 The behavior on each recognized pragma directive 6 8 6 The definitions for DATE and TIME _ when respectively the date and time of translation are not available 6 8 8 G 3 14 Library functions The null pointer constant to which the macro NULL expands 7 1 6 The diagnostic printed by and the termination behavior of the assert function 7 2 The sets of characters tested for by the isalnum isalpha iscntrl islower isprint and isupper functions 7 3 1 The values returned by the mathematics functions on domain errors 7 5 1 Whether the mathematics functions set the integer expr
15. E G 5 10 The asm keyword The asm keyword may be used to insert assembly language code directly into the translator output The most common implementation is via a statement of the form asm character string literal 6 6 G 5 11 Multiple external definitions There may be more than one external definition for the identifier of an object with or without the explicit use of the keyword extern If the definitions disagree or more than one is initialized the behavior is undefined 6 7 2 G 5 12 Empty macro arguments A macro argument may consist of no preprocessing tokens 6 8 3 G 5 13 Predefined macro names Macro names that do not begin with an underscore describing the translation and execution environments may be defined by the implementation before translation begins 6 8 8 G 5 14 Extra arguments for signal handlers Handlers for specific signals may be called with extra arguments in addition to the signal number 7 7 1 1 G 5 15 Additional stream types and file opening modes Additional mappings from files to streams may be supported 7 9 2 and additional file opening modes may be specified by characters appended to the mode argument of the fopen function 7 9 5 3 G 5 16 Defined file position indicator The file position indicator is decremented by each successful call to the ungetc function for a text stream except if its value was zero before a call 7 9 7 11 Portability issues 209 Anhang B Benutz
16. Gro buchstaben ausgegeben Die Zuordnung zwischen Schl ssel und Erkl rung ist in dem Perlmodul rbCEval_const pm hinterlegt Die Ergebnisse werden mit erkl renden Beschreibungen ausgegeben Zum Teil finden auch einfache Umrechnungen statt Beispielsweise wird der Exponent von Gleitkommazahlen berechnet und die Gr e der Datentypen von Byte in Bit umgerechnet Das Endergebnis wird auf dem Bildschirm ausgegeben In Kapitel 6 werden einige Ergebnisse miteinander verglichen im Anhang C ist eines komplett dargestellt Array dass Strings als Index zul sst Perl 72 Kapitel 5 Implementierung 5 4 Review Das Programmsystem wurde in Zusammenarbeit mit den Kollegen aus der Abteilung AE BE Eng3 entwickelt Es fanden regelm ige R cksprachen hinsichtlich der Notwendigkeit von Analysen und des geplanten Ablaufs statt Das Programmsystem wurde von Kolle gen auf seine Anwendbarkeit getestet Diese haben das Programmsystem ohne Einf hrung angewendet und die Analysen anhand des Benutzerhandbuchs durchgef hrt Anhand ih rer Vorschl ge und Anmerkungen wurden das Programmsystem dessen Benutzung die Ausgabe der Ergebnisse und das Benutzerhandbuch optimiert 5 5 Dokumentation Die offizielle Firmensprache von Bosch ist Englisch Deshalb sind das komplette Programm die Kommentare im Quellcode und die Dokumentation in Englisch gehalten Es gibt zwei verschiedene Dokumentationen Die eine richtet sich an den Anwender und b
17. den entsprechenden Aussagen Dieses Modul wird wie der Header rbCEvalConst h automatisch erzeugt 5 3 3 1 Kommunikation Die Skripte sowie die Programml ufe arbeiten unabh ngig voneinander Damit die Er gebnisse den anderen Perlskripten und der Auswertung zur Verf gung stehen werden diese in Textdateien zwischengespeichert Jedes Skript schreibt seine Ergebnisse auto matisch in eine Textdatei compResultx txt wobei das x die Nummer des Skripts runi1 pl run4 pl darstellt Der Anwender muss daf r sorgen dass die Ergebnisse der Programml ufe jeweils in die Daten run1 txt run4 txt geschrieben werden Unerwartete Fehler die den Programmlauf auf dem Mikroprozessor unm glich machen werden in die Dateien compResultx txt geschrieben Diese Fehler m ssten dann vom An wender selbst oder vom Verantwortlichen des Programmsystems behoben werden Solche Fehler sollten normalerweise nicht auftreten Das Programmsystem ist so ausgelegt dass die Skripte jeweils auf die davor erzeugten Ergebnisse zugreifen k nnen um abh ngig von deren Inhalt Code zu generieren wie es auch im Datenmodell in Abbildung 4 2 dargestellt ist Dieser Datenfluss w re n tig wenn das Programmsystem mit einer beliebigen Gr e des Datentyps char zurecht kommen m sste und es andere Darstellungen negativer ganzer Zahlen au er dem Zweierkomplement g be Es wurde vereinbart dass diese beiden Bedin gungen vorausgesetzt werden da es kaum noch Compiler
18. kros und bindet Code aus den ber include angegebenen Dateien ein 2 Kompilieren Der Compiler berpr ft die Syntax und bersetzt den Quellcode in Maschinenspra che 3 Linken Der Linker l st externe Abh ngigkeiten auf Funktionen und Variablen die im aktu ellen Modul zwar benutzt aber nicht definiert werden m ssen ber andere Module oder Bibliotheken eingebunden werden Das Ergebnis ist das fertige ausf hrbare Programm Kapitel 2 Hintergrund Bei gr eren Softwareprojekten wird der Quellcode auf viele Dateien aufgeteilt Da der letzte Schritt das Linken normalerweise erst m glich ist wenn schon gro e Teile der Software fertig sind werden die einzelnen Dateien Module zuerst nur kompiliert Das hei t es werden Objektdateien generiert und eventuell zu Bibliotheken zusammengefasst Auch wenn jedes Modul f r sich kompiliert werden kann kann es zum Schluss beim Linken zu Problemen kommen Beispiel 1 Ein einfacher Fall in diesem Zusammenhang ist die doppelte Definition einer Funktion Zwei Module k nnen demnach jeweils eine Funktion mit dem gleichen Namen definieren Solange diese Module nur f r sich kompiliert werden f llt dieses nicht auf Erst beim Linken kann es zu Problemen kommen Entweder es kommt zu einem Fehler weil eine Funktion doppelt definiert wurde oder aber das zweite Modul wird nicht gelinkt weil die Abh ngigkeit schon durch das erste erf llt wurde Was genau geschieht wird nicht durch
19. tzt werden Ferner sollen so die Auswirkungen von Compileroptionen besser sichtbar gemacht werden Beispielsweise ist die Gr e des Da tentyps int und die maximale L nge von Bezeichnern nicht festgelegt Das Programm soll so aufgebaut werden dass die vom Anwender durchzuf hrenden Ein stellungen minimal sind und sich nahe an einem der blichen Build Prozesse bewegen Batchfile Make Dadurch soll die Anwendung des Programmsystems so einfach wie m glich gehalten werden Das Programm kann somit ohne gro e Anpassungen in schon bestehenden Projektumgebungen eingesetzt werden Dies ist notwendig damit das Pro gramm unter den gleichen Voraussetzungen z B Compileroptionen l uft unter denen auch die zu entwickelnde oder portierende Software laufen soll Kapitel 2 Hintergrund Im folgenden Kapitel werden die verschiedenen Aspekte der Aufgabe betrachtet 2 1 Eingebettete Systeme Heutzutage wird in fast allen Bereichen des t glichen Lebens Elektronik eingesetzt Sei es in Waschmaschinen K chenger ten Unterhaltungselektronik Kraftfahrzeugen oder ande ren Maschinen Dies geschieht meist unsichtbar f r den Anwender Man spricht in diesem Fall von Eingebetteten Systemen engl embedded systems Mit diesem Begriff werden Rechnersysteme bezeichnet die integraler Bestandteil eines gr eren Systems sind und meist nur f r eine bestimmte Aufgabe konzipiert sind Im Ge gensatz zum normalen PC werden eingebettete Systeme sp
20. weil sie zu lang sind und sich nur in den signifikanten Stellen nicht unterscheiden wird der Compiler dieses direkt erkennen und einen Fehler ausgeben Bei externen Variablen kann es aber sein dass der Compiler einfach die letzten Stellen ignoriert und es erst beim Linker zu Problemen f hrt So kann es sein dass in zwei Modu len zwei Variablen mit fast gleichem Namen deklariert sind die sich in den signifikanten Stellen nicht unterscheiden Beim Linken kann es nun passieren dass der Linker dieses merkt und eine Fehlermeldung ausgibt Andererseits kann es aber auch sein dass das andere Modul gar nicht eingebunden wird da die Abh ngigkeiten schon durch das erste Modul erf llt sind und somit der Fehler nicht bemerkt wird Neben der signifikanten L nge der Bezeichner wird bei externen Bezeichnern ebenfalls nicht festgelegt ob zwischen Gro und Kleinschreibung unterschieden wird 3 1 4 Characters Zeichensatz Generell unterscheidet der Standard zwischen dem Entwicklungssystem und dem System auf dem das Programm letztendlich ausgef hrt Dementsprechend werden auch die gelten den Zeichens tze unterschieden Diese werden auch als Quell und Ausf hrungszeichensatz bezeichnet siehe 2 1 und m ssen nicht identisch sein 15090 6 1 3 4 Der Standard legt fest dass jedes C System ber die folgenden Zeichen verf gen muss Die interne Darstellung wird jedoch nicht festgelegt abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
21. 5 4 9 5 4 Division with zero constant compiler error Modulo with zero constant compiler error Division with zero during run time volatile var result zero 3 0 0 Modulo with zero during run time volatile var result dividend 3 0 3 Casting to a smaller signed type unsigned char gt signed char no bits changed signed long gt signed char no bits changed unsigned long gt signed char no bits changed Floating Point a 4294967296 b c not possible Padding in Structs with data types of different size fill bytes behind char if char comes before long char amp long false fill bytes behind char if long comes before char long amp char false Modulo and Division operations of integer values If a b is representable a b b asb a true The result of Integer Division with negative Operands is truncated 9 5 1 9 5 1 9 5 1 The result of Modulo with negative Operands is negative if dividend is negative 9 5 4 9 5 4 9 5 4 nteger Division with negative Operands during preprocessing is truncated rounded towards zero The result of Modulo with negative Operands during preproc is negativ e if dividend is negative 9 5 4 9 5 4 9 5 4 Division with zero constant compiler error Modulo with zero constant compiler error Division with zero during run time volatile var result zero 3 0 0 Modulo with zero during run time volatile var result
22. 5 2 Analysen Die nun folgenden Abschnitte befassen sich mit verschiedenen Themen die bei der Im plementierung des C Codes f r den Programmlauf beachtet werden m ssen sowie den eigentlichen Analysen der in Kapitel 3 genannten Eigenschaften 5 2 1 Allgemein Da der generierte Code mit vielen verschiedenen Compiler Prozessor Kombinationen funk tionieren soll muss er portabel sein Das hei t der Code der nicht direkt mit einer Analyse zu tun hat darf keine Funktionen Konstrukte oder hnliches enthalten die nicht genau im Standard definiert sind Aus diesem Grund wird auch auf die Verwendung von Biblio theksfunktionen verzichtet vgl Abschnitt 8 1 14 Daraus ergibt sich f r die zu analysierenden Compiler die Voraussetzung dass sie nach dem Standard C90 implementiert sein m ssen Sonst kann die Funktionalit t der entwickelten und implementierten Algorithmen nicht gew hrleistet werden 5 2 1 1 Namenskonvention Die Analysen sollen so nah wie m glich am eigentlichen Projekt des Anwenders stattfinden Deshalb muss beachtet werden dass sich keine Bezeichner des von C Eval erzeugten C http www freescale com http www isystem com 38 Kapitel 5 Implementierung Codes mit Bezeichner des anderen C Codes berschneiden Deshalb bekommt jede globale Funktion jede Variable und jedes Pr prozessorsymbol das Pr fix RB_CEVAL f r Makros rbCEval f r alle anderen globalen Bezeichner Dabei ist rb ein
23. Anordnung der Dit 21 3 6 Verschiebung des LSB bei Big Endian 21 4 1 Datenflussdiagramm einfach 22 2 2 En nn 30 4 2 Datenflussdiagramm erweitert 31 5 1 F llbyte am Ende von Strukturen e 50 5 2 Bin re Suche der Bezeichnerl nge o 58 5 3 Gesamtablaul secs ea an a a a han EN A 62 5 4 Build Prozess Ablaufdiagramm 2 222222 nn 64 5 5 Schema einer Codegenerierung und Compilerfehleranalyse 69 5 6 Ablaufdiagramm runl pl 2 222222 oo oo Eon 71 6 1 Enumarations auf dem HC12 Mikroprozessor Cosmic Metrowerks 75 6 2 Vergleich von Gleitkommazahlen auf dem HC12 Mikroprozessor 76 6 3 Vergleich von Bitfeldern beim HC12 Cosmic und PowerPC GreenHills 78 87 Anhang A Portability Issues Anhang G des Standards ISO IEC 9899 1990 Der deutschen Norm aus dem Jahr 1994 entnommen DIN EN 29899 1994 Wiedergegeben mit Erlaubnis des DIN Deutsches Institut f r Normung e V Ma gebend f r das Anwenden der DIN Norm ist deren Fassung mit dem neusten Ausgabedatum die bei der Beuth Verlag GmbH Burggrafenstra e 6 10787 Berlin erh ltlich ist 88 Annexes ISO IEC 9899 1990 E Annex G informative Portability issues This annex collects some information about portability that appears in this International Standard G 1 Unspecified behavior The following are unspecified The manner and timing of static initializat
24. Datei muss die Funktion rbCEval_toolKit definiert sein da der Anwender diese aufrufen soll siehe Abschnitt B 3 2 Deshalb werden wenn weniger als die sechs Dateien ben tigt werden Hilfsdateien genommen in denen korrekter C Code steht der jedoch nichts ausf hrt Nachdem die Dateien rbCEval_x c geschrieben wurden wird der dynamische Code in ei ner der Dateien mit dem Hilfscode erzeugt Der Hilfscode wird dabei berschrieben In die sem Fall wird in Zeile 13 die Datei rbCEval_4 c neu geschrieben In dieser wird die Funkti on rbCEval_toolKit erzeugt welche die zu testende Funktion rbCEval_sizeofByte aufruft die in der Datei rbCEval_001 c vordefiniert ist Zeile 4 Damit ist der Quellcode f r den Build Prozess zusammengestellt und wird ber die Funk tion compile in Zeile 22 gestartet Diese Subroutine l scht vor dem Aufruf des Build Prozesses die eventuell vorhandene Datei rbCEval_compile txt Ob die Datei rbCEval_compile txt nach dem Build Prozess geschrieben wurde um des sen Erfolg anzuzeigen wird mit Hilfe der Subroutine checkResult in Zeile 25 berpr ft runl pl Das Ablaufdiagramm in Abbildung zeigt den Aufbau des Perlskripts in dem die Compilerfehleranalysen durchgef hrt werden und fast alle Analysen in einem Pro grammlauf zusammengefasst werden Insgesamt wird in diesem Skript der Build Prozess ca 80 mal aufgerufen bevor der endg ltige Maschinencode erzeugt wird 70 Kapitel 5 Implementierung
25. Dem Anwender wird die M glichkeit gegeben die Konfigurationsdatei gesondert abzule gen Beim Aufruf der Perlskripte muss dann der entsprechende Pfad zu der Datei angege ben werden 5 3 3 3 Initialisierung Die Konfiguration die Anpassungen im Build Prozess und die Implementierung der zus tz lichen C Funktionen wird mit dem Skript init pl gepr ft Es testet die folgenden drei Punkte 1 Sind die Pfade korrekt 2 Funktioniert die Compilerfehlererkennung mit der Textdatei So kann die Konfigurationsdatei mit dem eigentlichen Projekt in ein Versionskontrollsystem wie CVS oder ClearCase abgelegt werden so dass auch sp ter noch die Analyse nachvollzogen werden kann 67 Kapitel 5 Implementierung 3 L sst sich die Funktion rbCEval_outputByte aufrufen Sollte einer der Punkte nicht erf llt sein wird eine entsprechende Fehlermeldung mit einem Hinweis auf m gliche Ursachen ausgegeben die der Anwender dann berpr fen muss 5 3 3 4 Generierung von Quellcode und Compilerfehleranalyse Die Generierung des Quellcodes und die Compilerfehleranalyse geschieht in den Perlskrip ten runi pl run4 pl Diese Skripte arbeiten nach dem gleichen Prinzip und unter scheiden sich nur in der Art und Menge der Durchl ufe Ein Durchlauf beinhaltet in diesem Zusammenhang die Codegenerierung den Build Prozess und die Compilerfehler auswertung Das Endergebnis jedes Skripts ist unter anderem der Maschinencode f r einen Programmlauf
26. Gleitkommatypen float double und long double nicht genau definiert und wird als unspecified deklariert Es wird nur die folgende mathematische Bedingung gegeben p este jet k 1 _ 110 111 111a Zweierkomplement und 3276710 011 111 gt 16 Kapitel 3 Zu analysierende Eigenschaften mit x normalisierte Gleitkommazahl f gt 0 2 4 0 s sign 1 b Basis e Exponent Integer zwischen emin lt lt emas p Pr zision Anzahl der Basis b Stellen im signifikanten Teil fk nicht negatives Integer kleiner als b Neben der Genauigkeit ist auch das Rundungsverhalten implementationsabh ngig Dabei werden zwei F lle unterschieden Einerseits wenn zum Beispiel ein long zu einem float konvertiert wird und sich dessen Wert nicht genau darstellen l sst S090 6 2 1 3 ande rerseits wenn ein Gleitkommawert nicht genau dargestellt werden kann ISO90 6 2 1 4 Der Standard gibt vier Rundungsverhalten gegen Null zum n chsten Nachkommastelle gegen plus Unendlich und gegen minus Unendlich vor es steht dem Compilerhersteller aber offen andere zu definieren 3 1 7 Arrays and pointers Die Gr e eines Arrays wird mit Hilfe des Operators sizeof bestimmt Dessen R ckga bewert ist eine Integerkonstante deren Datentyp mit size_t bezeichnet wird size_t ist kein neuer Datentyp sondern ein anderer Name f r einen der Standarddatentypen und wird in einem der Standardheader definiert und dadurch im
27. Ist der Inhalt gleich 58 Kapitel 5 Implementierung wurden die Variablen vom Linker nicht unterschieden Das hei t entweder wurde die zweite Datei nicht gelinkt weil alle Abh ngigkeiten durch die erste Variable erf llt sind oder der Wert der ersten Variable wurde von der zweiten sp ter gelinkten Variable berschrieben Der erste Schritt wird auch f r Makronamen durchgef hrt Da Makronamen durch den Pr prozessor verarbeitet werden sind keine weiteren Schritte notwendig 5 2 2 14 Inhalt von Makros Referenz 3 2 3 Der Inhalt eines Makros lie e sich anhand der Pr prozessorausgabe ermitteln Dazu wird die Ausgabe an der Stelle durchsucht an der ein Makro im Quellcode stand und pr ft dort wodurch das Makro ersetzt wurde Dieser Prozess l sst sich jedoch nicht sehr gut auto matisieren Um den Code nach dem Pr prozessor zu erhalten m ssen blicherweise auch andere Compileroptionen gesetzt werden die in einem Projekt ansonsten nicht verwendet werden Der Pr prozessor selbst bietet mit dem stringize Operator eine andere M glichkeit den Inhalt eines Makros darzustellen Der Standard C90 beschreibt im Abschitt 6 8 3 5 ein Beispiel wie dieser Operator angewendet werden kann Dazu wird ein funktions hnliches Makro erstellt das den bergebenen Parameter w hrend des Preprocessing in einen String umwandelt also noch bevor der eigentliche Quellcode bersetzt wird define RB CEVAL STRINGIZE a Ha
28. actually exists 7 9 3 The rules for composing valid file names 7 9 3 Whether the same file can be open multiple times 7 9 3 The effect of the remove function on an open file 7 9 4 1 The effect if a file with the new name exists prior to a call to the rename function 7 9 4 2 The output for p conversion in the fprintf function 7 9 6 1 The input for p conversion in the fscanf function 7 9 6 2 The interpretation of a character that is neither the first nor the last character in the scanlist for conversion in the scanf function 7 9 6 2 The value to which the macro errno is set by the fgetpos or ftell function on failure 7 9 9 1 7 9 9 4 The messages generated by the perror function 7 9 10 4 The behavior of the calloc malloc or realloc function if the size requested is zero 7 10 3 The behavior of the abort function with regard to open and temporary files 7 10 4 1 The status returned by the exit function if the value of the argument is other than zero EXIT_SUCCESS or EXIT_FAILURE 7 10 4 3 The set of environment names and the method for altering the environment list used by the getenv function 7 10 4 4 The contents and mode of execution of the string by the system function 7 10 4 5 The contents of the error message strings returned by the strerror function 7 11 6 2 The local time zone and Daylight Saving Time 7 12 1
29. all test otherwise there might be inconsistencies 4 Flash Microcontroller and run the 1 test The next step is to run the first test on the Microcontroller The user shall do that manually and must ensure the results of the test are written into the file runl txt 5 Start the second test perl run2 pl f This test contains only one function and is about modulo with zero This is done with a volatile variable so it should compile 6 Flash microcontroller and run the 2 test Run the third test on the Microcontroller The results of the test must be written into the file run2 txt Because of a special verification the test can cause a runtime error and the processor might crash If that happens the file run2 txt still has to be created but left empty 7 Start the third test perl gt run3 pl f This test contains only one function and is about division with zero This is done with a volatile variable so it should compile 8 Flash microcontroller and run the 3 test Run the third test on the Microcontroller The results of the test must be written into the file run3 txt Because of a division with zero the test can cause a runtime error and the processor might crash If that happens the file run3 txt still has to be created but left empty 9 Start the fourth test optional Perl I run4 pl lt macros gt lt includes gt macros file with macro names to be checked one macro per line includes file with inc
30. allgemeines Pr fix f r die Robert Bosch GmbH und CEval verweist auf dieses Programmsystem Um zus tzlich zur Lesbarkeit des Codes beizutragen wird jedem Variablennamen ein Suffix angeh ngt der den Datentyp erkennen l sst So bezeichnet beispielsweise counter_psi einen Pointer auf eine signed integer Variable mit dem Namen counter und var_c eine char Variable 5 2 1 2 Arten von Analysen Es gibt zwei Arten von Analysen Bei der einen wird ein Wert berechnet der auch das Ergebnis darstellt wie zum Beispiel die Anzahl der Bits in einem Byte oder die Gr e der Mantisse von einem float Bei den meisten Analysen wird jedoch ein bestimmtes Verhalten gepr ft und das Ergebnis ist auf eine bestimmte Anzahl von Aussagen begrenzt In diesem Fall wird f r jedes m gliche Ergebnis ein konstanter Wert festgelegt dem in der Auswertung dann der Aussage zugeordnet wird Ein einfaches Beispiel hierzu ist das Rundungsverhalten bei einer negativen Integerdivision Das kann laut Standard nur gegen Null oder gegen minus unendlich sein es gibt also zwei M glichkeiten Wird noch davon ausgegangen dass das Rundungsverhalten eventuell nicht bestimmt werden kann gibt es noch eine dritte M glichkeit Diese drei Konstanten werden im Header rbCEvalConst h vordefiniert und lauten in diesem Fall error x define RB CEVAL DIV NEG ERROR 9 abgeschnitten zu Null gerundet define RB_CEVAL_DIV NEG_TRUNC 1 kleiner oder gleich zu minus unendl
31. c 2 1 2 a 256 b c 2 0 2 a 32768 b ck 2 0 2 a 1 b 32768 c 4 1 4 a 65536 b ch 4 0 4 a 2147483648 b c 4 1 4 a 1 b 2147483648 c 4 1 4 a 4294967296 b c not possible Padding in Structs with data types of different size fill bytes behind char if char comes before long char amp long false fill bytes behind char if long comes before char long amp char false Modulo and Division operations of integer values If a b is representable a b b afb a true The result of Integer Division with negative Operands is truncated 9 5 1 9 5 1 9 5 1 The result of Modulo with negative Operands is negative if dividend is negative 9 5 4 9 5 4 9 5 4 nteger Division with negative Operands during preprocessing is truncated rounded towards zero The result of Modulo with negative Operands during preproc is negative if dividend is negative 9 5 4 9 5 4 9 5 4 Division with zero constant compiler error Modulo with zero constant compiler error Division with zero during run time volatile var result zero 3 0 0 Modulo with zero during run time volatile var result dividend 3 0 3 Casting to a smaller signed type unsigned char gt signed char no bits changed signed long gt signed char no bits changed unsigned long gt signed char no bits changed Floating Point 110 Anhang Base 2 precision mantissa of float 23 bits precision ma
32. den Prozes sen Da der Programmablauf normalerweise manuell gestartet werden muss k nnen diese Schritte nur bedingt automatisiert werden Daten k nnen also nicht direkt bergeben werden Deshalb ist es am sinnvollsten diese in tempor ren Dateien auf der Festplatte abzulegen Dabei muss gew hrleistet werden dass alle Prozesse auf die gleichen Daten zugreifen Weiterhin muss das Format festgelegt werden in dem die Daten abgespeichert werden Die einfachste L sung sind in diesem Fall Textdateien Die Daten k nnen im Klartext gespeichert werden Eine Alternative w re das XML Format das aber zu diesem Controller Area Network ein von Bosch entwickeltes Bussystem 34 Kapitel 4 Programmsystem Zweck berdimensioniert ist Au erdem m sste daf r zus tzlich noch ein XML Parser implementiert werden 4 4 6 Dynamische Generierung von Quellcode Ein wichtiger Punkt ist das Zusammenstellen des Quellcodes f r die verschiedenen Tests Die Analyse des Standards zeigt dass einige Eigenschaften w hrend der Kompilier und Linkphase berpr ft werden m ssen und zu Fehlern f hren k nnen Besonders die Suche nach der maximalen L nge von Bezeichnern ist ein iterativer Prozess der mehrere Kom piliervorg nge ben tigt Andererseits k nnen f r die meisten Eigenschaften Funktionen geschrieben werden die die jeweilige Eigenschaft abpr fen Es gibt nun drei M glichkei ten 1 Der Quellcode wird komplett dynamisch generiert
33. eine Laufzeitmessung einmal implementiert lie e sich mit Hilfe dieser ein Benchmark entwickeln mit dem sich die Effizienz verschiedener Compiler Prozessor Kombinationen vergleichen lie e Atomare Operationen Ob beispielsweise die Zuweisung a b atomar ist h ngt davon ab wie der ent sprechende Systembefehl implementiert ist K nnen nur 8 Bit Werte direkt verscho ben werden ist diese Zuweisung nur bei char Variablen atomar Untersucht werden k nnte dieses Verhalten mit Hilfe von Interrupts die vom Anwender implementiert werden m ssten Zuverl ssig k nnte jedoch nur bestimmt werden ob ein Operator nicht atomar ist Untersuchung des Stack Bedarfs zur Laufzeit Es k nnte untersucht werden wie und wo automatische Variablen im Speicher ab gelegt werden und wie gro der resultierende Speicherverbrauch ist Damit kann beispielsweise untersucht werden ob nur der Platz belegt wird der f r die abzu legenden Daten ben tigt wird Dabei ist zu beachten dass automatische Variablen auch in Registern abgelegt werden k nnen 81 Ausblick e Untersuchung von Inlining Inlining bezeichnet das Kopieren des Inhalts einer Funktion an die Stelle an der die Funktion aufgerufen wird Es wird zur Laufzeitoptimierung verwendet da dadurch ein Funktionsaufruf Sprung im Maschinencode vermieden wird Es k nnte untersucht werden ob durch Inlining tats chlich eine Optimierung erreicht wird e Eigenscha
34. einer bestimmten L nge unterschieden werden Die minimal unterscheidbare L nge von Bezeichnern legt der Standard auf 31 Zeichen f r interne lokale und 6 Zeichen f r ex terne globale fest ISO90 6 1 2 Mit Bezeichnern sind alle Namen gemeint die vom Programmierer frei gew hlt werden k nnen Das geht von Variablen Funktions Label und Makronamen bis zu eigenen Typennamen und den einzelnen Elementen von Struktu ren Unions und Enumerations Dass f r externe Bezeichner nur sechs signifikante Stellen vorausgesetzt werden liegt daran dass es zur Zeit der Festlegung des Standards Imple mentierungen mit diesem Limit gab Deshalb wird in dem Unterpunkt Future language directions des Standards dieses Limit auch auf 31 Zeichen erh ht ISO90 6 9 1 In vielen Softwareprojekten gibt es Namenskonventionen um sprechende und eindeutige Bezeichner zu erzeugen Es werden auch immer mehr Programme eingesetzt die automa tisch Code generieren Beides f hrt dazu dass die garantierten 31 Zeichen schnell ber schritten sind Eine Namenskonvention k nnte zum Beispiel so aussehen 11 Kapitel 3 Zu analysierende Eigenschaften Projektname_Modulname_sprechenderFunktionsname Dieser Bezeichner hat schon 46 Zeichen Die meisten Compiler unterscheiden deshalb l nge re Bezeichner Bei der berpr fung der tats chlich akzeptierten L nge gibt es verschiedene Szenarien zu beachten Kommt es bei internen Variablen zu berschneidungen
35. endif Anhand von listi zeigt der n chste Ausschnitt wie die Gr e des jeweiligen Enums festgestellt wird ob der Datentyp signed oder unsigned ist und wie viele Bytes ein einzelnes Element belegt Bei einem Element handelt es sich um eine Konstante die auch unabh ngig vom Enum verwendet werden kann Deren Gr e kann von der Gr e des Enums abweichen 1 enum listl varl_e al 2 x Gr e von list1 in Byte x 3 char listlSize_c sizeof varl_e a x Ist der Datentyp von list1 signed 1 oder unsigned 0 5 char listlSign_c 0 6 welche gr e hat ein Element 7 char listlElementSize_c 0 s varl e varl ee x setzt alle Bits auf 1 x 45 Kapitel 5 Implementierung o if varl_e lt 0 10 list1Sign_c 1 listlElementSize_c sizeof al Der Anwender bekommt in der Auswertung dann eine Liste mit den berpr ften Enume rations der Angabe wie viele Bytes diese belegen ob der Datentyp signed oder unsigned ist und wie viele Bytes ein einzelnes Element belegt 5 2 2 5 Modulo und Division von Integerzahlen Referenz Laut Standard C90 h ngen die Integeroperationen Division und Modulo ber die in Ab schnitt 3 1 5 angegebene Formel zusammen Es ist m glich dass ein Compiler diesen Zu sammenhang nicht korrekt implementiert Trotzdem interessiert in diesem Fall das Ver halten der beiden Operationen Deshalb findet zuerst eine berpr fung der Formel f r alle vier m glichen Kombin
36. erm glicht haben Ganz besonders bedanke ich mich bei Frank B hland und Jost Brachert die mich w hrend meiner Diplomarbeit stets kompetent betreut und unterst tzt haben Sie gaben mehrfach Anregungen und Ratschl ge die zur erfolgreichen Durchf hrung der Diplomarbeit beige tragen haben Auch m chte ich mich bei Herrn Prof Dr Nikolaus Wulff f r die bernahme und dadurch die Erm glichung der Diplomarbeit seitens der Fachhochschule M nster bedanken Meiner Freundin danke ich f r das Korrekturlesen und die aufgebrachte Geduld Zu guter Letzt bedanke ich mich bei meinen Eltern die mir meinen Ausbildungsweg erm glicht haben Sie standen mir jederzeit mit Rat und Tat zur Seite und gaben mir immer die n tige Motivation und moralische Unterst tzung Automotive Engineering Body Electronics Engineering 3 II Inhaltsverzeichnis 1 2 Einleitung ies Boe ac Dart ee Ge he a ee ee ee 1 2 Aufgabenstellung e Hintergrund ER a i he ees es ok Gk a SR Hh Sd RER 2 2 Die Programmiersprache Ce 2 2 1 Ein kleiner Exkurs zum Build Prozessl 2 2 2 Der C Standardl 22222 22 rn nn nn 2 2 2 1 Implementation defined behaviorl 2 2 2 2 Unspecified behavior 2 2 2222 2 2 2 3 Undefined behavior a a a a iaa A EENEG 91 2 Pmvironment sei gon Aa ws Be er ee eie ER 3 1 3 Identitiers u sand EE wo a kr na en ne LA Characters sms das na A aa re 3 1 9 Integers s o u 24 a
37. es wichtig dass auch Softwareentwickler die den Code nicht mitent wickelt haben diesen schnell verstehen und damit arbeiten k nnen Dabei sind eigene Typennamen jedoch hinderlich da der neue Softwareentwickler erst wissen muss was der jeweilige Name zu bedeuten hat und wie dieser Typ verwendet werden darf Allgemein sind verschachtelte Typdeklarationen bei Bosch nicht blich so dass zw lf Schachtelun gen ausreichend sind Nach R cksprache findet deshalb keine weitere Untersuchung zur Verschachtelung von Deklaratoren statt 3 1 12 Statements Der Standard sagt dass in einem switch Statement mindestens 257 case Werte akzep tiert werden sollen Ein Compiler kann eventuell mehr verarbeiten aber diese Menge ist ausreichend so dass keine weitere Analyse notwendig ist 23 Kapitel 3 Zu analysierende Eigenschaften 3 1 13 Preprocessing directives Da der Pr prozesser auf dem Entwicklungssystem ausgef hrt wird kann es bei beding ten Anweisungen zu anderen Ergebnissen kommen als zur Laufzeit Dies kann besonders bei Zeichenkonstanten vorkommen wenn dadurch dass der auf dem Entwicklungssystem eingesetzte Zeichensatz ein anderer ist als der auf dem Mikroprozessor siehe Abschnitt 3 1 4 oder wenn die Konstante einen negativen Wert hat ISO90 6 8 1 Das hei t die folgenden beiden Ausdr cke m ssen nicht zum gleichen Ergebnis f hren 3 H H 3 1 f z a 25 Pr prozessor Anweisung 2 if 2 a
38. for the conversion specifiers s for an array of character type or p for a pointer to void 7 9 6 1 A single conversion by the fprintf function produces more than 509 characters of output 7 9 6 1 A conversion specification for the scanf function contains an h or 1 with a conversion specifier other than d i n o u or x or an L with a conversion specifier other than e or g 7 9 6 2 A pointer value printed by p conversion by the fprintf function during a previous program execution is the argument for p conversion by the scanf function 7 9 6 2 Portability issues 203 ISOAEC 9899 1990 E Annexes The result of a conversion by the fscanf function cannot be represented in the space provided or the receiving object does not have an appropriate type 7 9 6 2 The result of converting a string to a number by the atof atoi or atol function cannot be represented 7 10 1 The value of a pointer that refers to space deallocated by a call to the free or realloc function is referred to 7 10 3 The pointer argument to the ree or realloc function does not match a pointer earlier returned by calloc malloc or realloc or the object pointed to has been deallocated by a call to free or realloc 7 10 3 A program executes more than one call to the exit function 7 10 4 3 The result of an integer arithmetic function abs div labs or ldiv cannot be represented 7 10 6
39. genau verh lt ist vom Hersteller des Compilers zu dokumentieren IS090 3 10 Ein Bei spiel f r implementation defined behavior ist wie im Beispiel 2 in 2 2 1 erw hnt die Gr e der einzelnen Datentypen 2 2 2 2 Unspecified behavior Hiermit wird Verhalten beschrieben das zwar korrekt ist auf welches der Standard aber nicht n her eingeht S090 3 17 wie zum Beispiel die interne Darstellung von Gleitkom mazahlen ISO90 6 1 2 5 2 2 2 3 Undefined behavior Undefined behavior beschreibt nicht portable oder fehlerhafte Konstrukte f r die es im Standard keine Regeln gibt Auch das Verhalten wenn bestimmte im Standard definierte Bedingungen nicht erf llt sind ist im Allgemeinen nicht definiert Das hei t der Stan dard verlangt nicht dass es eine Dokumentation zu der jeweiligen Eigenschaft gibt die beschreibt wie sich das Programm in einem solchen Fall verh lt Es liegt also im Ermessen des Compilerherstellers ob und wie diese Eigenschaften behandelt werden ISO90 3 16 2 3 Bekannte Ans tze Die Programmiersprache C ist gerade im Bereich von eingebetteten Systemen sehr ver breitet da mit ihr hardwarenahe schnelle und vor allem kleine Software erstellt werden kann Jedoch zeichnet sich C nicht gerade durch Striktheit aus Viele Konstrukte wer den zugelassen die bei anderen Programmiersprachen zu Fehlern f hren w rden Typen werden zum Beispiel implizit umgewandelt die Gr e von Arrays nicht berpr ft und viele
40. gleich 75 Kapitel 6 Tests gesetzt Standardeinstellung Abbildung 6 2 zeigt dass auch die Verteilung der Bits eine andere ist Hierbei handelt es sich allerdings um einen internen Fehler des Compilers Da der gleiche Prozessor verwendet wird und somit die gleiche Gleitzkommaarithmetik darf sich die Verteilung der Bits nicht ndern Sie wird im Handbuch des Metrowerks Compilers mit der Aufteilung Mantisse 23 Bits Exponent 8 Bits und Vorzeichen 1 Bit angegeben Fre06 Daraufhin wurde der Algorithmus zur Analyse nochmals berpr ft jedoch kein Fehler gefunden In der Analyse wird ausschlie lich mit Gleitkommawerten gerechnet sie he Codeausschnitt auf Seite 54 In einer Debugumgebung wurde jeder Schritt der Be rechnung berprift Dabei stellte sich heraus dass der Metrowerks Compiler wenn nur mit Gleitkommazahlen gerechnet wird bei Grenzwerten bergang zum n chsten Expo nenten fehlerhaft ist Wird der Test mit Integerwerten durchgef hrt die dann implizit zu Gleitkommawerten konvertiert werden tritt dieser Fehler nicht auf und das Ergebnis w re korrekt Dies ist aber nur f r den Datentypen float m glich da dessen Mantisse normalerweise kleiner ist als die Anzahl der Bits in einem long Eine Analyse von double bzw long double w re dann nicht mehr m glich Floating Point Floating Point Base 2 Base 2 precision mantissa of float 23 bits lt gt precision mantissa of float 22 bits prec
41. gurationseinstellungen des Programms QA C Anregungen der Entwickler bei Bosch und einige Punkte der Common Extensions des Standards C90 Neben den Auswirkungen die eine bestimmte Eigenschaft auf ein Programm haben kann wird auch erkl rt warum einige Eigenschaften nicht gepr ft werden Auf die Tests und Algorithmen mit denen das genaue Verhalten festgestellt werden kann wird in Kapitel 5 n her eingegangen Vorab kann gesagt werden dass nur Eigenschaften berpr ft und analysiert werden die f r eingebettete Systeme relevant sind So werden zum Beispiel Funktionen zur Bearbeitung von Dateien und zum Zugriff auf Dateisysteme vollst ndig ausgelassen 3 1 Analyse der implementationsabh ngigen Eigenschaften Der Anhang G des Standards C90 befasst sich mit den Portability Issues der Program miersprache C Es ist eine elfseitige stichpunktartige Zusammenfassung der offenen Punk te unterteilt in eine Seite unspecified behavior viereinhalb Seiten undefiened behavior und drei Seiten implementation defined behavior Die restlichen Seiten befassen sich mit Common Extensions also Erweiterungen die nicht durch den Standard abgedeckt sind aber allgemein blich sind Die komplette Liste der Portability Issues befindet sich im Anhang Die folgenden Abschnitte behandeln die implementationsabh ngigen Eigen schaften die im Annex G 3 ISO90 zusammengefasst sind Die berschriften sind dem Ann
42. ist also wichtig die Erweiterbarkeit sicherzustellen Dazu sind zwei Dinge notwendig Erstens ein offener verst ndlicher und gut erweiterbarer Aufbau des Programmsystems und zweitens eine gute Dokumentation des Ganzen Der Aufbau wird zum gro en Teil durch die Anforderungen und dem Umfeld aus zwei verschiedenen Systemen vorgegeben Hier wird wie in den vorherigen Abschnitten be schrieben der Anwender mit eingebunden Er sichert durch den eigenen Build Prozess und die zu implementierende C Funktion die n tige Flexibilit t neue Compiler zu analy sieren Eine gute Dokumentation ist f r das Verst ndnis wichtig Neben einem Handbuch f r den Anwender und diesem Dokument ist eine ausreichende Dokumentation des Quellco des notwendig Au erdem ist ein Administrator Handbuch sinnvoll F r C bietet sich das freie Tool Doxygen an mit dem sich umfangreiche Dokumentationen direkt aus dem Quellcode generieren lassen 4 4 8 Aufwand f r den Anwender Voraussetzung f r die Nutzung des Programmsystems ist eine gewisse Erfahrung in der Programmiersprache C und der Programmierung von Mikroprozessoren Die Priorit t liegt auf der Flexibilit t deshalb l sst sich der Aufwand f r den Anwender nur bedingt mini mieren Die verschiedenen L sungsans tze zeigen dass die Evaluierung nicht ohne die Mithilfe des Anwenders laufen kann Die folgende Auflistung soll nochmals zeigen welche Aufgaben vom Anwender bernommen werden m ssen e Ber
43. lt 0 3 44 Kapitel 5 Implementierung 5 2 2 4 Enum Referenz 3 1 9 Wie in Abschnitt 3 1 9 beschrieben und die Ergebnisse in Kapitel 6 zeigen unterscheidet sich das Verhalten von Enumerations bei verschiedenen Compilern sehr stark voneinander Deshalb wird zur berpr fung deren Gr e ein eigener Test durchgef hrt in dem von char bis long long alle M glichkeiten durchgespielt werden Dabei gibt der Kommentar im Codeausschnitt an wie gro der jeweilige Datentyp mindestens sein muss Auch hier wird w hrend des Kompilierens erst berpr ft welche der aufgelisteten M glichkeiten berhaupt akzeptiert werden In diesem Beispiel wird das Makro RB_CEVAL_ENUM_64BIT nur dann gesetzt wenn der Kompiliervorgang mit enum listA und enum listB auch erfolgreich war Auf das Prefix rbCEval wird aus Platzgr nden verzichtet 1 enum listl al b1 cl 8 Bit 2 enum list2 a2 1 b2 c2 8 Bit signed 3 enum list3 a3 128 b3 c3 8 Bit unsigned x 4 enum list4 a4 1 b4 128 c4 16 Bit signed 5 enum list5 a5 256 b5 cht 16 Bit 6 enum list6 a6 32768 b6 c6 16 Bit unsigned x 7 enum list7 a7 1 b7 32768 c7 x32 Bit signed s enum list8 a8 65536 b8 c8 82 Bit el 9 enum list9 a9 2147483648 b9 c9 82 Bit unsigned x 10 ifdef RB CEVAL ENUM 64BIT 1 enum listA aA 1 bA 2147483648 cA 64 Bit signed 1 enum listB aB 4294967296 bB cB 64 Bit 13
44. representable Fractional part eg 0 1 is rounded to nearest Fractional part eg 0 1 is rounded to nearest Cast Integer gt Float is rounded to zero Cast Integer gt Float is rounded to zero Bit fields Bit fields Padding Padding no padding bits used e g int 16 Bit 10 16 6 32 Bit gt 2 int bit no padding bits used e g int 16 Bit 10 16 6 32 Bit gt 2 int bit fields fields Order of bits in a complete int bit field LSB first Order of bits in a complete int bit field LSB first WARNING Size of bit field differs according to used bits WARNING Size of bit field differs according to used bits WARNING First bit in bit fields of various size is not at the same WARNING First bit in bit fields of various size is not at the same position position Signedness of int bit fields Signedness of int bit fields each bit field is unsigned regardless of its definition eg signe lt gt plain int bit field is signed the others as defined d int bf 4 has a range of 0 15 WARNING implementation doesn t match C90 Allowed types of bit fields appart from int Allowed types of bit fields appart from int char short long char short long Content of predefined macros Content of predefined macros SIDE I lt gt Bole 0 NULL void 0 NULL void 0 RBCEVAL_H RBCEVAL_H FILE_ c projects CEval example source rbCEval_4 c lt gt __FILE__ c projects CEval example source rbCEval_4 c
45. w hlen immer den kleinstm glichen Datentyp 10Wertebereiche von signed int 32768 32767 signed long 2147483648 2147483647 Zweierkomple ment 22 Kapitel 3 Zu analysierende Eigenschaften 3 1 10 Qualifiers Mit Qualifiers sind volatile und const gemeint Implementationsabh ngig ist hier was einen Zugriff auf ein volatile Objekt ausmacht What constitutes an access to an object that has volatile qualified type IS090 6 5 3 Was mit diesem Satz gemeint ist konnte leider nicht herausgefunden werden Die eigentliche Bedeutung des volatile Qualifiers wird aber anscheinend dadurch nicht ber hrt Deshalb wird auf diesen Punkt nicht weiter eingegangen 3 1 11 Declarators C bietet dem Softwareentwickler die M glichkeit eigene Typen zu deklarieren oder an dere Namen f r vorgegeben Datentypen einzuf hren Dabei soll jeder Compiler eine Ver schachtelung von mindestens zw lf Namen akzeptieren Wie viele verschiedene Namen der jeweilige Compiler zul sst ist implementationsabh ngig Der folgende Beispielcode zeigt eine solche Verschachtelung typedef int levell 2 typedef levell level2 3 typedef level2 level3 4 int varl 5 level3 var2 Die Variablen var1 und var2 haben in diesem Fall den gleichen Datentyp int Generell dienen eigene Typdeklarationen dazu den Code lesbarer machen Werden sie jedoch zu h ufig und verschachtelt angewandt tritt das Gegenteil ein Gerade in gr e ren Projekten ist
46. 1234567890 OE ed er OL ee FILE a e S space new line horizontal tab Fiir die folgenden Steuerzeichen muss der Quellzeichensatz Symbole zur Verfiigung stellen die dann w hrend der Translation siehe Abschnitt 3 1 1 in den entsprechenden Zeichen code f r den Mikroprozessor umgewandelt werden wie beispielsweise n f r new line 12 Kapitel 3 Zu analysierende Eigenschaften O null t horizontal tab v vertical tab form feed Na alert n new line r carriage return b backspace Welche zus tzlichen Zeichen erlaubt sind ist implementationsabh ngig SO90 5 2 1 Mittlerweile wird fast nur noch der ASCITI Zeichensatz eingesetzt Neben diesem gibt es noch vereinzelt den EBCDIC Zeichensatz Im Zuge der Analyse reicht es aber den Anwender darauf aufmerksam zu machen wenn es sich bei dem verwendeten Zeichensatz nicht um ASCII handelt Weiterhin soll auch berpr ft werden ob der erweiterte ASCII Zeichensatz akzeptiert wird Der Standard definiert f r einige Zeichen Trigraphen f r 7 f r Diese sind ein Relikt aus der Zeit als Tastaturen noch nicht alle Zeichen unterst tzten und werden nicht weiter berpr ft Byte Im Zusammenhang mit dem Zeichensatz steht auch die Gr e des Datentyps char Ein char repr sentiert in C ein Byte Abweichend zur allgemeinen Verwendung des Begriffs Byte f r eine Menge von 8 Bit definiert der Standard C90 ein Byte als eine Gruppe von aufeinander folgenden Bit
47. 5 kann Teil von speziellen Linker Adressen sein Ubrig bleiben die restlichen Zeichen des erweiterten 8 Bit ASCII Zeichensatzes ASCII Code 128 255 Diese geh ren zwar nicht zum Standard werden aber der Vollst ndigkeit halber ebenfalls berp ft Zus tzlich wird der Standardzeichensatz f r den Pr prozessor getestet Verwendet dieser ebenfalls ASCII liefern if Konstrukte wie in Abschnitt 3 1 13 gezeigt das gleiche Ergebnis Die berpr fung findet durch den Vergleich der Zeichenkonstanten mit ihrem dezimalen ASCII Wert statt 1 int counter_i 0 2 if a 97 counter_i 4 3 if b 98 counter_i 4 Entsprechend f r den Pr prozessor 1 int counter_i4 2 if a 97 3 counter _i 4 4 endif s if b 98 6 Am Ende jeder berpr fung gibt die Variable counter_i die Abweichungen vom ASCII Zeichensatz an Ist ihr Wert Null werden alle berpr ften Zeichen in ASCII dargestellt Gibt es Abweichungen im Standardzeichensatz bekommt der Anwender bei der Auswer tung einen Hinweis Hier ist nicht das Hochkomma mit ASCII Code 39 gemeint sondern mit ASCII Code 96 57 Kapitel 5 Implementierung 5 2 2 13 Bezeichner Referenz 3 1 3 Die Idee ist die dynamische Generierung von Bezeichnern mit gleicher L nge bei denen sich nur die letzte Stelle des Namens unterscheidet Diese werden dann in ein St ck Code eingebunden und kompiliert Werden die Namen akze
48. 9 2 2 3 Datentypen 2 2 Con on nn EOP er de len oe ae ee ae ed 5 2 2 5 Modulo und Division von Integerzahlen 5 2 2 6 Bitverschiebung 5 2 2 7 Datentypkonvertierung 2 2 22 nn 5 2 28 Strukturen 5 2 2 9 _ Bndianesg sa ase a wach ua an ae nd a BE 52 2 10 Bitfelder coo 2 0004 Ba ce a wa an ah Re ee E Bu eee e EE Se ae 8 2 2 12 Zeichensatzl 5 2 2 13 Bezeichnerl o e nen 5 2 2 14 Inhalt von Makro Z9 Automatisierung si a e g a o da a ek RR wa eee a O 5 3 1 Anpassungen am Build Prozess o o o oaa 5 3 2 Der Programmlaufl oaa nn 5 3 3 Das Programmsystem 5 3 3 1 Kommunikation e 5 3 3 2 Konfiguration 2 2 0 a 5 3 3 3 Initialisierung ee 5 3 3 4 Generierung von Quellcode und Compilerfehleranalyse 9 3 3 9 Die Auswertung eee Anwendung und Ergebnisse 6 1 Gleicher Prozessor verschiedene Compiler 2 222222 6 11 HC e e amp 4 Sa EENEG 6 12 PowerPC ocios sa zn sa ET AN Gh dea Bw ae 6 2 Unterschiedliche Prozessoren verschiedene Compiler 6 3 Unterschiedliche Prozessoren gleicher Compiler Zusammenfassung Ausblic k Eigenst ndigkeitserkl rung Glossar Literaturverzeichnis Abbildungsverzeichnis A Portability Issues B_Benutzerhandbuch Q e e 09 O T un un O VI 74 75 75 77 77 78 80 82 83 84 87 87
49. D 0 N Fachhochschule M nster Fachbereich Elektrotechnik und Informatik Diplomarbeit Entwicklung eines Programms zur automatischen Analyse von C Compilern hinsichtlich des C Standards von Ralf Jonkmann Referent Herr Prof Dr rer nat Nikolaus Wulff Korreferent Herr Dipl Inf Frank B hland Durchgef hrt bei Robert Bosch GmbH Leonberg Automotive Electronics Body Engineering AE BE ENG3 Postfach 1661 71226 Leonberg Kurzfassung Durch die Verwendung verschiedener C Compiler und Mikroprozessoren kann sich das Ver halten von Programmen ndern und damit Fehlfunktionen verursachen Ursache ist eine unterschiedliche Implementierung bestimmter Eigenschaften der Programmiersprache C welche in dem internationalen C Standard ISO IEC 9899 nicht oder nicht eindeutig defi niert wurden Ziel dieser Arbeit ist die Entwicklung eines Programms zur automatischen Analyse der nicht eindeutig definierten Eigenschaften im Hinblick auf eingebettete Syste me Dieses Programm hilft Softwareentwicklern Unterschiede zwischen Compilern besser zu erkennen so dass im Vorfeld potenzielle Fehlerquellen erkannt werden und sich darauf basierende Fehler vermeiden lassen Danksagung An dieser Stelle m chte ich allen danken die mich w hrend meines Studiums und dieser Diplomarbeit unterst tzt haben Ich m chte der Robert Bosch GmbH und den Mitarbeitern der Abteilung AE BE ENG in Leonberg danken die mir diese Diplomarbeit
50. D iS 2 al 2 a 1 E ches il 2 a 1 ER 2 al 2 a 128 D enya le 0 2 a 128 By Cc 2 T 2 a 1 b 128 chi 2 il 2 a 1 b 128 e 2 1 2 a 256 Dr eko 2 0 2 lt gt a 256 D 2 il 2 a 32768 E CA 0 2 32768 br E not possible fa 1 b 32768 epi 4 ib 4 a 1 b 32768 iS not possible a 65536 D ee g 0 4 a 65536 B e not possible a 2147483648 b ce 4 1 4 a 2147483648 b a not possible la 1 b 2147483648 c 4 il 4 a 1 b 2147483648 c not possible Beyond Compare 2 3 1 10 09 2007 21 01 14 DATEIVERGLEICH Seite 3 Linke Datei C projects CEval result hc12_cosmic_070910 txt Rechte Datei C projects CEval result hc12_metro_070910 txt Fortsetzung a 4294967296 b c not possible Padding in Structs with data types of different size fill bytes behind char if char comes before long char amp long false fill bytes behind char if long comes before char long amp char false Modulo and Division operations of integer values If a b is representable a b b a b a true The result of Integer Division with negative Operands is truncated 9 5 1 9 5 1 9 5 1 The result of Modulo with negative Operands is negative if dividend is negative 9 5 4 9 5 4 9 5 4 Integer Division with negative Operands during preprocessing is truncated rounded towards zero The result of Modulo with negative Operands during preproc is negativ e if dividend is negative 9 5 4 9
51. Dadurch wird das Programm allerdings un bersichtlich und l t sich nicht sehr gut warten 2 Wird der Quellcode komplett vordefiniert und je nach Situation der entsprechende Code ausgew hlt m ssen sehr viele M glichkeiten erfasst werden Das hei t die Menge an vordefiniertem Quellcode der sich zum Teil nur geringf gig voneinander unterscheidet wird un berschaubar 3 Die sinnvolle Alternative ist eine Kombination vorgenannten M glichkeiten Wie gesagt lassen sich die meisten Funktionen vordefinieren Unterschiede lassen sich zum Teil ber Pr prozessordirektiven einstellen indem z B Headerdateien umdefi niert werden F r andere Figenschaften k nnen auch Codefragmente w hrend des Durchlaufs generiert werden Das folgende Beispiel zeigt wie eine Auswahl ber Makrodefinitionen aussehen kann 1 ifdef CEVAL MAKRO 2 printf CEVALMAKRO ist gesetzt 3 endif Der Pr prozessor berpr ft ob das Makro CEVAL_MAKRO gesetzt ist Falls nicht wird der Code in Zeile 2 ignoriert 4 4 7 Erweiterbarkeit Das zu entwickelnde Programmsystem analysiert nur die in Kapitel 3 beschriebenen Eigen schaften Zum Teil werden Eigenschaften ausgelassen weil sie irrelevant fiir eingebettete Systeme sind nach Riicksprache nicht notwendig sind oder aber ihre Implementierung zu 35 Kapitel 4 Programmsystem aufwendig ist Ebenso k nnen in Zukunft noch weitere Eigenschaften hinzukommen die untersucht werden sollen Es
52. Der Nachteil von C ist die komplizierte Stringverarbeitung und die schwierige Interaktion mit dem System Weitere Optionen waren Java Python und Perl Nach Absprache mit den Kollegen die das Tool verwenden sollen fiel die Entscheidung auf die Programmiersprache Perl Perl hat seine St rken in der Bearbeitung von Textdateien und der Steuerung von anderen Programmen Es ist eine Skriptsprache mit der sich einfach und schnell wiederkehrende Prozesse automatisieren lassen Die meisten Entwickler bei Bosch haben Erfahrung im Umgang mit Perl und es ist dort auf jedem Entwicklungs PC vorinstalliert 37 Kapitel 5 Implementierung 5 1 2 Entwicklungsumgebung Die Implementierung der verschiedenen Programmteile fand auf einem PC mit einem In tel Pentium 4 Prozessor statt Die Tests der einzelnen Funktionen f r die Analyse fanden auf dem PC mit dem GNU C Compiler Version 4 2 statt Als zweites System stand ein M68HC12 Mikroprozessor der Firma Freescald in Verbindung mit dem Cosmic HC12 C Compiler Version 4 6f zur Verf gung Auf diesem System wurde zum gro en Teil auch getestet Zum Debuggen wurde ein On Chip Debugger der Firma iSYSTEM in Verbin dung mit der Entwicklungsumgebung winIDEA genutzt Neben diesen beiden Systemen wurden bei sp teren Tests auch andere Compiler und Pro zessoren eingesetzt siehe Kapitel 6 Das Programmsystem wurde mit dem Perl Interpreter Version 5 8 4 von ActiveStatd ent wickelt und getestet
53. EE EE EA e NEE Se E E AN 3 1 6 Floating pont 16 ee dle da E e Eh eS eG 17 Wasatch as ee 17 nn 18 wa ee eae Eee 23 3 1 11 Declaraters 2 2 2 a et ee ee ee ee a E 23 3 1 12 Statements 2 2d u 2 ae es Ae Awe De A 23 moai a 2G Se a A a 24 babe be i A ie a BE BE GE EEE bed as 24 SE oh Ra ities By oes Gee Gt EE ese een 25 3 2 1 Division und Modulo durch Nulll 25 3 2 2 Common Extensions 2 2 2 2 m nn nn 25 3 23 MAKTOS ociosas a a a Be in an 25 Ka a ee ee a et E a E E E 26 27 SL _Binild Prozessl s a sosa 2 0 a a a eee nn EEA e E RN Ree EN e 27 4 2 Anforderungen an das Programmsystem CEvall o o 28 4 3 Datenmodell 30 pee ee ee Be eG SR a aci 31 4 4 1 Flexibilit t 222222 on nn 32 le re a E 33 oy e a eier each Tape E 33 4 4 4 Daten bertragung 2 2 Cm m nn nn 34 EEN 34 ba bk een 35 4 4 7 Erweiterbarkeitl ee 35 4 4 8 Aufwand f r den Anwender 2 2 a a a 36 IV 5 Implementierung iaa a Ls a An ker ae ee a a an are Berk ee ieh ee gh Gh aero 5 1 2 Entwicklungsumgebung 2 2 22 2 non nn EE Er EE e AE er ee a ee Se es Se ee Bee ee a ne EN ehe eae as SE a aA 5 2 1 1 Namenskonventionl 22 22 22 2 nn 5 2 1 2 Arten von Analyse 2 2 2222 o nen SE EIER e Be ee A i AC EE ELE A A 5 2 15 Headerdateien Be aor eh Bale ER 5 2 2 1 Gr e eines Byte 2 2 22 ee 5 2 2 2 Darstellung negativer Zahlen
54. Intel Gr e Alignment wchar 32 16 longdouble 64 8 96 4 Endianess Big Endian Little Endian Division durch 0 Laufzeit Dividend Laufzeitfehler Modulo durch 0 Laufzeit undefiniert Laufzeitfehler Bitfelder Erstes Bit MSB LSB 78 Kapitel 6 Tests Hier kann ein Unterschied zwischen eingebetteten und normalen Systemen festgestellt werden Modulo und Division durch Null f hrt auf dem PC zum Programmabsturz Dies ist nicht kritisch da das Betriebsystem daf r sorgt dass das abgest rzte Programm beendet wird oder dem Benutzer eine Fehlermeldung anzeigt Auf dem PowerPC ergibt Modulo durch null zwar kein definiertes Resultat das Programm l uft aber weiter 79 Zusammenfassung Zusammenfassung Die Aufgabe bestand darin ein Programm zu entwickeln dass die Implementierung von nicht eindeutig definierten Eigenschaften der Programmiersprache C bei Compilern f r eingebettete Systeme untersucht Dies sollte auf Basis des Standards C90 geschehen Hin tergrund der Aufgabe ist der Einsatz von verschiedenen Compilern und Mikroprozessoren bei der Entwicklung von Steuerger ten im Automotive Bereich Wesentlich war daher die Anwendbarkeit des Programmsystems auf beliebige Compiler Prozessor Kombinationen sowie die bertragbarkeit der Ergebnisse auf reale Anwenderprojekte Die Analyse des Standards C90 zeigte dass er eine F lle von Eigenschaften enth lt die nicht definiert sind Es wurde deshalb haupts chlich auf
55. LINE__ 31 LINE__ 31 Beyond Compare 2 3 1
56. LS SOFTWARE INC Green Hills Optimizing C Compilers 2007 Online Stand 30 05 2007 http www ghs com products c_optimizing_ conpilers ktmi ISO90 ISO IEC Programming languages C International Standard 9899 Interna tional Organization of Standardization 1990 DIN EN 29899 1S099 ISO IEC Programming languages C International Standard 9899 Interna tional Organization of Standardization 1999 MIS04 MISRA MISRA C 2004 Guidelines for the use of the C language in critical systems Richtlinie The Motor Industry Software Reliability Association 2004 Tex03 TEXAS INSTRUMENTS TMS320C55x Optimizing C C Compiler Users Gui de 2003 Online Stand 14 08 2007 http focus ti com lit ug spru281f sprud8if pdf Wik07a WIKIPEDIA Endianness Wikipedia The Free Encyclopedia 2007 Online Stand 31 07 2007 http en wikipedia org w index php title Endianness amp oldid 147690577 Wik07b WIKIPEDIA Varianten der Programmiersprache C Wikipedia Die freie En zyklop die 2007 Online Stand 30 05 2007 http de wikipedia org w index php title Varianten_der_Programmiersprache_C amp oldid 31094790 86 Abbildungsverzeichnis 2 1 Konfigurationsmen von QA C 2 2 22 2 nn nn 9 3 1 Rechtsverschiebung bei signed Werten o 16 3 2 Anordnung von Bytes 18 3 3 Alignment in Strukturen 20 3 4 Padding in Bitfeldern 2 22 22 2 Connor 20 3 5
57. Perl scripts is the file rbCEval_config pm It is possible to place it somewhere else like a project folder If a Perl script is called it has to be done like perl I lt path to rbCEval_config pm gt script options while the path has to be absolute or relative to the main directory CEval Here you have to define the following ScompileSkript Command to start the user defined compile script batch file make file etc StargetPath Path where the C source files shall be generated in similar to where the project specific sources are so that the compile script finds the C source files SincludePath Path where the include files shall be copied to StmpPath Temporary folder for temporary generated files SDD Directory delimiter for Unix Linux W for Windows All paths must be absolute or relative to the main folder of the tool CEval 2 Initialization perl init pl This initialization script will delete all previous results stored in temporary files check the configured paths and perform some basic tests on the user defined compile script If these are successful the real evaluation can start If it fails there will be an error message with more detail Usually it means that the paths are not correct or the compile script is not working correctly 3 Start first test perl runl pl f To avoid any tests about floating point features the option f can be used Once used it must be used for
58. Systemen kann beispielsweise eine Variable vom Datentyp int nur an geraden Adressen abgelegt werden wohingegen ein char an jeder be liebigen Adresse liegen kann Werden diese Datentypen in einer Struktur kombiniert kann dies dazu f hren dass F llbytes genutzt werden um die richtige Adressierung zu gew hr leisten Padding Neben Zugriffsproblemen wirkt sich das Verwenden von F llbytes auch negativ auf den Speicherverbrauch aus 1 struct 2 char var ci 3 int varli 4 test str In diesem Beispiel belegt ein int 2 Byte Links in der Abbildung wird der interne Aufbau dargestellt bei dem nur gerade Adressen fiir eine int Variable erlaubt sind Je nachdem wie viele Bytes ein Datentyp belegt kann es auch sein dass die jeweilige Adresse durch 4 oder durch 8 teilbar sein muss Dies kann dazu fiihren dass Strukturen wesentlich mehr Speicherplatz ben tigen als erwartet Werden Strukturen nun von einem System abgelegt und von einem zweiten System mit anderem Alignment gelesen kann dies zu Zahl durch die die Speicheradresse eines Datentyps teilbar sein muss 19 Kapitel 3 Zu analysierende Eigenschaften Ox00FO var c OxDOFO Ox00F1 F llbyte test_str 0x00F1 0x00F2 Ox00F2 var_l Ox00F3 Ox00F3 Abbildung 3 3 Alignment in Strukturen Problemen f hren Es gibt auch Compiler bei denen sich das Alignment ber Optionen einstellen l sst Y Bitfelder Bei Bitfeldern handelt es sich um einen Spezialfall de
59. Verhaltens bei einer Division durch Null 4 4 4 Daten bertragung Neben der Programmierung des Mikroprozessors kann auch das Lesen der Ergebnisse des Programmlaufs von dem Mikroprozessor nicht vorher festgelegt werden Da sich die Um gebung in der der Mikroprozessor eingesetzt wird von Projekt zu Projekt unterscheidet kann dieser Punkt nicht allgemein gel st werden Wichtig f r eine automatische Weiter verarbeitung der Ergebnisse ist ein festgelegtes Format und eine definierte Stelle Datei an der die Daten abgelegt werden Wie nun genau die Daten bertragen werden ist vom Anwender festzulegen Die Idee ist dass er dazu eine C Funktion schreibt Diese Funktion wird von CEval eingebunden und dazu benutzt die Ergebnisse auszugeben Bei den Tests w hrend der Entwicklung wurde dazu die serielle Schnittstelle benutzt so dass die Daten direkt zum PC bertragen und dort aufgezeichnet wurden Denkbar sind aber auch andere Wege wie CAN INachrichten Zwischenspeichern der Daten in einem EEPROM oder das manuelle Auslesen der Daten ber eine Debugumgebung Auch wenn dieser Weg kompliziert ist und die Bedienbarkeit des Programms erschwert gibt es keine andere M glichkeit die die n tige Flexibilit t f r projektspezifische L sungen bietet 4 4 5 Kommunikation zwischen den Prozessen Die Evaluierung findet in mehreren Schritten und normalerweise auf zwei verschiedenen Systemen statt Wie gestaltet man am Besten die Kommunikation zwischen
60. a label in the same function 6 1 2 1 An identifier is used that is not visible in the current scope 6 1 2 1 Identifiers that are intended to denote the same entity differ in a character beyond the minimal significant characters 6 1 2 The same identifier has both internal and external linkage in the same translation unit 6 1 2 2 The value stored in a pointer that referred to an object with automatic storage duration is used 6 1 2 4 Two declarations of the same object or function specify types that are not compatible 6 1 2 6 An unspecified escape sequence is encountered in a character constant or a string literal 6 1 3 4 An attempt is made to modify a string literal of either form 6 1 4 A character string literal token is adjacent to a wide string literal token 6 1 4 The characters NX or are encountered between the lt and gt delimiters or the characters or are encountered between the delimiters in the two forms of a header name preprocessing token 6 1 7 An arithmetic conversion produces a result that cannot be represented in the space provided 6 2 1 An Ivalue with an incomplete type is used in a context that requires the value of the designated object 6 2 2 1 The value of a void expression is used or an implicit conversion except to void is applied to a void expression 6 2 2 2 An object is modified more than once or is
61. ain access to an actual object 7 1 4 The parameter member designator of an offsetof macro is an invalid right operand of the operator for the type parameter or designates bit field member of a structure 7 1 6 A library function argument has an invalid value unless the behavior is specified explicitly 7 1 7 A library function that accepts a variable number of arguments is not declared 7 1 7 The macro definition of assert is suppressed to obtain access to an actual function 7 2 The argument to a character handling function is out of the domain 7 3 A macro definition of set jmp is suppressed to obtain access to an actual function 7 6 An invocation of the set jmp macro occurs in a context other than as the controlling expression in a selection or iteration statement or in a comparison with an integral constant expression possibly as implied by the unary operator as the controlling expression of a selection or iteration statement or as an expression statement possibly cast to void 7 6 1 1 An object of automatic storage class that does not have volatile qualified type has been changed between a set jmp invocation and a long jmp call and then has its value accessed 7 6 2 1 The long jmp function is invoked from a nested signal routine 7 6 2 1 A signal occurs other than as the result of calling the abort or raise function and the signal handler calls any function in the stand
62. ard library other than the signal function itself or refers to any object with static storage duration other than by assigning a value to a static storage duration variable of type volatile sig_atomic_t 7 7 1 1 202 Portability issues Annexes ISONEC 9899 1990 E The value of errno is referred to after a signal occurs other than as the result of calling the abort or raise function and the corresponding signal handler calls the signal function such that it returns the value SIG_ERR 7 7 1 1 The macro va_arg is invoked with the parameter ap that was passed to a function that invoked the macro va_arg with the same parameter 7 8 A macro definition of va start va_arg or va end or a combination thereof is suppressed to obtain access to an actual function 7 8 1 The parameter parmN of a va_start macro is declared with the register storage class or with a function or array type or with a type that is not compatible with the type that results after application of the default argument promotions 7 8 1 1 There is no actual next argument for a va_arg macro invocation 7 8 1 2 The type of the actual next argument in a variable argument list disagrees with the type specified by the va_arg macro 7 8 1 2 The va end macro is invoked without a corresponding invocation of the va start macro 7 8 1 3 A return occurs from a function with a variable argument list initialized by the va_start macro befor
63. ards C99 werden von den Compilern bislang nicht un terst tzt Selbst der aktuellste C Compiler der GNU Compiler Collection GCC v4 2 unterst tzt noch nicht alle Neuerungen des C99 Generell garantieren viele kom merzielle Compilerhersteller wie zum Beispiel Cosmic und Greenhills f r eingebettete Systeme bis heute nur die Einhaltung des C90 Standards Gre07 Im Oktober 2004 brachte ein Verband der Automobilindustrie MISRA eine Richtlinie zur C Programmierung heraus Diese erw hnt dass es zum Erscheinungsdatum keinen kommerziellen C Compiler f r eingebettete Systeme gab der C99 unterst tzt MISO4 Die Schwierigkeit bei der Wiederverwendung von Software liegt an den vielen unterschied lichen Compilern die es f r die Programmiersprache C gibt und der gro en Anzahl an verschiedenen Mikroprozessoren Der Standard f rdert zwar die Portierbarkeit kann sie 2Wertebereich von 16 Bit signed int Zweierkomplement 32768 32767 0x8000 32768 The Motor Industry Software Reliability Association Kapitel 2 Hintergrund aber nicht garantieren Um die n tige Flexibilit t zu behalten gibt es drei Beschreibungen f r Eigenschaften die nicht klar definiert werden k nnen oder generell offen bleiben sollen 2 2 2 1 Implementation defined behavior Mit implementation defined behavior wird ein korrektes Verhalten beschrieben das aber von den Eigenschaften der jeweiligen Implementierung abh ngt Wie sich das Programm
64. ationen statt mit a b 9 5 9 5 9 5 9 5 Ist diese Formel nicht f r alle Kombinationen erf llt wird eine Warnung ausgegeben 1 if a b b a b a 2 Gleichung nicht erf llt x Ergebnis der Division Das Ergebnis der Division mit positiven Operanden ist definiert als die n chste ganze Zahl die kleiner oder gleich dem Quotienten ist Wie in Abschnitt gezeigt gibt es bei negativen Zahlen drei Kombinationen mit jeweils zwei Ergebnissen wobei 9 5 und 9 5 das gleiche Ergebnis haben m ssen entweder 1 oder 2 Diese drei Kombinationen werden folgenderma en analysiert int result_i 0 2 if 9 5 2 3 result_i 11 4 if 9 5 2 5 result_i 2 6 if 9 5 2 7 result_i 4 Es gibt acht m gliche Kombinationen wobei nur vier dem Standard entsprechen Bei den anderen vier wird eine Warnung ausgegeben 46 Kapitel 5 Implementierung Modulo mit negativen Zahlen Da angenommen wird dass die Implementierung von Modulo vom Standard C90 abwei chen k nnte m ssten alle M glichkeiten berpr ft werden Durch die beiden vorherigen Analysen ist bereits bekannt ob die Implementierung dem Standard entspricht und wel che Ergebnisse zu erwarten sind Es findet deshalb nur eine berpr fung des Vorzeichens statt wobei alle acht theoretischen M glichkeiten aus Abschnitt 3 1 5 in Betracht gezogen werden int result_i 0 2 if 9 5 lt 0
65. auen Auswirkungen diese Optimierungen haben ist je nach Compiler unterschiedlich und nicht immer ersichtlich Bei Bosch wechseln Entwickler h ufig zwischen Projekten Oft werden in den Pro jekten verschiedene Compiler verwendet Damit von vornherein Fehler durch falsche Annahmen vermieden werden k nnen deren Entdeckung zu einem sp teren Zeit punkt Aufwand und Kosten verursachen w rde ist es f r den Entwickler wichtig von Beginn an die Unterschiede zu vorher genutzten Compilern zu kennen Bei Bosch wird zur berpr fung des Quellcodes das Programm OAI eingesetzt Dieses Programm untersucht den Code auf kritische Programmkonstrukte und gibt entsprechende Warnungen aus Um QA C effektiv nutzen zu k nnen sind gewis se Grundeinstellungen bzgl des jeweiligen Compilers Prozessors notwendig Sind diese Einstellungen nicht korrekt werden falsche Warnungen ausgegeben und Feh ler werden bersehen oder korrekter Code wird auf Grund von falschen Warnungen ge ndert Aufgabenstellung Es ist ein Programm zu entwickeln welches dem Softwareentwickler die M glichkeit gibt schnell und gr tenteils automatisch die f r die Programmierung von Mikroprozessoren wichtigsten implementationsabh ngigen Eigenschaften des C Standards zu analysieren 3QA Systems http www qasystems de Kapitel 1 Einleitung Dadurch soll der Entwickler eine bersicht ber m gliche Fehlerquellen erhalten und in der Anwendung von QA C unterst
66. auf dem Mikroprozessor Die verschiedenen Durchl ufe lassen sich in drei Kategorien unterteilen die mit der Art der Analysen und der Erzeugung des Quellcodes zusammenh ngt 1 F r Analysen bei denen gezielt Compilerfehler provoziert werden wird der kom plette Code dynamisch generiert Dies geschieht zum Beispiel bei der Suche nach der maximalen L nge von Bezeichnern Es werden solange Bezeichner erzeugt bis ein Compilerfehler auftritt oder eine obere Grenze erreicht ist Die erreichte L nge wird dann f r die sp tere Auswertung in eine Textdatei geschrieben Fin anderes Beispiel ist die Frage ob der Datentyp long long bekannt ist Dazu wird ein St ck Code generiert dass diesen Datentypen benutzt Wird dieser Code ohne Fehler kom piliert wird das Makro RB_CEVAL_LONGLONG_DEFINED gesetzt vgl Abschnitt 4 4 2 das dann im sp teren Verlauf den entsprechenden Code aktiviert 2 Vordefinierter Code wird getestet bevor er f r den eigentlichen Programmlauf zu sammengefasst wird Dazu wird jeweils der Inhalt einer Quelldatei in die Datei rbCEval_0 c kopier und die Funktion rbCEval_toolKit in rbCEval_4 c ge neriert siehe Beispielcode In dieser Funktion werden dann die zu testenden Funk tionen aufgerufen so dass das Linken ebenfalls abgepr ft werden kann Sollte hier ein Fehler auftreten wird eine Fehlermeldung in die Datei compResultx txt ge schrieben und ausgegeben In diesem Fall l uft der letzte Schritt nicht fehlerfrei un
67. ben bis es beim char herausf llt 1 unsigned char var_uc 1 2 bits_i 0 3 do in 4 5 var_uc lt lt 1 6 bits_i 7 while var_uc 0 Bei diesem Test werden nur so viele Wiederholungen ben tigt wie Bits in einem Byte sind es sind keine weiteren Berechnungen n tig 42 Kapitel 5 Implementierung 5 2 2 2 Darstellung negativer Zahlen Referenz 3 1 5 Negative Integerzahlen werden blicherweise im Zweierkomplement dargestellt Diese Dar stellung wird auch f r die anderen Tests vorausgesetzt Trotzdem wird berpr ft ob dies auch wirklich der Fall ist Zu diesem Zweck wird ein vorgegebenes Bitmuster erstellt und dann berpr ft welche Zahl dadurch dargestellt wird Eine signed char Variable wird dazu bis auf das LSB mit Einsen gef llt 111102 Mit diesem Muster wird eine nega tive Null im Einerkomplement vermieden Das Bitmuster hat je nach interner Darstellung den folgenden Wert 2 Zweierkomplement 1 Einerkomplement 28its 1 2 MSB ist Vorzeichenbit 5 2 2 3 Datentypen Referenz Alle arithmetischen Datentypen haben festgelegte Mindestgr en Zur Bestimmung der tats chlichen Gr e kann der Operator sizeof verwendet werden Die Gr e jedes Stan darddatentypen ist dazu im Compiler hinterlegt damit f r den jeweiligen Datentyp ent sprechend dessen Gr e Speicher reserviert werden kann Die Standarddatentypen sind char short int long float double long doubl
68. ction prototype that ends with an ellipsis 6 3 2 2 An invalid array reference null pointer reference or reference to an object declared with automatic storage duration in a terminated block occurs 6 3 3 2 A pointer to a function is converted to point to a function of a different type and used to call a function of a type not compatible with the original type 6 3 4 A pointer to a function is converted to a pointer to an object or a pointer to an object is converted to a pointer to a function 6 3 4 A pointer is converted to other than an integral or pointer type 6 3 4 A pointer that does not behave like a pointer to an element of an array object is added to or subtracted from 6 3 6 Pointers that do not behave as if they point to the same array object are subtracted 6 3 6 An expression is shifted by a negative number or by an amount greater than or equal to the width in bits of the expression being shifted 6 3 7 Pointers are compared using a relational operator that do not point to the same aggregate or union 6 3 8 An object is assigned to an overlapping object 6 3 16 1 An identifier for an object is declared with no linkage and the type of the object is incomplete after its declarator or after its init declarator if it has an initializer 6 5 A function is declared at block scope with a storage class specifier other than extern 6 5 1 A structure or u
69. ction the header rbCEval h has to be included Implement the function void rbCEval_outputByte unsigned char this function has to take an unsigned character and store it somehow Depending on the environment this can be done via the serial port CAN messages into an EEPROM or anything else It doesn t matter how the data are stored as long as they can be read later and then stored into the according text file Each record will be one line of the format name hexvalue eg al 1C Without the content of the macros the result to be transferred will have a total size of around 1000 Bytes 1 2 Compile Script The compile script can be a make file a Perl script a batch file or anything else as long as it does the following things and is callable via the command line e Generate object files of the following C files o rbCEval_O c rbCEval_l c rbCEval_2 c rbCEval_3 c rbCEval_4 c rbCEval_5 c o all user defined files which are necessary for an executable program e After a successful compilation the object files and the necessary libraries have to be linked to an executable file which can be flashed onto the microcontroller eg an el file If this executable was generated the script has to create a text file in the temporary folder rbCEval_compile txt 00000 There is an example script for the gcc compiler in the example folder which is written in Perl compile pl 1 3 Configuration The main configuration file for the
70. d der vordefinierte Code muss berpr ft werden Den Inhalt zu kopieren ist notwendig damit das Dateidatum aktualisiert wird Beim Kopieren einer Da tei wird dagegen das Datum nicht aktualisiert was zu einer Fehlfunktion im Zusammenhang mit dem Tool Make f hren k nnte Da Make das Datum und die Uhrzeit der letzten nderung pr ft sekundengenau wird nach jedem Durchlauf zus tzlich eine Sekunde gewartet da die Generierung des Codes wesentlich schneller durchgef hrt wird 68 Kapitel 5 Implementierung 3 Im letzten Durchlauf wird der Code f r den Programmlauf generiert Dazu wird der Inhalt der getesteten Quellen zusammengefasst und anhand der Ergebnisse des ersten Schemas zus tzlicher Code generiert Die Funktion rbCEval_toolKit ist f r diesen Durchlauf bereits vordefiniert und braucht nicht dynamisch erzeugt werden Die Durchl ufe sind in den Skripten nach dem folgenden Schema umgesetzt Y y generiere den Code in rbCEval_0 c rbCEval_5 c IT y kopiere vordefinerten Quellcode y schreibe neuen Quellcode Build Prozess y Ergebnisauswertung v Abbildung 5 5 Schema einer Codegenerierung und Compilerfehleranalyse Das Skript erzeugt die Dateien rbCEval_x c ruft den Build Prozess auf wertet dann dessen Ergebnis entsprechend aus und passt wenn n tig den Header rbCEvalPredef h an Dieses Schema ist f r jeden Durchlauf gleich Der
71. den Standard festgelegt sondern vom jeweiligen Compiler Hersteller entschieden In jeder dieser drei Phasen k nnen sich verschiedene Compiler unterschiedlich verhalten Dies ist darauf zur ckzuf hren dass im Standard nicht alles definiert wird und viele Punk te mit Absicht offen gelassen wurden siehe Abschnitt Beispiel 2 Ein etwas komplexeres Problem mit dem auch erfahrene C Programmierer nicht unbedingt rechnen soll der folgende Programmausschnitt zeigen Hierbei geht es um die implizite Konvertierung von Datentypen Der Standard legt fest dass bei jeder arithmetischen Operation beide Operanden den gleichen Datentyp haben m ssen Das hei t bevor gerechnet wird werden die Operanden intern auf den gleichen Typ konvertiert Dieser Vorgang wird auch Balancing genannt 2 int y 15 3 if y 0x8000 lt 0 a 5 weitere Anweisungen e Auf den ersten Blick denkt man dass der Ausdruck in Zeile 3 auf jeden Fall wahr ist Mathematisch ist das jedenfalls korrekt Die bin ren Operationen minus und kleiner als sind auch im Standard C90 klar definiert Das Problem hier liegt in der Zahl 0x8000 Allgemein werden alle Zahlen die in ein signed int passen dahin umgewandelt Integer Kapitel 2 Hintergrund Promotion Passt der Wert nicht in ein signed int gibt es verschiedene M glichkeiten Bei Konstanten h ngt der Datentyp nicht nur von der Gr e sondern auch von dem Zah lenformat ab Hexadezimal und Ok
72. ders System Macros m Data Type Interpretation __ Type Size and Alignment 7 Right Shift Behaviour gt Basic Type size aianmen arithmetic logical char Default 8 Default 1 short Default 16 Default 2 r Bit Field Interpretation gt int 16 2 signed unsigned long Default 32 Default 4 longlong Default 64 Default 8 m Char Interpretation float Default 32 Default 4 E reared double Default 64 Default 8 Idouble Default 64 Default 8 7 Fold plain char to signed type codeptr Default 32 Default 4 dataptr Default 32 Default 4 m Intrinsic Types 7 Apply 3 gt Size Alignment CHE size_t funsigned int default y ptrdiff_t fiong default y wehar_t funsigned char default y oK save as Cancel Help Abbildung 2 1 Konfigurationsmen von QA C Abbildung P 1 zeigt einen Ausschnitt aus dem Konfigurationsmenu von QA C Hier muss unter anderem die Gr e der verschiedenen Datentypen angegeben werden 4QA Systems http www qasystems de gt Gimpel Software http www gimpel com Kapitel 3 Zu analysierende Eigenschaften Im folgenden Kapitel wird auf die Eigenschaften der Programmiersprache C eingegan gen die von dem Programm gepr ft werden sollen Diese basieren haupts chlich auf den implementation defined features des Standards C90 Hinzu kommen zus tzliche Konfi
73. die implementation defined fea tures eingegangen Deren Untersuchung ergab dass nur ein Teil dieser Eigenschaften f r eingebettete Systeme relevant sind und deshalb nur diese analysiert werden m ssen Die Analysen der Eigenschaften sind in ein einfaches Programmsystem integriert worden das f r den Einsatz in bestimmte Projekte angepasst werden kann Die n tige Flexibilit t wird durch die Einbindung des Anwenders sichergestellt der ber den Build Prozess die Schnittstelle zum jeweiligen Compiler zur Verf gung stellen muss Zur Anwendung dieses Programmsystems wird deshalb eine gewisse Erfahrung mit der Programmierung von Mikroprozessoren in C vorausgesetzt Ferner muss der zu analysie rende Compiler konform zum Standard C90 sein Das Programmsystem testet nur be stimmte Eigenschaften die der Standard offen l sst und nicht ob der Standard von dem Compiler erf llt wird Ist der Compiler nicht C90 konform kann es prinzipiell zu Fehlern in der Programmausf hrung und den Ergebnissen kommen Die Anwendung des Programms auf verschiedene Compiler hat gezeigt dass es den An forderungen entspricht und wichtige Unterschiede zwischen den Compilern offenlegt Die Ergebnisse geben dem Anwender Hinweise auf Probleme bei der Verwendung von bestimm ten Sprachelementen der Programmiersprache C Es war nicht m glich f r alle relevanten Figenschaften Analysen zu entwerfen Erstens weil die Analysen erheblichen Mehraufwand f r den Anwender bed
74. die Analyse der Feh lermeldungen wie in Abschnitt beschrieben Zum Ende eines erfolgreichen Build Prozesses muss dazu die Datei rbCEval_compile txt in ein tempor res Verzeichnis ge schrieben werden Ist dagegen der Build Prozess nicht erfolgreich darf diese Datei nicht erzeugt werden Wenn der Quellcode so generiert wurde dass voraussichtlich nur an einer Stelle ein Fehler auftreten kann k nnen gezielt Eigenschaften untersucht werden die je nach Implementierung zu Compilerfehlern f hren Der Build Prozess wird in der Compilerfehleranalyse wie eine Funktion genutzt die anhand des Quellcodes in den Dateien rbCEval_x c wahr oder falsch zur ckgibt Das wahr ist in diesem Fall das Vorhandensein der Datei rbCEval_compile txt und falsch deren Abwesenheit Der gesamte Ablauf des Build Prozesses ist in der Abbildung 5 4 vereinfacht dargestellt 63 Kapitel 5 Implementierung 9 3 2 kompiliere rbCEval_1 c rhCEval5 c true Start kompiliere rbCEval_0 c true Y kompiliere alle f r den Linkprozess ben tigten Dateien wurden sie kompiliert true Y false linke alle Objekte y schreibe rbCEval_compile txt hat es geklappt false gt Ende ja Abbildung 5 4 Build Prozess Ablaufdiagramm Der Programmlauf ber welche Schnittstelle der ausf hrbare Maschinencode heruntergelade
75. diesem Grund ist es sinnvoll wiederverwendbare Software zu entwickeln Die Software f r Mikroprozessoren wird h ufig in C geschrieben und baut deshalb auf dem C Standard auf International Organization for Standardization International Electrotechnical Commission Kapitel 1 Einleitung In diesem Standard sind jedoch einige Eigenschaften implementation defined und einige undefined Die verschiedenen C Compiler realisieren diese Eigenschaften entsprechend unterschiedlich Weiterhin l sst sich das Verhalten von Compilern ber Optionen einstel len Welches Verhalten dabei ge ndert wird ist auf den ersten Blick nicht immer ersichtlich Diese beiden Unterschiede in verschiedenen Bereichen Auswirkungen haben 1 2 Oft werden Softwarekomponenten wiederverwendet weil sie sich in der Anwendung bew hrt haben und schon ausgiebig getestet wurden Diese Tests wurden unter be stimmten Bedingungen durchgef hrt Um sicher zu stellen dass eine Komponente das gew nschte Verhalten aufweist muss best tigt werden dass diese Bedingungen auch bei dem neuen System erf llt sind Manchmal werden w hrend der Softwareentwicklung die Compileroptionen ge ndert Dadurch kann sich das Verhalten des Programms ndern Viele Compiler bieten mehrere Arten von Optimierungen an Der Maschinencode l sst sich beispielsweise auf Gr e optimieren Dadurch wird weniger Speicher verwendet und es k nnen Kosten gespart werden Welche gen
76. discarded 7 9 7 11 The details of the value stored by the fgetpos function on success 7 9 9 1 The details of the value returned by the fte11 function for a text stream on success 7 9 9 4 The order and contiguity of storage allocated by the calloc malloc and realloc functions 7 10 3 Which of two elements that compare as equal is returned by the bsearch function 7 10 5 1 The order in an array sorted by the qsort function of two elements that compare as equal 7 10 5 2 The encoding of the calendar time returned by the time function 7 12 2 3 Portability issues 199 ISO IEC 9899 1990 E Annexes G 2 Undefined behavior The behavior in the following circumstances is undefined A nonempty source file does not end in a new line character ends in new line character immediately preceded by a backslash character or ends in a partial preprocessing token or comment 5 1 1 2 A character not in the required character set is encountered in a source file except in a preprocessing token that is never converted to a token a character constant a string literal a header name or a comment 5 2 1 A comment string literal character constant or header name contains an invalid multibyte character or does not begin and end in the initial shift state 5 2 1 2 An unmatched or character is encountered on a logical source line during tokenization 6 1 The same identifier is used more than once as
77. dividend 3 0 3 Casting to a smaller signed type unsigned char gt signed char no bits changed signed long gt signed char no bits changed unsigned long gt signed char no bits changed Floating Point Base 2 Base 2 precision mantissa of float 23 bits lt gt precision mantissa of float 22 pits precision mantissa of double 52 bits precision mantissa of double 22 bite Beyond Compare 2 3 1 10 09 2007 21 01 14 Linke Datei C projects CEval result hc12_cosmic_070910 txt Rechte Datei C projects CEval resultihc12_metro_070910 txt Fortsetzung DATEIVERGLEICH Seite 4 precision mantissa of long double 52 bits precision mantissa of long double 22 bits exponent size in Bits precision signbit exponent size in Bits precision signbit exponent of float 8 bits lt gt exponent of float 9 bits exponent of double 11 bits exponent of double 9 bits exponent of long double 11 bits exponent of long double 9 bits representable minimal difference epsilon to 1 representable minimal difference epsilon to 1 it might be smaller it might be smaller epsilon for float ca 10 6 epsilon for float ca 10 6 epsilon for double ca 19 15 lt gt epsilon for double ca 1076 epsilon for long double ca 10 15 epsilon for long double cas TORSE Rounding behaviour if the value is not representable Rounding behaviour if the value is not
78. e F r die Konfiguration von QA C interessieren zus tzlich die folgenden Gr en R ckgabewert von sizeof entspricht dem Datentypen size_t wide character Datenpointer Codepointer Differenz von Pointern long long void Wird f r QA C nicht ben tigt nur interessehalber untersucht Da void aber kein complete type ist und long long im C90 noch kein Standardda tentyp ist muss vorher berpr ft werden ob deren Gr e berhaupt definiert ist Diese berpr fung findet separat statt da ein sizeof void oder sizeof long long zu ei nem Compilerfehler f hren kann Kommt es zu einem Fehler wird f r den entsprechenden Typen die berpr fung durch Makros ausgeschaltet siehe Abschnitt 1 4 6 die Gr e auf Null gesetzt und dann w hrend der Auswertung als not defined interpretiert Da sich die Gr e einer Variablen vom Datentyp enum sogar je nach Deklaration un terscheiden kann sind umfangreichere Tests n tig die gesondert im n chsten Abschnitt 43 Kapitel 5 Implementierung erkl rt werden Bei dem R ckgabewert von sizeof und bei enum handelt es sich intern nicht um eigene Datentypen Anhand deren Gr e kann aber festgestellt werden mit welchem der Stan darddatentypen diese Werte intern dargestellt werden QA C nutzt diese Informationen um den Nutzer zu warnen wenn im Code andere Datentypen angenommen werden und es dadurch zu falschen Ergebnissen kommen kann Neben der Gr e spi
79. e complete ASCII set is usable extended ASCII Standard charset for preprocessing is implemented in ASCII C style comments comment are accepted The various types have the following size in bits void not known char 8 Beyond Compare 2 3 1 10 09 2007 21 01 14 DATEIVERGLEICH Seite 2 Linke Datei C projects CEval result hc12_cosmic_070910 txt Rechte Datei C projects CEval result nc12_metro_070910 txt Fortsetzung wchar 16 lt gt wchar 8 short 16 short 16 int 16 int 16 long 32 long 32 longlong not defined lt gt longlong 32 float 32 float 32 double 64 lt gt double 32 longdouble 64 longdouble 32 sizeof 16 sizeof 16 pointer 16 pointer 16 pointerDiff 16 pointerDiff 16 functionPointer 16 functionPointer 16 There is an integerdatatype with more than 32 bits There is an integerdatatype with more than 32 bits The various types have the following alignment The various types have the following alignment char 1 char short 1 short int 1 int long db long L longlong not defined lt gt longlong 4 float 1 float double 1 double longdouble 1 longdouble pointer 1 pointer L functionPointer 1 functionPointer 1 Enumerations size in bytes and signedness 1 signed 0 unsigned Enumerations size in bytes and signedness 1 signed 0 unsigned type size sign sizeof a type size sign sizeof a la Dr ei 0 2 lt gt a
80. e the va_end macro is invoked 7 8 1 3 The stream for the lush function points to an input stream or to an update stream in which the most recent operation was input 7 9 5 2 An output operation on an update stream is followed by an input operation without an intervening call to the lush function or a file positioning function or an input operation on an update stream is followed by an output operation without an intervening call to a file positioning function 7 9 5 3 The format for the fprintf or fscanf function does not match the argument list 7 9 6 An invalid conversion specification is found in the format for the fprintf or fscanf function 7 9 6 A conversion specification for the fprintf or fscanf function contains characters between the pair of characters 7 9 6 A conversion specification for the fprintf function contains an h or 1 with a conversion specifier other than d i n o u x or X or an L with a conversion specifier other than e E f g or G 7 9 6 1 A conversion specification for the fprintf function contains a flag with a conversion specifier other than o x X e E g or G 7 9 6 1 A conversion specification for the fprintf function contains a O flag with a conversion specifier other than d i o u x X e E f g or G 7 9 6 1 An aggregate or union or a pointer to an aggregate or union is an argument to the fprintf function except
81. eiteren Schritt kann auch die Anordnung der Bits gepr ft werden Hierzu wird ein Union genutzt Mit dessen Hilfe l sst sich der Wert des Bitfeldes ber eine int Variable oder bei Optimierung ber eine char Variable auslesen Ist dieser Wert 1 wurde das LSB gesetzt ist er 215 27 liegt das erste Bit auf dem MSB siehe auch Abbildung 3 5 Eine m gliche Verschiebung der Bits bei einer nderung des Datentypen wie in Abbildung 3 6 beschrieben kann mit dem folgenden Code berpr ft werden ol Kapitel 5 Implementierung x nur ein Bit wird genutzt x 2 union 3 struct 4 unsigned int b0 1 5 bits 6 unsigned int var_i 7 bitFeld1Bit_un s x 9 Bit werden genutzt 9 union 10 struct 11 unsigned int b0 1 12 unsigned int b0 8 13 bits 14 unsigned int var_i is bitFeld9Bit_un 16 setze alles zu 0 x 17 bitFeld1Bit_un var i 0 18 bitFeld9Bit_un var_i 0 19 x setze das erste Bit 20 bitFeld1Bit_un bits b0 1 21 bitFeld9Bit un bits b0 1 22 x vergleiche die int Werte x 23 if bitFeldiBit_un var_i bitFeld9Bit_un var_i 24 Zuerst werden alle Werte in beiden Unions auf 0 gesetzt Zeile 17 18 Dann wird in beiden Bitfeldern jeweils nur das niederwertigste Bit auf 1 gesetzt Zeile 20 21 und die beiden Integerwerte verglichen Zeile 23 Stimmen sie nicht berein hat sich die Anordnung der Bits ge ndert und es wird eine Warnung ausgegeben Alignment Was
82. eitstellung eines angepassten projektspezifischen Build Prozesses e Programmierung einer Funktion zur bermittlung von Daten vom Mikroprozessor zum Entwicklungssystem e bertragen des Maschinencodes auf den Mikroprozessor Starten des Programmlaufs und bergabe der Ergebnisse an die Auswertung Source code documentation generator tool Dimitri van Heesch http www doxygen org 36 Kapitel 5 Implementierung In diesem Kapitel werden die Algorithmen und Analysen f r die verschiedenen Eigen schaften aus Kapitel 3 sowie die Umsetzung der einzelnen L sungsans tze aus Kapitel beschrieben 5 1 Allgemeines 5 1 1 Programmiersprache Obwohl es um die Programmiersprache C geht entstand die Frage in welcher Sprache das Programmsystem implementiert werden sollte F r die Tests der einzelnen Eigenschaften muss C verwendet werden Der Programmablauf kann aber in jeder beliebigen Sprache implementiert werden Hierbei war es wichtig dass das Programm ohne Probleme von den Boschmitarbeitern genutzt und gepflegt werden kann Als erste Option kam C in Frage F r C spricht dass insgesamt nur eine Sprache verwen det wird Weiterhin bietet sich dadurch die M glichkeit f r das Programm und die Tests auf die gleichen Quellen zur ckzugreifen Es werden zum Beispiel viele Ergebnisse der ein zelnen Tests ber Integerkonstanten zur ckgegeben siehe 5 2 1 2 Diese k nnen in einem Header definiert und global verwendet werden
83. elt auch das Alignment also die Ausrichtung im Speicher eine Rolle Tests mit verschiedenen Compilern haben gezeigt dass das Alignment sehr unterschiedlich sein kann Es wird f r die folgenden Typen berpr ft wenn diese definiert sind char short int long long long float double long double Datenpointer Codepointer Das Alignment kann wie in Abschnitt erkl rt mit Hilfe von Strukturen herausge funden werden Wenn ein char mit dem zu untersuchenden Datentyp kombiniert wird gibt die Differenz der beiden Adressen dessen Alignment an Wegen den Eigenheiten der Pointerarithmetik k nnen die Adressen verschiedener Datentypen nicht direkt verglichen werden Deshalb wird der zu untersuchende Datentyp in diesem Fall long in einer Uni on mit einem char kombiniert Laut Standard C90 sind die Adressen der Elemente einer Union immer gleich 1 struct 2 char var c 3 union 4 long var_l 5 char help_c 6 hun 7 long str s Differenz von den Adressen der beiden char Variablen wobei die Adresse von help_c der von var_l gleicht x 9 int longAlign amp long_str un help_c amp long_str var_c Beim Datentyp char ist zwar die Gr e mit einem Byte und das Alignment mit Eins vorge geben jedoch nicht ob er signed oder unsigned interpretiert wird Zur berpr fung wird ein negativer Wert in eine char Variable geschrieben und dann getestet ob die Variable kleiner Null ist 1 char var_c char 3 2 if var_c
84. em GNU Compiler Es werden nun einige Ergebnisse vorgestellt und miteinander verglichen Die untersuchten Eigenschaften von Compilern desselben Prozessors unterscheiden sich h ufig nur in wenigen Punkten Diese lassen sich meist ber Optionen anpassen Gerade diese kleinen Unterschiede werden leicht bersehen Werden verschiedene Prozessorarchi tekturen verwendet ist auch die Anzahl der Unterschiede gr er Mit einigen Ergebnissen wurde so nicht gerechnet Zum Beispiel wurden Enumerations von keinem der analysierten Compiler gleich umgesetzt so dass die Enumerations zuk nftig vorsichtiger verwendet werden In einigen F llen entsprachen die Eigenschaften nicht dem Standard Im Anhang C ist das Ergebnis des Cosmic Compilers mit dem HC12 Mikroprozessor vollst ndig dargestellt http www gq software solutions de 74 Kapitel 6 Tests 6 1 Gleicher Prozessor verschiedene Compiler 6 1 1 HC12 Mikroprozessor MC9S12DP512 HC12 16 Bit Compiler 1 Cosmic HC S 12 Compiler v4 6 Compiler 2 Metrowerks CodeWarrior v4 6 F r die Analysen wurden beide Compiler mit ihren Standardeinstellungen verwendet Die folgende Tabelle zeigt einige Unterschiede Cosmic Metrowerks L nge von Bezeichnern 254 1023 plain char unsigned signed sizeof wchar 16 Bit 8 Bit sizeof long long not defined 32 Bit sizeof double 64 Bit 32 Bit sizeof long double 64 Bit 32 Bit Vorzeichen von plain int Bitfeldern unsigned signed Die Unte
85. en Unterschieden bei den Enumerations wird nur das int Bitfeld anders implemen tiert Der GCC interpretiert ein einfaches int bei Bitfeldern als signed int wohingegen der GreenHills es als unsigned int ansieht 6 2 Unterschiedliche Prozessoren verschiedene Compiler Mikroprozessor 1 MPC5516G PowerPC 32 Bit Compiler 1 GreenHills Multi v5 0 1 Mikroprozessor 2 MC9S12DP512 HC12 16 Bit Compiler 2 Cosmic HC S 12 Compiler v4 6 Bei diesem Vergleich gibt es gr ere Unterschiede Gerade die Gr e und das Alignment der Datentypen unterscheidet sich stark da es sich bei dem HC12 um einen 16 Bit Prozessor und bei dem PowerPC um einen 32 Bit Prozessor handelt Cosmic HC12 GreenHills PowerPC L nge von Bezeichnern 254 1023 Gr e Alignment char 8 1 8 1 wehar 16 32 short 16 1 16 2 int 16 1 32 4 long 32 1 32 4 longlong not defined 64 8 float 32 1 32 4 double 64 1 64 8 longdouble 64 1 64 8 sizeof 16 32 pointer to data 16 1 32 4 pointerDiff 16 32 pointer to function 16 1 32 4 Enumerations sieh Abb links immer signed int F llbytes in Strukturen Nein Ja 77 Kapitel 6 Tests Neben der Datentypgr e gibt es noch weitere Unterschiede besonders bei der Implemen tierung von Bitfeldern wie in Abbildung 6 3 zu sehen ist Es zeigt sich dass bei diesen Einstellungen keine Eigenschaft der Bitfelder genau bereinstimmt Gel BIO Der Cosmic Compiler weicht hier vom Standard ab da Bitfelder egal ob mi
86. en vom Standard her gro e Freiheiten gegeben so dass sich diese Meldungen nicht automatisch analysieren lassen Eine M glichkeit w re den Anwender die Compilermeldungen analysieren zu lassen und diese dann in einer definierten Form zu erfassen und weiterzuverarbeiten Daf r m sste sich der Anwender aber mit dem Compiler auskennen und es w rde das Arbeiten mit dem Programm wesentlich erschweren Stattdessen wird davon ausgegangen dass die zu analysierenden Compiler konform zum Standard C90 sind So kann Code geschrieben werden der laut Standard kompilierbar sein muss Implementationsabh ngige Eigenschaften die sich nur w hrend des Kompilierens pr fen lassen k nnen dann so in den Code eingebaut werden dass sie je nach Implemen tierung kompiliert werden k nnen oder einen Fehler verursachen Das hei t es werden kleine Module erstellt in denen erwartungsgem nur an exakt einer Stelle ein Compiler fehler auftreten kann Diese Module werden dann einzeln kompiliert Anhand des Erfolgs oder Misserfolgs des Kompilierens l sst sich dann die Implementierung der jeweiligen Ei genschaft erkennen ohne die Diagnosemeldungen des Compilers zu analysieren Dieses Vorgehen erh ht zwar die Anzahl der vorzunehmenden Durchl ufe erheblich l sst sich daf r aber automatisieren was die Bedienbarkeit erh ht Da der Vorgang im Hinter grund ablaufen kann ist es nicht wichtig ob es zehn Minuten oder drei Stunden dauert Der Anwender kann w hrendd
87. enketten Strings und einzelne Zeichen void rbCEval outputNumber long void rbCEval_outputString char void rbCEval_outputChar char Zahlen werden dementsprechend auch als String ausgegeben miissen aber zuerst umge wandelt werden Dies ginge mit der Bibliotheksfunktion sprintf Da jedoch auf Bi bliotheken verzichtet werden muss wurde die Umwandlung neu implementiert Es k nnen daher nur ganze Zahlen des Wertebereichs von Long ausgegeben werden Damit die Ergebnisse f r die Auswertung lesbar sind werden sie im Format name wert ausgegeben F r die Auswertung muss dann nur bekannt sein welche Eigenschaft sich hinter dem Namen verbirgt und welche Bedeutung der Wert hat Zur vereinfachten Ausgabe der Ergebnisse gibt es die folgende Ausgabefunktion die di rekt das geforderte Format erstellt und anhand derer zu sehen ist wie die anderen drei Funktionen eingesetzt werden an 40 Kapitel 5 Implementierung 1 void rbCEval_outputResult char name_pc int result_i e 3 rbCEval_outputString name_pc 4 rbCEval_outputChar 5 rbCEval_outputNum result_i 6 rbCEval_outputChar n 5 2 1 4 Weitere Hilfsfunktionen Ben tigte mathematische Operationen wie beispielsweise Potenzen und Betrag sind in Hilfsfunktionen implementiert So wird vermieden dass entsprechende Bibliotheken ein gebunden werden m ssen Auf diese Funktionen wird nicht n her eingegangen da sie nur indirekt mit den zu i
88. erhandbuch 100 User Manual Compiler Evaluation Tool This document shall give an overview of the structure and usage of the compiler evaluation software Index BUrDose EE 1 S tructure of Ihe Programme rt id 1 A nl dsbalbeik b ir all abi 3 E PRG Pat atom A a 3 1 1 A E 3 LX COMPE e re whine ee wate ee 3 1 3 A geben 3 Qe Initializ tion za 20a rain RR IR ER ER SEE NIS bes 4 Se Feet ke ee eebe eege Eege 4 4 Flash Microcontroller and run the 1 test 4 de Startthe SECON ES y a 4 6 Flash microcontroller and run the 2 test 4 T7 Start AA mare nur en a dees dee ege e d 4 8 Flash microcontroller and run the 3 test 4 9 Start the fourth test optional anna Saas 5 10 Flash microcontroller and run the 4 test 5 11 EBEN 5 Folder Struct re nenn alas lasse AS 5 hee e 7 Purpose of the tool This tool analyses C compiler based on the C standard ISO IEC 9899 1990 C90 ANSI C It evaluates the actual implementation of features which are implementation defined according to the standard You will find a list of the currently tested features in the appendix Some examples are the size of various types rounding behaviour and the maximum length of identifiers The results of these tests will give you a quick overview about the compiler its settings and the used processor This information can be used to adjust compiler options modify already existent code and to configure QA C without reading the whole handbook The tool
89. es mit dem Alignment in Bitfeldern auf sich hat wird in Abbildung beschrie ben Um herauszufinden ob ein Bitfeld auf eine Einheit begrenzt ist oder zwei Einheiten berlappen kann wird die Gr e der folgenden Struktur bestimmt 1 struct 2 int bits1 6 3 int bits2 16 A int bits3 10 5 bitFeld str 52 Kapitel 5 Implementierung Insgesamt werden nur 32 Bits verwendet Ist sizeof bitFeld_str gleich 4 werden keine F llbits verwendet Abbildung rechts Bei sizeof bitFeld_str gleich 6 werden F llbits genutzt wie auf der linken Seite der Abbildung 3 4 dargestellt Signedness F r die Analyse ob ein einfaches int Bitfeld als signed oder unsigned interpretiert wird werden alle Bits eines int Bitfeldes auf 1 gesetzt und berpr ft ob der Wert positiv oder negativ ist M gliche Datentypen In den Common Extensions der Portability Issues vgl Anhang A wird erw hnt dass Bitfelder auch mit anderen Datentypen als int deklariert werden k nnen Deshalb wird weiterhin berpr ft welche Datentypen vom Compiler f r Bitfelder zugelassen werden Dies geschieht w hrend der Compilerfehleranalyse da beispielsweise ein long Bitfeld zu einem Compilerfehler f hren kann 5 2 2 11 Gleitkommazahlen Referenz 3 1 6 Bei den Gleitkommazahlen muss untersucht werden wie sie intern dargestellt werden wie pr zise gerechnet wird und wie das Rundungsverhalten ist F r die interne Darstellung ist die Erf llun
90. eschreibt wie das Programmsystem CEval zu verwenden ist Sie gibt einen kurzen Einblick in die Arbeitsweise eine Beschreibung der vom Anwender durchzuf hrenden Schritte und Erkl rungen zu den Ergebnissen Diese Anleitung ist in Word verfasst und im Anhang B hinterlegt Bei der zweiten handelt es sich um eine Administrator Dokumentation Hierin wird be schrieben wie das Programm intern funktioniert wie die verschiedenen Skripte und Datei en zusammengeh ren und wie das Programm erweitert werden kann Diese Dokumentation ist im Quellcode integriert und l sst sich mit dem Tool Doxygen f r die C Dateien und mit dem Tool perldoc f r die Perlskripte erzeugen Beide Tools generieren HTML Dateien 73 Kapitel 6 Anwendung und Ergebnisse In diesem Kapitel wird auf die Anwendung des Programmsystems und auf einige Ergeb nisse eingegangen W hrend der Entwicklung wurde auf einem HC12 Mikroprozessor der Firma Freescale und direkt auf dem PC getestet F r den HC12 wurde der Cosmic Compiler genutzt f r den PC der GNU Compiler Um die Compiler besser vergleichen zu k nnen wurde f r jeden Prozessor ein zweiter Compiler analysiert der Metrowerks CodeWarrior der Firma Freescale f r den HC12 und der freie le Compiler fiir den PC Zum Ende der Entwicklung wurde das Programmsystem in realen Projektumgebungen eingesetzt auf einem ARM 32 Bit RISC Prozessor mit einem ARM Compiler und auf einem PowerPC mit einem GreenHills Compiler sowie mit d
91. ese beiden Prozesse werden f r die verschiedenen Tests mehrmals durchlaufen Zum Schluss m ssen dann noch die Ergebnisse aus den verschiedenen Durchl ufen zusam mengefasst ausgewertet und in eine leserliche Form gebracht werden Dadurch kommt ein abschlie ender Prozess hinzu Es ergeben sich die folgenden drei Prozesse die unterschied lich oft durchlaufen werden 1 Kompilieren des Quellcodes und Linken der verschiedenen Objekte Build Prozess 2 Test auf dem Mikroprozessor Programmlauf 3 Auswertung und anwenderfreundliche Darstellung der Ergebnisse Auswertung 29 Kapitel 4 Programmsystem 4 3 Datenmodell Bei der Entwicklung von Software f r eingebettete Systeme werden wie in Abschnitt beschrieben Crosscompiler eingesetzt Der Code f r den Mikroprozessor wird auf einem PC oder anderem System generiert und dann auf den Mikroprozessor geladen Die Er gebnisse des Programmlaufs m ssen der Auswertung zur Verf gung gestellt werden das hei t es m ssen auch Daten vom Mikroprozessor gelesen werden Das Laden und Aus lesen von Daten auf und vom Mikroprozessor l sst sich w hrend der Entwicklungsphase nur schwer automatisieren Deshalb m ssen die drei gerade definierten Prozesse getrennt betrachtet werden Das Kompilieren und Linken sowie die Auswertung finden auf dem PC statt wohingegen der Programmlauf auf dem Mikroprozessor durchgef hrt wird Das Datenflussdiagramm in Abbildung 4 1 stellt diesen Vorgang graphisch da
92. essen andere Arbeiten erledigen Damit dieses System funktioniert muss dem Programmsystem CEval mitgeteilt werden ob der Kompiliervorgang erfolgreich war Um von R ckgabewerten unabh ngig zu sein mit denen ein Build Prozess eventuell schon seinen Status signalisiert wird dem Anwen der vorgegeben dass bei einem erfolgreichen Durchlauf eine bestimmte Textdatei erzeugt werden muss Das Programmsystem pr ft ob diese Textdatei vorhanden ist Falls dies nicht der Fall ist trat beim Build Prozess ein Fehler auf 4 4 3 Programmierung des Mikroprozessors Ein weiterer Arbeitsschritt der sich nicht automatisieren l sst ist das Herunterladen des Maschinencodes auf den Mikroprozessor Der Anwender muss daf r sorgen dass der ausf hrbare Maschinencode bertragen und der Programmlauf gestartet wird Damit das Herunterladen so selten wie m glich geschehen muss werden die Tests im Gegensatz zur Vorgehensweise f r Compilerfehler so weit wie m glich zusammengefasst und anhand vor heriger Ergebnisse angepasst So soll sichergestellt werden dass der Code der tats chlich 33 Kapitel 4 Programmsystem auf dem Mikroprozessor l uft keine Compilerfehler erzeugt Es l sst sich jedoch nicht vermeiden auch auf dem Mikroprozessor mehrere Durchl ufe auszuf hren Einige Analysen basieren auf Ergebnissen von vorherigen Analysen Es gibt auch Analysen die zu einem Laufzeitfehler f hren k nnen wie beispielsweise die Unter suchung des
93. ession errno to the value of the macro ERANGE on underflow range errors 7 5 1 Whether a domain error occurs or zero is returned when the mod function has a second argument of zero 7 5 6 4 The set of signals for the signal function 7 7 1 1 The semantics for each signal recognized by the signal function 7 7 1 1 The default handling and the handling at program startup for each signal recognized by the signal function 7 7 1 1 If the equivalent of signal sig SIG_DFL is not executed prior to the call of a signal handler the blocking of the signal that is performed 7 7 1 1 Whether the default handling is reset if the SIGILL signal is received by a handler specified to the signal function 7 7 1 1 Whether the last line of a text stream requires a terminating new line character 7 9 2 Whether space characters that are written out to a text stream immediately before a new line character appear when read in 7 9 2 The number of null characters that may be appended to data written to a binary stream 7 9 2 Whether the file position indicator of an append mode stream is initially positioned at the beginning or end of the file 7 9 3 206 Portability issues Annexes ISO IEC 9899 1990 E Whether a write on a text stream causes the associated file to be truncated beyond that point 7 9 3 The characteristics of file buffering 7 9 3 Whether a zero length file
94. eutet h tten zweitens weil nicht genug Zeit zur Verf gung stand und drittens weil die bertragbarkeit der Er gebnisse der Analysen nicht gegeben war SU Ausblick Ausblick Das Programmsystem CEval bietet eine Basis f r weitere Analysen die sich nicht nur auf den Standard C90 beziehen m ssen Durch den modularen Aufbau in mehreren Perlskrip ten lassen sich neue Analysen ohne gro en Aufwand einbinden Vorstellbar sind unter anderem Analysen zu den folgenden Themen Untersuchung der undefinierten und nicht n her spezifizierten Eigenschaften un defined and unspecified features berpr fung ob der Compiler bestimmte Eigenschaften gem dem Standard im plementiert hat Die bisherigen Analysen haben gezeigt dass einige Compiler sich nicht immer genau an den Standard halten beispielsweise werden als signed deklarierte Bitfelder ein fach als unsigned interpretiert Daher ist es sinnvoll auch definierte Eigenschaften zu untersuchen wenn sie in Verdacht stehen vom Standard abzuweichen Laufzeitmessungen Mit Laufzeitmessungen k nnte die Effizienz des Compilers bei der Umsetzung be stimmter Programmkonstrukte untersucht werden Beispielsweise wie schnell Be rechnungen mit Gleitkommazahlen durchgef hrt werden oder wie effizient Schlei fen umgesetzt werden Hierf r m ssten Timer genutzt werden Diese k nnen nicht allgemein angesprochen werden und m ssten vom Anwender implementiert wer den Ist
95. ex G 3 entnommen 10 Kapitel 3 Zu analysierende Eigenschaften 3 1 1 Translation Mit Translation sind die acht Phasen der bersetzung eines Programms gemeint Diese k nnen vom Compilerhersteller zusammengefasst werden In diesem Zusammenhang kann ein Hersteller Diagnosemeldungen selbst definieren Der Standard gibt nur vor dass bei einem Fehler eine Meldung erzeugt werden muss Wie diese auszusehen hat ist nicht fest gelegt ISO90 5 1 1 3 Da der Fantasie der Compilerentwickler in diesem Punkt keine Grenzen gesetzt sind wird auf diesen Punkt nicht n her eingegangen Wie im Programmablauf trotzdem Compiler fehler erkannt werden wird in 4 4 2 erkl rt 3 1 2 Environment Dieser Punkt geht auf die Umgebung einer Anwendung ein zum einen wie Argumente an die Funktion main bergeben werden S090 5 1 2 2 1 und zum anderen was ein inter aktives Device ausmacht Der erste Punkt ist f r eingebettete Systeme nicht interessant da ein Programm normalerweise nicht interaktiv aufgerufen wird Weiterhin ist es generell nicht m glich zu wissen welche internen oder externen Kompo nenten ein beliebiger Mikroprozessor ansteuern kann und wie dieses geschieht Das hei t ob und wie der Prozessor mit seiner Au enwelt kommunizieren kann h ngt nicht mit dem Standard zusammen und wird deshalb auch nicht n her betrachtet 3 1 3 Identifiers Identifier oder Bezeichner miissen vom Pr prozessor Compiler und Linker nur bis zu
96. eziell f r ihren Aufgabenbereich entwickelt und optimiert Dies macht sie effizienter zuverl ssiger und kosteng nstiger Je nach Anforderung werden die verschiedenen Aufgaben in Hardware oder in Software im plementiert Die Software unterscheidet sich stark von normaler PC Software Kleine Systeme haben z B kein Betriebssystem Weiterhin k nnen eingebettete Systeme wenn sie fertig entwickelt und in das Produkt eingebaut sind oft gar nicht oder nur noch mit gro em Aufwand ge ndert werden Anders als beim PC l sst sich also eine fehlerhafte Software nicht kosteng nstig durch ein Update oder Patch korrigieren zumal dann bli cherweise eine gro e Anzahl an Ger ten betroffen ist Auch die Firma Bosch verwendet in vielen Produkten eingebettete Systeme Gerade wenn in kritischen Systemen wie z B in einem Motorsteuerger t oder im Steuerger t f r das ABS ein Softwarefehler auftritt kann dies zu R ckrufaktionen f hren die immense Kos ten verursachen oder aber im schlimmsten Fall zu Unf llen f hren Deshalb werden die Steuerger te und deren Software vor der Markteinf hrung ausgiebigen Tests unterzogen Anti Blockier System Kapitel 2 Hintergrund Dieses Programm soll dazu beitragen Fehler auf Grund von falschen Annahmen schon bei der Entwicklung zu vermeiden Ein weiterer Unterschied zu PC Software ist dass die Entwicklung der Software nicht auf dem System stattfindet auf dem sie sp ter zum Einsatz kommt Es ko
97. folgenden Codeausschnitt zeigt wie dieser Ablauf in Perl umgesetzt wird 10 11 12 13 14 Perl Code Kopiere vordefinierten Quellcode sources sourcePath rbCEval_001 c sourcePath dummy2 c sourcePath dummy3 c sourcePath rbCEvalTools c sourcePath dummy _toolKit c sourcePath rbCEvalOut c copySource sources targetFiles schreibe neuen Quellcode open FILE gt targetFiles 4 print FILE include rbCEval h An print FILE void rbCEval_FILE void n 69 Kapitel 5 Implementierung 16 print FILE int result n r print FILE rbCEval_sizeofByte amp result n s print FILE n 19 close FILE 20 21 Starte den Build Prozess 22 amp compile compileSkript 23 24 Werte das Ergebnis des Build Prozesses aus 2 if checkResult compResult 1 26 Build Prozess erfolgreich evtl Header anpassen 27 TE 23 jelse 29 30 Zuerst wird in den Zeilen 4 9 das Array sources mit Dateinamen angelegt deren Inhalt mit Hilfe der Subroutine copySource in Zeile 10 in die Dateien rbCEval_x c geschrie ben werden Deren Dateinamen befinden sich im Array targetFiles Dieser Schritt muss durchgef hrt werden auch wenn kein vordefinierter Quellcode getestet werden soll F r einen erfolgreichen Build Prozess m ssen die sechs Dateien rbCEval_x c immer g ltigen C Code enthalten In einer
98. ften des Standards C99 Bei den Untersuchungen ist deutlich geworden dass viele Compiler schon Eigenschaf ten des neueren Standards C99 integriert haben Compiler k nnten deshalb gezielt auf bestimmte neue Eigenschaften untersucht werden F r den Datentyp long long und dem Kommentar sind bereits Analysen implementiert 82 Eigenst ndigkeitserkl rung Eigenst ndigkeitserkl rung Hiermit erkl re ich dass ich die vorliegende Diplomarbeit selbstst ndig verfasst und keine anderen Quellen und Hilfsmittel als die aufgef hrten verwendet habe Die benutzten Quel len w rtlich oder inhaltlich entnommenen Stellen habe ich als solche kenntlich gemacht Ort Datum Unterschrift 83 Glossar Alignment ANSI Balancing Big Endian C90 C99 Cast Compiler Die Zahl durch die die Speicheradresse teilbar sein muss American National Standardization Institute Angleichen von Datentypen bei arithmetischen Operationen Das h chstwertigste Byte einer Variable Zahl liegt auf der niederwertigs ten Speicheraddresse ISO TEC 9899 1990 C Standard ISO IEC 9899 1999 C Standard neuere Version Datentypkonvertierung bersetzt den Quellcode in Maschinensprache erzeugt Objektcode Einerkomplement Eine Darstellung negativer Bin rzahlen Der Betrag einer negativen EN 29899 Endianess IEC Zahl ergibt sich wenn alle Bits invertiert werden hat zwei Darstellungen fiir 0 Europ ische Norm entspricht inhal
99. g initialisiert und um ein Bit nach rechts verschoben Ist ihr Wert danach immer noch 1 handelt es sich um eine arithmetische Verschiebung 1 signed int var_si l 2 var_si gt 1 4 if var si l 5 arithmetisch mit dem MSB aufgef llt x 6 else 7 logisch mit 0 aufgef llt x s 5 2 2 7 Datentypkonvertierung Referenz 3 1 5 Die Untersuchung des Verhaltens bei der Konvertierung zu kleineren signed Datentypen geht auf die folgenden M glichkeiten ein 1 unsigned char signed char Ein zu gro er positiver Wert vom gleichen Typ soll in einem signed char gespeichert werden 2 signed long signed char Ein zu gro er negativer Wert eines gr eren Typen soll in einem signed char ge speichert werden 3 unsigned long signed char Ein zu gro er positiver Wert eines gr eren Typen soll in einem signed char ge speichert werden Zur Untersuchung wird ein bestimmtes Bitmuster in drei Variablen des jeweils ersten Typen geschrieben diese werden dann zu signed char konvertiert und das Bitmuster wird analysiert Dabei wird das Zweierkomplement vorausgesetzt Auch wenn der Standard C90 es offen l sst sollte sich das Bitmuster nicht ndern da dies zus tzliche interne Berechnungen zur Folge h tte Deshalb wird nur berpr ft ob das Bitmuster gleich bleibt Das Codebeispiel zeigt die Analyse der ersten M glichkeit 1 unsigned char var_uc 129 Bitmuster 10000001 x 2 si
100. g der Formel aus Abschnitt 3 1 6 ausschlaggebend p esse eb k 1 mit x normalisierte Gleitkommazahl f gt 0 2 4 0 s sign 1 b Basis p Pr zision Anzahl der Basis b Stellen im signifikanten Teil e Exponent Integer zwischen emin lt lt emas fk nicht negatives Integer kleiner als b Die folgenden Berechnungen basieren zum Teil auf Algorithmen die dem Programm pa ranoia c entnommen sindP C Programm f r umfassende Tests der Gleitkommaarithmetik This program is credited to W M Kahan B A Wichmann David M Gay Thos Sumner and Richard Karpinski 53 Kapitel 5 Implementierung Interne Darstellung s belegt in jedem Fall 1 Bit da es nur das Vorzeichen angibt Die Basis b wird anhand der folgenden Schritte berechnet Bestimme den float Wert W so dass W 1 nicht ohne Genauigkeitsverlust abge speichert werden kann Erzeuge einen weiteren float Wert Z W Y wobei Y soweit erh ht wird bis die Differenz Z W 0 ergibt Die Basis ist dann gleich dieser Differenz b Z W Zur besseren Lesbarkeit des Codes wird base statt b verwendet sowie im n chsten Aus schnitt precision statt p 1 10 11 12 13 14 volatile float base W Y Z W 1 0f Schritt 1 do W W W Y W 1 0f Z Y W Y Z 1 0f while 1 0f abs Y lt 0 0 jetzt ist W gro genug damit W 1 W 1 gt 1 Y 1 0f Sch
101. gned char var_sc signed char var_uc 3 if var_c 127 4 ds Bitmuster unver ndert x 48 Kapitel 5 Implementierung 5 else 6 ds Warnung Bitmuster hat sich ver ndert ro 5 2 2 8 Strukturen Referenz 3 1 9 Zus tzlich zum Alignment der einzelnen Datentypen dessen berpr fung in Abschnitt 5 2 2 3 beschrieben wird findet eine Untersuchung der Gr e von Strukturen statt Es geht darum ob sich die Gr e bei einer unterschiedlichen Reihenfolge der Elemente ndert 1 struct 2 char varc 3 int var_i 4 ci_str 6 struct 7 int vari 8 char var ci 9 ic str Hat int in diesem Beispiel ein gerades Alignment wird in der ersten Struktur ci_str ein F llbyte verwendet und die gesamte Struktur ben tigt 4 Byte Untersucht wird ob auch bei der zweiten Struktur ic_str nach dem char noch ein F llbyte hinzugef gt wird und sich damit die Gr e nicht ge ndert hat Da sich der sizeof Operator auf den Abstand zweier Elemente eines Arrays bezieht kann er in diesem Fall nicht verwendet werden Damit var_i auch in einem Array immer an einer geraden Adresse liegt muss die Struktur ic_str ebenfalls die Gr e 4 Byte haben Laut Standard m ssen die einzelnen Elemente einer Struktur abgesehen von F llbytes in aufeinanderfolgenden Speicherbereichen liegen ISO90 6 5 2 1 Untersucht wird deshalb eine verschachtelte Struktur bei der nach der inneren Struktur ein char folgt 1 stuct 2 struct
102. h ngigen Eigenschaften k nnen in drei Klassen unterteilt werden siehe Kapitel 3 e Nicht priifbare Eigenschaften wie Diagnosemeldungen Hier sind dem Hersteller so viele Freiheiten gegeben dass nicht alle M glichkeiten ab gesehen und deshalb auch nicht sinnvoll getestet werden k nnen Weiterhin k nnen einige speicherbezogene Eigenschaften nur berpr ft werden wenn der Assembler code oder die map Datei analysiert werden Darauf ist das Programmsystem nicht ausgelegt da sich auch diese von Compiler zu Compiler stark unterscheiden k nnen e Eigenschaften die sich nur beim Kompilieren oder Linken feststellen lassen wie die maximale L nge von Bezeichnern oder ob der Compiler eine Division durch Null erkennt Hier m ssten Compilermeldungen analysiert werden was aber im ersten Punkt aus geschlossen wird Eine andere M glichkeit wird in Abschnitt 4 4 2 erkl rt elf executable and linking format Es gibt auch noch diverse andere Formate Die einfachste Form w re der reine Maschinencode in einer hex Datei 28 Kapitel 4 Programmsystem e Eigenschaften die in einem laufenden Programm berpr ft werden Dies sind die meisten Eigenschaften zum Beispiel wie Datentypen umgewandelt werden negative Zahlen intern dargestellt werden usw F r die Tests ergeben sich somit zwei Hauptphasen das Kompilieren und Linken zusam mengefasst im Build Prozess sowie der tats chliche Programmlauf auf dem Mikroprozes sor Di
103. har wchar shor int long long long float double long double sizeof data pointer function pointer pointer difference Alignment of data types char short int long long long float double long double data pointer function pointer Size and sign of enumerations various enumerated lists Padding in structs fill bytes used or not Modulo and Division of integer values e with negative operands e during preprocessing e with zero constant e with zero during run time volatile variable Casts to smaller signed type change of bit pattern Floating Point e base e mantissa not normalized hence one bit more than internally stored e epsilon to 1 smallest difference to 1 Rounding behaviour of floating point types e cast from integer to float if a decimal value is not representable like 0 1 Bit fields padding alignment bit order type of bit fields char short long long long int is standard Macros optional content of preprocessing macros Anhang C Ergebnisse 1 Analyseergebnis Mikorprozessor MC9S12DP512 HC12 Freescale Compiler Cosmic HC S 12 C Compiler v4 6 2 Vergleich zweier Analyseergebnisse mit dem Programm Beyond Compare einem Vergleichstool dass die Unterschiede farbig markiert Mikorprozessor MC9S12DP512 HC12 Freescale Compiler 1 Cosmic HC S 12 C Compiler v4 6 Compiler 2 Metrowerks CodeWarrior v4 6
104. ich gerundet x define RB_CEVAL_DIV_NEG LESS EQUAL 2 Sprechende Namen f r die Konstanten sorgen somit f r besser lesbaren Quellcode Allge mein haben die Funktionen f r die Analysen den folgenden Aufbau void rbCEval_Funktionsname Parameter_l Parameter_2 39 Kapitel 5 Implementierung Zeiger auf Ergebnis 1 Das hei t Ergebnisse werden einheitlich nicht als R ckgabewert ausgegeben Stattdessen muss die Adresse an der das Ergebnis gespeichert werden soll an die Funktion bergeben werden Das hat den Vorteil dass Funktionen die nur ein Ergebnis liefern und Funktionen die mehrere Ergebnisse liefern den gleichen Aufbau haben Neben den Funktionen f r die eigentlichen Tests gibt es noch Funktionen zur allgemeinen Verwendung 5 2 1 3 Ausgabefunktionen Die Ausgabe vom Mikroprozessor zur ck zum Entwicklungsrechner findet wie in Ab schnitt beschrieben zeichenweise statt und muss vom Anwender in der Funkti on rbCEval_outputByte unsinged char bereitgestellt werden Zeichenweise hei t hier dass f r jedes Zeichen der zugeh rige ASCII Code bertragen wird Da der Zeichensatz auf dem Mikroprozessor aber nicht ASCII sein muss wird jedes Zeichen vor der bertragung in den entsprechenden ASCII Code umgewandelt Daf r sorgen interne Ausgabefunktionen die auf die bereitgestellte Funktion rbCEval_outputByte unsinged char zur ckgreifen Intern gibt es die folgenden Ausgabefunktionen f r Zahlen Zeich
105. ion 5 1 2 The behavior if a printable character is written when the active position is at the final position of a line 5 2 2 The behavior if a backspace character is written when the active position is at the initial position of a line 5 2 2 The behavior if a horizontal tab character is written when the active position is at or past the last defined horizontal tabulation position 5 2 2 The behavior if a vertical tab character is written when the active position is at or past the last defined vertical tabulation position 5 2 2 The representations of floating types 6 1 2 5 The order in which expressions are evaluated in any order conforming to the precedence rules even in the presence of parentheses 6 3 The order in which side effects take place 6 3 The order in which the function designator and the arguments in a function call are evaluated 6 3 2 2 The alignment of the addressable storage unit allocated to hold a bit field 6 5 2 1 The layout of storage for parameters 6 7 1 The order in which and operations are evaluated during macro substitution 6 8 3 3 Whether errno is a macro or an external identifier 7 1 4 Whether set jmp is a macro or an external identifier 7 6 1 1 Whether va_end is a macro or an external identifier 7 8 1 3 The value of the file position indicator after a successful call to the ungete function for a text stream until all pushed back characters are read or
106. ion des urspr nglichen Wertes mit dem maximalen Wert des Zieldatentyps plus eins Bei der internen Darstellung im Zweierkomplement ver ndert sich dabei kein Bit Ist der Zielda tentyp jedoch signed bestimmt die Implementierung wie ein zu gro er Wert konvertiert wird IS090 6 2 1 2 Wichtig f r den Softwareentwickler ist dabei ob sich das Bitmuster der internen Darstel lung ndert oder das Muster beibehalten wird Division und Modulo Die Integer Division hat immer ein ganzzahliges Ergebnis Modulo ergibt den Rest der Integer Division Die folgende Formel stellt den Zusammenhang der beiden Operationen dar a b b a b a F r positive Zahlen wird festgelegt dass das Ergebnis der Division immer zur n chstklei neren Zahl gerundet wird Dementsprechend ist auch das Ergebnis von Modulo festgelegt Ist eine der beiden Zahlen negativ ist es implementationsabh ngig ob das Ergebnis einer Division die n chste ganze Zahl kleiner gleich oder gr er gleich dem Quotienten ist Die folgenden Kombinationen erf llen die Formel 9 5 1 gt 9 5 4 9 5 1 oder 2 gt 9 5 4 oder 1 9 5 1 oder 2 gt 9 5 4 oder 1 9 5 1 oder 2 gt 9 5 4 oder 1 Bei der Division wird normalerweise das erste Ergebnis erwartet 1 sowie bei Modulo wenigstens der Betrag des ersten Ergebnisses 4 weshalb eine berpr fung des imple mentierten Verhaltens wichtig ist 15 Kapitel 3 Zu analysierende Eigenschaften
107. is written in C and Perl To use it some basic understanding of both programming languages is recommended Furthermore you should be familiar with the build process of your project Structure of the programme The Evaluation Tool consists of a bunch of predefined C files and Perl scripts The Perl scripts control the flow of the programme To test the various implementation defined features it is necessary to have multiple compile processes For each compile process the Perl scripts generate the necessary C files into a user defined folder under the names rbCEval_0 c rbCEval_5 c It then calls the user defined compile script and waits until it is finished If the compile and link process was successful and only then the compile script has to return the success status by returning a text file The directories where the files shall be placed can be configured in the file rbCEval_config pm The Perl script then checks if the text file exists This is a very general way of checking if the files did compile link because the evaluation tool cannot parse the compiler linker output The information is read stored and the text file will be deleted before the next run Now the next set of C files is generated and the process is repeated Each script stores the compiler results into a text file compResult_x txt so they won t be lost for further evaluation Each of the currently 4 Perl scripts generates an executable at its end which has to be fla
108. ision mantissa of double 52 bits precision mantissa of double 22 bits precision mantissa of long double 52 bits precision mantissa of long double 22 bits exponent of float B bits exponent of float 9 bits exponent of double 11 bits exponent of double 9 bits exponent of long double 14 bats exponent of long double 9 bits representable minimal difference epsilon to 1 representable minimal difference epsilon to 1 it might be smaller it might be smaller epsilon for float ca 10 6 epsilon for float ca 10 6 epsilon for double TAr ADASI lt gt epsilon for double cam Ee epsilon for long double ca 10 15 epsilon for long double ca 10 6 Beyond Compare 2 3 1 Abbildung 6 2 Vergleich von Gleitkommazahlen auf dem HC12 Mikroprozessor Im Anhang C befindet sich ein vollst ndiger Vergleich der beiden Ergebnisse Die Mantisse von float hat normalerweise 23 Bit die Anzahl der Bits in einem long ist mindestens 32 In einem float lassen sich Integerwerte bis zu 274 ohne Genauigkeitsverlust darstellen in einem double mit 953 normalerweise 52 Mantissenbits bis zu 2 Dieser Wert ist als Integerwert in einem long mit 32 Bit nicht mehr darstellbar 76 Kapitel 6 Tests 6 1 2 PowerPC Mikroprozessor MPC5516G PowerPC 32 Bit Compiler 1 GreenHills Multi v5 0 1 Compiler 2 GNU C Compiler v3 4 4 Auf dem PowerPC gibt es bei den analysierten Compilern fast keine Unterschiede Neben kleiner
109. ispiel mit berl ufen gerechnet ist es wichtig ob dieser schon bei 128 oder erst bei 256 auftritt oder ob negative Zahlen darstellbar sind Multibyte Characters Neben dem Standardzeichensatz bietet C auch die M glichkeit andere Zeichen zu verwen den Dazu sind sogenannte multibyte charaters definiert Der Datentyp f r diese Zeichen ist wchar wide character Da deren Verwendung bei eingebetteten Systemen jedoch nicht praktikabel ist wird im Rahmen dieser Analyse nicht weiter darauf eingegangen Genauer wird dieser Datentyp auch erst in einer nderung des Standards ISO IEC 9899 Amd 1 aus dem Jahre 1993 definiert 3 1 5 Integers Im Bereich der Integertypen gibt es ebenfalls eine Reihe von compilerabh ngigen Eigen schaften Dabei handelt es sich neben der Gr e der einzelnen Datentypen haupts chlich um den Umgang mit negativen Zahlen Gr e und interne Darstellung der verschiedenen Datentypen Der Standard legt f r die verschiedenen Datentypen short int und long nur Mindest gr en fest F r unsigned int liegen diese bei 0 65535 und f r signed int bei 32767 32767 also jeweils 16 Bit Je nach Compiler kann ein int auch mit mehr Bits dargestellt werden blicherweise dann mit 32 Bit Eine Auswirkung der unterschiedlichen Gr e wur de in Abschnitt Beispiel 2 erkl rt Wie gro die einzelnen Datentypen genau sind soll durch die Analyse festgestellt werden Weiterhin wird auch die interne Darstellung vo
110. lude commands include Header h if certain headers should be included for the macro test optional This test will give you the content of the macros you pass in a text file to the script each macro in a separate line The test is optional 10 Flash microcontroller and run the 4 test Run the third test on the Microcontroller The results of the test must be written into the file run4 txt 11 Get the final result perl evaluation pl f This script will collect all results and display them in a readable format on stdout For further explanation read the file documentation Folder structure CEval admin base L c_sourcen docs example include source tmp obj out CEval Main folder of the tool It contains the Perl scripts used Perl modules 1 nrto Perl script for initialization 2 runl pl Perl script for the first run 3 TUnz pl Perl script for the second run 4 run3 pl Perl script for the third run 5 run4 pl Perl script for the fourth run optional 6 evaluation pl Perl script to produce the final result 7 rbCEval_config pm main configuration file 8 rbCEval_vars pm Perl module where global variables and file names are defined 9 rbCEval_subroutines Perl module used by the start scripts 10 rbCEval_const pm automatically generated Perl module with the integer constants admin e const pl script to generate base c_sourcen rbCEval_const hand rbCEval_const pm e con
111. mmen so ge nannte Crosscompiler zum Einsatz Diese laufen z B auf einem PC und generieren den f r den verwendeten Mikroprozessor passenden Maschinencode der dann im Mikropro zessor gespeichert wird Die Entwicklungsumgebung source environment unterscheidet sich also von der endg ltigen Umgebung execution environment Oft kann die Software w hrend der Entwicklungsphase erst sehr sp t auf dem tats chlichen System getestet wer den Fr here Tests werden h ufig mit Simulationen oder speziellen Entwicklungsboards durchgef hrt Diese k nnen aber meist nicht alle Aspekte simulieren was eine weitere Fehlerquelle darstellt 2 2 Die Programmiersprache C 2 2 1 Ein kleiner Exkurs zum Build Prozess Jemand der die Programmiersprache C kennenlernt f ngt wie bei jeder Sprache klein an Das hei t er lernt die Syntax kennen die Struktur und schreibt schnell das bekannte Hello World Programm Dieses wird kompiliert und es entsteht dann ein ausf hrbares Programm welches Hello World auf den Bildschirm schreibt Solange man sich mit kleinen Programmen und bungen besch ftigt bleiben einem wichtige Schritte auf dem Weg vom Quellcode zum fertigen Programm verborgen Der Standard unterteilt diesen Weg in acht Teile den sogenannten Translation Phases In diesem Zusammenhang reicht aber auch die Unterteilung in drei Phasen 1 Pr prozessor Der Pr prozessor bersetzt den Quellcode in den Standardzeichensatz ersetzt Ma
112. mmsystem eingebunden werden dass m glichst wenig Eingriffe vom Anwender n tig sind Der Programmablauf wird durch mehrere Perlskripte gesteuert die nacheinander vom Anwender aufzurufen sind 1 init pl berpr ft den vom Anwender angepassten Build Prozess und die Konfigurationspa rameter bevor die eigentlichen Analysen beginnen siehe Abschnitt 5 3 3 2 2 runi pl Hauptskript in dem alle Compilerfehleranalysen durchgef hrt werden und der Ma schinencode f r den Hauptprogrammlauf erzeugt wird 3 run2 pl Erzeugung des Maschinencodes f r Modulo mit Null 4 run3 pl Erzeugung des Maschinencodes f r die Division durch Null 5 run4 pl Erzeugung des Maschinencodes um den Inhalt von Makros anzuzeigen 6 evaluation pl Wertet die Ergebnisse der Compilerfehleranalysen und der Programml ufe aus und gibt sie in lesbarer Form wieder 65 Kapitel 5 Implementierung Zus tzlich gibt es die folgenden Perlmodule e rbCEval_config pm Konfigurationsdatei in der der Anwender Verzeichnisse anpassen und das Komman do zum Starten des Build Prozesses eintragen muss siehe Abschnitt 5 3 3 2 e rbCEval_subroutines pm Enth lt Subroutinen die von mehreren oder allen Perlskripten genutzt werden e rbCEval_vars pm Erstellt und initialisiert globale Variablen die im gesamten Programmsystem ver wendet werden e rbCEval_const pm Enth lt die Zuordnung der in Abschnitt 5 2 1 2 beschriebenen Integerkonstanten zu
113. modified and accessed other than to determine the new value between two sequence points 6 3 An arithmetic operation is invalid such as division or modulus by 0 or produces a result that cannot be represented in the space provided such as overflow or underflow 6 3 An object has its stored value accessed by an Ivalue that does not have one of the following types the declared type of the object a qualified version of the declared type of the object the signed or unsigned type corresponding to the declared type of the object the signed or unsigned type corresponding to a qualified version of the declared type of the object an aggregate or union type that recursively includes one of the aforementioned types among its members or a character type 6 3 An argument to a function is a void expression 6 3 2 2 For a function call without a function prototype the number of arguments does not agree with the number of parameters 6 3 2 2 200 Portability issues Annexes ISO IEC 9899 1990 E For a function call without a function prototype if the function is defined without a function prototype and the types of the arguments after promotion do not agree with those of the parameters after promotion 6 3 2 2 If a function is called with a function prototype and the function is not defined with a compatible type 6 3 2 2 A function that accepts a variable number of arguments is called without a fun
114. mplementierenden Analysen zusammenh ngen 5 2 1 5 Headerdateien Alle Funktionen und Konstanten sind in den folgenden vier Headerdateien definiert e rbCEval0ut h Hier sind die Funktionsprototypen f r die Ausgabefunktionen hinterlegt Um die Wartbarkeit des Programmsystems zu vereinfachen kann in dieser Datei das Makro RB_CEVAL_DEBUG definiert werden Damit werden Debugmeldungen aktiviert die an passenden Stellen im Code eingef gt wurden e rbCEval h In diesem Header sind alle Funktionen definiert die f r die Analysen verwendet wer den ebenso Datenstrukturen und Makros die im Code verwendet werden Weiterhin werden in dieser Datei auch die n chsten beiden Header eingebunden e rbCEvalConst h Diese Datei beinhaltet alle vordefinierten Integerkonstanten die als Ergebnis zur ck gegeben werden wenn es nur eine begrenzte Anzahl von Ergebnissen f r eine Analyse gibt siehe Abschnitt 5 2 1 2 Damit diese Konstanten auch von einem Perlskript f r die Auswertung genutzt werden k nnen werden sie in einer csv Datei verwaltet aus der dieser Header erzeugt wird siehe Abschnitt 5 3 3 2 rbCEvalPredef h In diesem Header werden anhand der Ergebnisse aus den Kompiliervorg ngen Ma kros definiert mit denen nach dem Prinzip aus Abschnitt Codefragmente ak tiviert oder deaktiviert werden k nnen 41 Kapitel 5 Implementierung 5 2 2 Algorithmen zur Analyse der Eigenschaften In Kapitel 3 werden die zu analysierenden Eigen
115. n zu berpr fen 24 Kapitel 3 Zu analysierende Eigenschaften 3 2 Zus tzliche Eigenschaften Neben den implementation defined features gibt es noch andere f r den Entwickler interessante Eigenschaften Diese werden in diesem Abschnitt betrachtet 3 2 1 Division und Modulo durch Null Das Ergebnis einer Division oder eines Modulo mit Null ist im Standard undefiniert Ma thematisch ist die Division durch Null nicht definiert und f hrt bei Computerprogrammen oft zum Absturz Ein undefinierter Programmabsturz ist in eingebetteten Systemen sehr kritisch besonders bei sicherheitsrelevanten Anwendungen Als Alternative wird oft ein definierter Wert zur ckgegeben Dabei sind die folgenden M glichkeiten blich a 0 bA0 gt 0 der Divisior a b der Dividend x y eine definierte Konstante die von beiden unabh ngig ist Auch wenn versucht wird eine Division durch Null zu vermeiden kann dies selten g nzlich ausgeschlossen werden Deshalb ist es f r den Softwareentwickler wichtig zu wissen was in diesem Fall passiert 3 2 2 Common Extensions Wie am Anfgang des Kapitels erw hnt gibt es im Anhang des Standards C90 auch eine Liste mit allgemein blichen Erweiterungen zur Programmiersprache Es handelt sich um neun Punkte siehe Anhang A wobei hier nur auf drei eingegangen wird Dabei handelt es sich um die Unterscheidung von Bezeichnern anderen arithmetischen Datentypen wie long long und dass Bitfelder nich
116. n mit den genauen Werten verglichen f r positive und negative Zahlen Anhand dieses Vergleichs l sst sich ableiten wie gerundet wird Das folgende Beispiel zeigt den Vergleich mit vereinfachten Zahlen Die n chsten zu 0 1 darstellbaren Zahlen seien 0 099 und 0 101 Links stehen die angen herten Werte und rechts die genauen if float float 0 0995 float 0 099 0 amp 2 float float 0 0995 float 0 099 0 amp 3 float float 0 1005 float 0 099 0 amp 4 float float 0 1005 float 0 099 0 Wenn diese vier Bedingungen wahr sind wird immer zu Null gerundet also immer zu 0 099 5 2 2 12 Zeichensatz Referenz Wie bereits erw hnt wird meist ASCI als Zeichensatz verwendet Dabei wird der ASCII 56 Kapitel 5 Implementierung Zeichensatz nochmals in den urspr nglichen 7 Bit und den erweiterten 8 Bit Zeichen satz unterteilt F r die berpr fung des verwendetetn Zeichensatzes werden drei Unter scheidungen gemacht Zuerst werden alle Zeichen berpr ft die der Standard vorsieht siehe Auflistung in Abschnitt B 14 Diese werden vollst ndig durch den 7 Bit ASCII Zeichensatz abgedeckt brig vom 7 Bit Zeichensatz bleiben dann noch diverse nicht darstellbare Steuerzeichen und die folgenden drei Zeichen 0 El Die Zeichen und werden bei manchen Compilern verwendet um compilerspezifische Befehle zu kennzeichnen tiny Anear Qfar beim Cosmic Compiler Cos0
117. n signed und unsigned Datentypen nicht genau festgelegt Es wird nur gesagt dass sich die Anzahl und Ausrichtung der Bits nicht unterscheiden darf IS090 6 1 2 5 Ob negative Zahlen im Zweierkomplement Einer komplement oder mit Vorzeichenbit gespeichert werden wird nicht festgelegt Da das Zweierkomplement die bliche Darstellung ist wird diese f r die weiteren Analysen vor ausgesetzt Es wird nur berpr ft ob dies auch der Fall ist Sollte das Zweierkomplement nicht verwendet werden wird eine Warnung an den Anwender ausgegeben da andere Aus sagen dann nur bedingt korrekt sind 14 Kapitel 3 Zu analysierende Eigenschaften Die Auslegung der anderen Analysen auf die verschiedenen Darstellungen daher nicht not wendig Da keine Mikroprozessoren mit einer anderen Darstellung zur Verf gung stehen oder berhaupt bekannt sind k nnten darauf basierende Analysen nicht getestet werden Datentypkonvertierung In der Programmierung werden Werte oft von einem Datentyp in einen anderen umgewan delt casts Dies geschieht oft implizit wie bei der Integer Promotion und beim Balancing siehe Abschnitt P 2 1 oder explizit durch den Softwareentwickler Ob und wie sich der Wert ver ndert h ngt dabei davon ab ob sich der Wert durch den neuen Datentypen dar stellen l sst F r einen Wert der zu gro f r den neuen Typen ist wird das Verhalten nur festgelegt wenn der Zieldatentyp unsigned ist Der neue Wert ist der Rest der Divis
118. n wird und wie die Ergebnisse des Programmlaufs vom Mikroprozessor gelesen werden h ngt von der verwendeten Hardware ab Der Anwender muss dieses entweder manuell durchf hren oder selbst automatisieren Damit die Daten die vom Mikroprozessor als Ergebnis gelesen wer den ein einheitliches Format haben wird vorgegeben wie die Funktion zum bertra gen Speichern der Daten auszusehen hat und welche Funktionalit t sie haben muss Eine einfach zu implementierende M glichkeit die auch die n tige Flexibilit t f r verschie dene bertragungswege bietet ist eine Funktion die ein Zeichen also ein Byte speichert Der Anwender muss dazu die Funktion mit dem folgenden Prototypen implementieren 64 Kapitel 5 Implementierung void rbCEval_outputByte unsigned char Der generierte Quellcode greift wie in Abschnitt 5 2 1 3 beschrieben auf diese Funktion zu um die Ergebnisse des Programmlaufs zu speichern Damit s mtliche Analysen durchgef hrt werden muss der Anwender sicherstellen dass die folgende Funktion genau einmal aufgerufen wird void rbCEval_toolKit void Diese Funktion wird vom Programmsystem bereitgestellt und ruft dann die Analysen auf Dabei muss beachtet werden dass die Analysen eine nicht definierte Laufzeit haben so dass ein eventuell benutzter Watchdog nicht zeitgerecht bedient wird und den Prozessor neu starten w rde 5 3 3 Das Programmsystem Der Build Prozess muss so in das Progra
119. nach dem Linken oft noch andere Programme aufgerufen die dann zum Beispiel eine elfP Datei erstellen Diese wird zum Schluss auf die Hardware heruntergeladen Der genaue Aufbau des Build Prozesses und die jeweiligen Einstellungen unterscheiden sich je nach Projekt zum Teil deutlich sogar dann wenn der gleiche Compiler und der gleiche Mikroprozessor zum Einsatz kommen sollte 4 2 Anforderungen an das Programmsystem CEval Aus der Aufgabenstellung in geht hervor dass ein m glichst einfach zu bedienen des Programmsystem zu entwickeln ist welches bestimmte Eigenschaften von Compilern abpr ft Die zu pr fenden Eigenschaften ergeben sich zum gro en Teil aus den imple mentation defined features des Standards C90 wobei das Augenmerk auf denen liegt die f r eingebettete Systeme relevant sind Dies soll unter den gleichen Bedingungen ge schehen unter denen der Compiler auch im jeweiligen Projekt eingesetzt wird da einige der untersuchten Eigenschaften von den Einstellungen des Compilers abh ngen Weiterhin muss das Programm flexibel sein um in Zukunft auch neue Compiler testen zu k nnen Im Gesamten soll die Analyse weitestgehend automatisch ablaufen Neben diesen von Bosch vorgegebenen Anforderungen wird der Aufbau des Programm systems auch stark von den durchzuf hrenden Tests bestimmt siehe Kapitel 3 Es stellt sich die Frage welche Schritte f r eine umfassende Analyse berhaupt notwen dig sind Die implementationsab
120. nalysierenden Compilers und der Umgebung in der er eingesetzt werden soll erreicht e Wie k nnen Compilerfehler ausgewertet werden 31 Kapitel 4 Programmsystem e Wie kommt der Maschinencode auf den Mikroprozessor e Wie werden die Ergebnisse der Laufzeittests vom Mikroprozessor gelesen e Wie werden Zwischenergebnisse abgespeichert e Wie kann Quellcode auf Basis von fr heren Ergebnissen dynamisch generiert werden e Das Programm soll erweiterbar sein e Das Programm soll einfach und ohne viel Aufwand bedienbar sein Im Folgenden wird auf diese Punkte n her eingegangen und es werden verschiedene L sungsans tze miteinander verglichen Dabei gilt das Hauptaugenmerk der geforderten Fle xibilit t um ein m glichst breites Spektrum an C Compilern untersuchen zu k nnen 4 4 1 Flexibilit t Wie kann das Programm so flexibel gestaltet werden dass auch neue Compiler damit analysiert werden k nnen und die Analyse m glichst projektspezifisch ist Der erste Ansatz zur L sung dieser Frage war die Nutzung einer Konfigurationsdatei Hier muss der Anwender die Daten f r den jeweiligen Compiler eintragen Das Programm verwendet dann diese Einstellungen um den Compiler aufzurufen und die Analysen durch zuf hren Das Problem dieses Ansatzes ist dass er wenig mit dem aktuellen Projekt des Anwenders zu tun hat Der Anwender kann zwar die gleichen Compilereinstellungen an geben es kann jedoch sein dass neben dem Compiler
121. nion is defined as containing only unnamed members 6 5 2 1 A bit field is declared with a type other than int signed int or unsigned int 6 5 2 1 An attempt is made to modify an object with const qualified type by means of an lvalue with non const qualified type 6 5 3 An attempt is made to refer to an object with volatile qualified type by means of an lvalue with non volatile qualified type 6 5 3 The value of an uninitialized object that has automatic storage duration is used before a value is assigned 6 5 7 An object with aggregate or union type with static storage duration has a non brace enclosed initializer or an object with aggregate or union type with automatic storage duration has either a single expression initializer with a type other than that of the object or a non brace enclosed initializer 6 5 7 The value of a function is used but no value was returned 6 6 6 4 An identifier with external linkage is used but there does not exist exactly one external definition in the program for the identifier 6 7 A function that accepts a variable number of arguments is defined without a parameter type list that ends with the ellipsis notation 6 7 1 Portability issues 201 ISO IEC 9899 1990 E Annexes An identifier for an object with internal linkage and an incomplete type is declared with a tentative definition 6 7 2 The token defined is generated during the expan
122. ntissa of double 52 bits precision mantissa of long double 52 bits exponent size in Bits precision signbit exponent of float 8 bits exponent of double 11 bits exponent of long double 11 bits representable minimal difference epsilon to 1 it might be smaller epsilon for float ca 10 6 epsilon for double ca 10 15 epsilon for long double ca 107 15 Rounding behaviour if the value is not representable Fractional part eg 0 1 is rounded to nearest Cast Integer gt Float is rounded to zero Bit fields Padding no padding bits used e g int 16 Bit 10 16 6 32 Bit gt 2 int bit fields Order of bits in a complete int bit field LSB first WARNING Size of bit field differs according to used bits WARNING First bit in bit fields of various size is not at the same position Signedness of int bit fields each bit field is unsigned regardless of its definition eg signed int bf 4 has a range of 0 15 WARNING implementation doesn t match C90 Allowed types of bit fields appart from int char short long Content of predefined macros __STDC__ 1 NULL void 0 RBCEVAL_H __FILE__ c projects CEval example source rbCEval_4 c LINE__ 31 111 10 09 2007 21 01 14 Modus Alle Zeilen Linke Datei C projects CEval result hc12_cosmic_070910 txt Rechte Datei C projects CEval resultihc12_metro_070910 txt DATEIVERGLEICH Seite 1 Evaluation
123. ntypen in Nachkommastellen zur Basis 10 berechnet Dazu wird zu 1 0 ein Epsilon addiert und berpr ft ob die Summe sich von 1 0 unterscheidet Das Epsilon wird nach und nach verkleinert 107 1072 Dies ist keine genaue Berechnung und soll dem Anwender nur einen Richtwert geben Ausgegeben wird deshalb nur der negative Exponent Rundungsverhalten F r das Rundungsverhalten von Gleitkommazahlen bei Werten die nicht genau darstellbar sind gibt der Standard die folgenden vier M glichkeiten vor 55 Kapitel 5 Implementierung e zu Null e zur n chsten Nachkommastelle e zu plus unendlich e zu minus unendlich Es d rfen zwar weitere M glichkeiten definiert werden es ist jedoch nicht sinnvoll nach diesen zu suchen da die wichtigsten hierdurch abgedeckt werden Das Rundungsverhalten wird f r zwei F lle untersucht Erstens wenn eine Dezimalzahl im bin ren System nicht eindeutig darstellbar ist und zweitens wenn ein long Wert in einen float Wert konvertiert wird und dieser sich nicht genau darstellen l sst Als Dezimalzahl wird 0 1 genommen da sich bei ihrer Darstellung als Bin rzahl eine Periode ergibt 0 110 0 000110011002 Die n chsten Dezimalwerte die sich durch eine 32 Bit float Zahl darstellen lassen sind in etwa 0 099999994039535522460937510 0 10000000149011611938476562510 F r die berpr fung des Rundungsverhaltens werden Werte nahe der m glichen Werte in float Variablen geschrieben und dan
124. oder Mikroprozessoren mit einer anderen Implementierung gibt Es findet zwar eine berpr fung der beiden Eigenschaften statt die Ergebnisse flie en aber nicht in die anderen Analysen ein Sollten die Bedin gungen nicht erf llt sein wird in der Auswertung darauf hingewiesen und die anderen 66 Kapitel 5 Implementierung Analysen f r ung ltig erkl rt Dadurch wird ein Programmlauf eingespart und vereinfacht damit die Anwendung des Programmsystems 5 3 3 2 Konfiguration Die vom Anwender durchzuf hrende Konfiguration des Programmsystems ist m glichst einfach gehalten Sie ist gesondert in dem Perlmodul rbCEval_config pm abgelegt in der der Anwender die folgenden Einstellungen vornehmen muss 1 Befehl zum Starten des Build Prozesses 2 Verzeichnistrennzeichen f r Windows f r Linux Unix 3 Zielpfad Hier werden die generierten C Dateien abgelegt rbCEval_x c 4 Includepfad Hier werden die Headerdateien abgelegt 5 Tempor rer Pfad Hier werden alle Textdateien compResultx txt runx txt ab gelegt und der Build Prozess muss hier die Datei rbCEval_compile txt erzeugen um einen erfolgreichen Durchlauf zu signalisieren Die geforderte Flexibilit t wird durch den vom Anwender bereitzustellenden Build Prozess erreicht Das Programmsystem C Eval wurde unter Windows 2000 entwickelt l uft aber auch unter Unix bzw Linux wenn dort der entsprechende Perl Interpreter installiert ist Version 5 8 4
125. ompilieren der verschiedenen Quelldateien in Objekte das Linken der Objekte und not wendigen Bibliothekerf und die Erstellung von ausf hrbarem Maschinencode Bei gr e ren Projekten mit mehreren Quelldateien und Bibliotheken werden normalerweise Skripte Perl Batch usw eingesetzt um so die vielen Kompiliervorg nge das Linken und an dere n tige Vorg nge zu automatisieren Oft wird auch das Tool Make eingesetzt Dieses Tool hat den Vorteil dass einmal kompilierte Quelldateien nur dann neu kompiliert wer den wenn in ihnen etwas ge ndert wurde Bei gro en Projekten mit mehreren hundert Quelldateien kann so der Build Prozess bei kleinen nderungen deutlich verk rzt werden Sei es nun ein Skript oder Make der Build Prozess l uft hnlich ab und es m ssen hnliche Voreinstellungen gemacht werden Normalerweise werden neben den ben tigten Quellda teien auch die verwendeten Bibliotheken angegeben Da Compiler und Linker blicherweise getrennt aufgerufen werden muss angegeben werden wie und mit welchen Einstellungen diese gestartet werden sollen Obwohl der Linker im Prinzip schon fertigen Maschinencode liefert wird dieser oft noch weiterverarbeitet Zum einen um beispielsweise eine Verifizie rung durch Checksummen hinzuzuf gen oder um das Herunterladen des Maschinencodes Sammlung schon kompilierter Quellen 27 Kapitel 4 Programmsystem auf den Mikroprozessor bzw das Steuerger t zu vereinfachen Deshalb werden
126. onverted to a floating point number that cannot exactly represent the original value 6 2 1 3 The direction of truncation or rounding when a floating point number is converted to a narrower floating point number 6 2 1 4 G 3 7 Arrays and pointers The type of integer required to hold the maximum size of an array that is the type of the sizeof operator size_t 6 3 3 4 7 1 1 The result of casting a pointer to an integer or vice versa 6 3 4 The type of integer required to hold the difference between two pointers to elements of the same array ptrdiff t 6 3 6 7 1 1 G 3 8 Registers The extent to which objects can actually be placed in registers by use of the register storage class specifier 6 5 1 G 3 9 Structures unions enumerations and bit fields A member of a union object is accessed using a member of a different type 6 3 2 3 The padding and alignment of members of structures 6 5 2 1 This should present no problem unless binary data written by one implementation are read by another Whether a plain int bit field is treated as a signed int bit field or as an unsigned int bit field 6 5 2 1 The order of allocation of bit fields within a unit 6 5 2 1 Whether a bit field can straddle a storage unit boundary 6 5 2 1 The integer type chosen to represent the values of an enumeration type 6 5 2 2 Portability issues 205 ISO IEC 9899 1990 E
127. plementationsabh ngig Laut Standard ist die maximale Gr e eines Arrays begrenzt durch die Gr e von size_t und deshalb ebenfalls implementationsabh ngig ISO90 6 3 3 4 Wie gro ein Pointer ist h ngt zum Teil auch mit der Gr e des verwendeten Speichers ab also wie viel Speicher adressiert werden kann muss Dabei wird au erdem zwischen Code und Datenpointern unterscheiden Code wird meistens im ROM des Mikroprozessors ge speichert w hrend Daten zur Laufzeit im RAM abgelegt werden Hier ist es interessant zu wissen ob es unterschiedliche Pointertypen gibt Dies geh rt zwar direkt nicht zum Standard C90 kommt aber in der Praxis fters vor und ist eine Einstellung von QA C Auch der Datentyp der Differenz von zwei Pointern zu Elementen eines Arrays wird von dem Compilerhersteller bestimmt Dieser wird ptrdiff_t genannt und wird auch in einem Standardheader definiert 3 1 8 Registers Bei register handelt es sich um einen storage class specifier der dem Compiler sagt dass der Zugriff auf dieses Objekt so schnell wie m glich erfolgen soll Inwieweit der Com pilerhersteller dieses aber umsetzen muss l sst der Standard v llig offen Es war nicht 17 Kapitel 3 Zu analysierende Eigenschaften m glich mit einfachen automatisierbaren Methoden herauszufinden ob und wie ein Com piler diese Eigenschaft implementiert Dazu m sste zum Beispiel der Assemblercode ana lysiert werden um zu sehen wo im Speicher die mi
128. printf RB_CEVAL STRINGIZE Hello world Dieser Code sieht nach dem Preprocessing folgenderma en aus printf Hello world Mit dem oben definierten RB_CEVAL_STRINGIZE a wird allerdings nur a und nicht der Inhalt von a in einen String umgewandelt Dazu ist ein weiterer Schritt notwendig Dieser nutzt die Reihenfolge aus mit der der Pr prozessor die einzelnen Makros aufl st Es wird deshalb ein zweites Makro definiert define RB_CEVALMACRO CONTENT b RB_CEVAL STRINGIZE b Die schrittweise Aufl sung w hrend des Preprocessing wird am Beispiel des Makros NULL dargestellt 59 Kapitel 5 Implementierung 1 rbCEval_outputString RB CEVAL MACRO CONTENT NULL RB_CEVAL STRINGIZE NULL RB_CEVAL STRINGIZE void 0 void 0 2 rbCEval_outputString 3 rbCEval_outputString Get Veit pa 4 rbCEval_outputString Zuerst wird in Zeile 2 RB_CEVAL_MACRO_CONTENT zu RB_CEVAL_STRINGIZE aufgel st wo bei der Parameter weitergegeben wird Im n chsten Schritt wird das Makro NULL mit dessen Definition ersetzt in diesem Fall void 0 Zum Schluss wird das andere Makro aufgel st In Zeile 4 steht der Code nach dem Preprocessing der dann kompiliert und ausgef hrt wird Damit gibt es eine M glichkeit den Inhalt von Makros zu erhalten ohne dass der Quell code nach dem Pr prozessor analysiert werden muss 60 Kapitel 5 Implementierung 5 3 Automatisierung Nachdem die Analysen fes
129. ptiert folgt der n chste Durchlauf mit l ngeren Bezeichnern Kommt es zu einem Compilerfehler werden f r den n chsten Durchlauf k rzere Namen generiert Um einen m glichst gro en Namensraum mit wenigen Durchl ufen abzudecken wird das Prinzip der bin ren Suche angewendet wie in Abbil dung 5 2 dargestellt Die obere Grenze wird dabei auf 1024 21 festgesetzt Das hei t Bezeichner mit einer L nge von 0 1023 werden untersucht Dazu werden 10 Durchl ufe ben tigt Abbildung 5 2 Bin re Suche der Bezeichnerl nge Wie schon in Abschnitt erw hnt sind dabei f r externe Bezeichner mehrere Szenarien zu beachten Diese werden in vier Schritten umgesetzt 1 Zwei globale Variablen definiert in einer Datei 10 Durchl ufe 2 Zwei globale Variablen mit der maximalen L nge aus dem ersten Schritt definiert in einer Datei und Zugriff auf diese in einer zweiten Datei zur berpr fung der gefundenen L nge 1 Durchlauf 3 Eine globale Variable in einer Datei um zu berpr fen ob der Compiler den Namen auf den signifikanten Teil reduziert 10 Durchl ufe 4 Zwei globale Variablen in verschiedenen Dateien und deren Aufruf in einer dritten Datei um den Linker zu berpr fen 10 Durchl ufe Die maximal erlaubte L nge aus diesem Schritt wird sp ter auch im Programmlauf verwendet um zu berpr fen ob die Variablen tats chlich unterschieden werden Dazu wird deren Inhalt w hrend des Programmlaufs untersucht
130. r vordefinierter Quellcode N stro Endergebnis bb Auswertung en gt SA y 4 ausf hrbarer Programmlauf Code ergebnisse SCH A J Programmlauf auf uC h Abbildung 4 1 Datenflussdiagramm einfach 30 Kapitel 4 Programmsystem Wie in Abschnitt 4 2 beschrieben werden schon beim Kompilieren Eigenschaften unter sucht Dies bedeutet dass auch diese Ergebnisse in die Auswertung einflie en m ssen Wei terhin werden einige Tests auf den Ergebnissen von anderen Tests aufbauen Diese m ssen wieder in den ersten Prozess zur ckflie en Das hei t auch dass nicht der komplette Quell code vordefiniert werden kann Vor dem Kompilieren und Linken wird dementsprechend ein Prozess ben tigt der auf Basis des vordefinierten Quellcodes und der vorherigen Er gebnisse den Quellcode f r den aktuellen Durchlauf generiert Daraus ergibt sich das in Abbildung dargestellte Diagramm vordefinierter Quellcode x Endergebnis in dynamische Code A Auswertung generierung x 4 N Ergebnisse der Ubersetzung generierter i Programmlauf Quellcode K J ergebnisse P N z ausf hrbarer Programmlauf Build Prozess Code A auf pC Abbildung 4 2 Datenflussdiagramm erweitert 4 4 L sungsans tze Aus den Anforderungen und dem Datenmodell ergeben sich mehrere Fragen und Schwie rigkeiten e Wie wird die n tige Flexibilit t bez glich des zu a
131. r Strukturen Neben der Endianess dem Alignment und Padding ist auch das Vorzeichen implementationsabh ngig Bitfelder haben laut Standard den Datentyp int 1 struct 2 int bits1 6 3 int bits2 16 4 int bits3 10 5 bitFeld str Allgemein wird das einfache int als signed interpretiert Bei einem Bitfeld ist dies aber vom Compiler abh ngig bitFeld_str bits1 kann also je nach Compiler signed 32 31 j SCHEI oder unsigned 0 63 sein P EE EE Ee F llbits Abbildung 3 4 Padding in Bitfeldern Weiterhin ist es implementationsabh ngig ob f r die Struktur bitFeld_str zwei oder drei int belegt werden Der Compiler kann ein Bitfeld ber zwei Einheiten verteilen In Abbildung 3 4 sind beide M glichkeiten schematisch dargestellt Im rechten Teil wird das Bitfeld bits2 ber zwei Einheiten verteilt wohingegen im linken Teil F llbits genutzt werden Padding 77 B beim Cosmic Compiler f r den HC12 Mikroprozessor mit der Option Leven 20 Kapitel 3 Zu analysierende Eigenschaften Neben der Anordnung mehrerer Bitfelder ist auch die Reihenfolge der Bits nicht vorge geben Das hei t es gibt auch auf Bitebene Endianess die aber der Endianess auf Byte Ebene nicht entsprechen muss Je nach Ausrichtung liegt das erste Bit des Bitfeldes auf dem niederwertigstem Bit LS BP oder auf dem h chstwertigstem MSBP der Einheit 1 struct
132. ritt 2 3 Finde die Basis b x do Z W Y Sen base Z W while base 0 0f Die Pr zision p gibt die Anzahl der m glichen Nachkommastellen zur Basis b an Sie wird mit dem folgenden Algorithmus berechnet bei dem die Basis solange mit sich selbst multipliziert wird bis basePreeision 1 0 S ba sepresisin 4 10 54 Kapitel 5 Implementierung int precision 2 volatile float W Y 4 precision 0 5 if base 1 o 7 W 1 0f 8 do 9 precision 10 W W x base base precision x 11 Y W 1 0f 12 while Y W 1 0f 13 11 x jetzt ist W base precision gerade zu gro um W 1 W 1 zu erf llen Die Berechnung von p wird fiir jede der drei Gleitkommazahlen float double und long double nach dem gleichen Schema durchgefiihrt Bei dem Ergebnis ist eine Be sonderheit zu beachten die in den meisten Fallen auftreten wird Ist die Basis b 2 gilt laut Definition immer fi 1 Deshalb wird in diesem Fall um Platz zu sparen das erste Bit nicht gespeichert Ist die Pr zision p also beispielsweise 24 ist es ausreichend nur die 23 niederwertigen Bits der Mantisse zu speichern Die Gr e von dem Exponenten e wird im Nachhinein in der Auswertung nach der folgen den Formel berechnet Bits p 1l s f rb 2 e Bits p s f rb gt 2 Genauigkeit Zus tzlich zur Mantisse die die Nachkommastellen zur Basis b angibt wird noch die Genauigkeit der drei Date
133. rojekt geh ren und kompi liert werden m ssen Neben den Dateien werden normalerweise auch die Pfade in denen die Dateien zu finden sind bergeben Include Pfade Diese Aufstellung gilt nicht nur f r Make sondern in dieser oder hnlicher Form auch f r andere Build Prozesse Perlskript Batchdatei Da die Analyse mehrere Durchl ufe ben tigt diese aber alle mit demselben Build Prozess durchgef hrt werden sollen muss ein Weg gefunden werden dem Build Prozess mitzutei len welche Dateien zum aktuellen Durchlauf geh ren und kompiliert werden sollen Statt nun bei jedem Durchlauf neue Dateienamen zu bergeben werden mehrere Datei enamen festgelegt und deren Inhalt vor jedem Durchlauf angepasst W hrend der dynamischen Codegenerierung werden f r jeden Durchlauf insgesamt sechs Dateien mit dem Namen rbCEval_x c erstellt wobei das x f r eine Zahl von 0 bis 5 steht Diese Dateien muss der Anwender in seinen Build Prozess einbinden Neben diesen sechs Dateien muss es mindestens noch eine weitere Datei geben die die Startfunktion normalerweise main und die Funktion rbCEval_outputByte zur Aus gabe von den Ergebnissen enth lt siehe Abschnitt 4 4 4 Bevor jedoch diese sechs Dateien eingebunden werden muss der Anwender sicherstellen dass der von ihm bereitgestellte Quellcode ohne Fehler kompiliert andernfalls kann der n chste Schritt nicht funktionieren Der n chste Schritt dient der Erkennung von Compilerfehlern ohne
134. rschiede bei den Enumerations zeigt die folgende Es handelt sich dabei um einen Ausschnitt aus dem Vergleichstool Beyond Compare Die Unterschiede sind rot gekenn zeichnet Enumerations size in bytes and signedness 1 signe Enumerations size in bytes and signedness 1 signe d 0 unsigned d 0 unsigned type size sign sizeof a type size sign sizeof a gt a b SEN 0 2 lt gt la b cia dl 2 a 1 b SS 1 2 a 1 b Care 1 2 a 128 b St 0 2 a 128 kr ek z 1 2 a 1 b 128 e 2 al 2 a 1 b 128 e i 2 1 2 a 256 Br EZ 0 a lt gt a 256 Dr ek ll 2 a 32768 br EUA 0 2 a 32768 br c not possible a 1 b 32768 chi 4 1 4 a 1 b 32768 c not possible a 65536 Leg Ch a 0 4 a 65536 b c not possible a 2147483648 b ch a ah 4 a 2147483648 b c not possible a 1 b 2147483648 c 4 1 4 a 1 b 2147483648 c not possible a 4294967296 b c not possible a 4294967296 b c not possible Beyond Compare 2 3 1 Abbildung 6 1 Enumarations auf dem HC12 Mikroprozessor Cosmic Metrowerks Wie sich erkennen l sst legt der Metrowerks Compiler standardm ig f r Enumerations ein signed int an wohingegen der Cosmic Compiler die Gr e den Werten der Enume ration anpasst Ein weiterer Unterschied ist die Implementierung von Gleitkommazahlen Im Gegensatz zum Cosmic Compiler werden beim Metrowerks Compiler alle Gleitkommazahlen
135. s mit der sich alle Zeichen des Basiszeichensatzes darstellen las sen Weiterhin soll jedes Byte einzeln adressierbar sein Es wird also nicht festgelegt ob ein Byte 8 9 oder mehr Bit hat Die Mindestgr e liegt jedoch bei 8 Bit ISO90 5 2 4 2 1 Einige der ersten Mainframesysteme waren z B 36 Bit Maschinen mit einer Bytegr e von 9 Bit Heutzutage stellt ein Byte normalerweise 8 Bit dar Es gibt aber auch Anwendungs bereiche wie die digitale Signalverarbeitung in denen es auf sehr hohen Datendurchsatz ankommt Ein Beispiel f r einen Compiler dessen Datentyp char eine Gr e von 16 Bit hat ist der Compiler f r die TMS320855x Serie der Firma Texas Instruments Tex03 Dieses Merkmal ist jedoch so herausragend dass der Mikroprozessor wahrscheinlich genau aus diesem Grund genutzt wird Deshalb wird die Gr e eines Bytes zwar berpr ft aber f r alle anderen Tests mit 8 Bit vorgegeben Der Anwender erh lt eine Warnung falls das Ergebnis nicht den erwarteten 8 Bit entspricht In diesem Fall sind alle anderen Aussagen ung ltig Nach r cksprache wurde vereinbart das Analysen f r den Fall Byte 4 8 Bit nicht relevant sind 1 American Standard Code for Information Interchange Extended Binary Code Interchange Format zum Beispiel die UNIVAC 1100 Serie 13 Kapitel 3 Zu analysierende Eigenschaften Char Der einfache Datentyp char kann entweder als signed char oder als unsigned char interpretiert werden Wird zum Be
136. s mehr Deshalb ist gerade bei kritischer Software besondere Vorsicht geboten Es gibt dementsprechend in der Atomindustrie der Luftfahrt und anderen Industriezweigen zus tzliche Regeln f r die Erstellung von Software mit C Auch die Automobilindustrie hat sich zu diesem Zweck zusammengeschlossen und ein Re gelwerk entworfen Diese Richtlinie MISRA C 2004 enth lt 121 notwendige Regeln und Kapitel 2 Hintergrund 20 Hinweise im Umgang mit C In der Richtlinie steht jedoch dass es nicht praktikabel ist alle Regeln ohne Ausnahme zu erf llen Notwendig hei t deshalb in diesem Zusam menhang dass alle Abweichungen von diesen Regeln dokumentiert werden m ssen um MISRA konformen Code zu erstellen Zu diesen Regeln sei es MISRA oder ein anderes Regelwerk gibt es auch entsprechende Software die den entwickelten Quellcode auf die Einhaltung dieser Regeln hin berpr ft wie z B QA Q und PC lintp Diese Software beinhaltet meist noch weitere mehr Regeln die auf allgemeinen Erfahrungen basieren Das bei Bosch eingesetzte Programm QA C ben tigt f r seine Tests bestimmte Informationen ber den verwendeten Compiler und den Prozessor Dabei handelt es sich z T um die Angaben die auch im Standard nicht genau definiert sind An dieser Stelle soll das von mir entwickelte Programm ansetzen und dem Benutzer in kurzer Zeit diese Informationen zur Verf gung stellen Compiler Personality start p_c Identifiers Extensions System Hea
137. schaften untersucht und n her beschrieben In diesem Abschnitt wird die Implementierung zur berpr fung der Eigenschaften erkl rt Dabei wird nicht der komplette C Code aufgef hrt sondern nur der Bereich der f r die Erkl rung notwendig und hilfreich ist Zum Teil werden auch Alternativen aufgezeigt und miteinander verglichen Die Tests sind thematisch zusammengefasst Am Anfang jedes Unterpunkts wird auf die zugeh rigen Abschnitte in Kapitel B verwiesen 5 2 2 1 Gr e eines Byte Referenz 3 1 4 Ein Byte wird in C mit dem Datentyp char repr sentiert Es gilt herauszufinden mit wie vielen Bits ein char intern dargestellt wird Eine M glichkeit ist das parallele Hochz hlen zweier Variablen unterschiedlichen Typs bis ihr Wert nicht mehr gleich ist 1 unsigned char var_uc 0 2 unsigned long var_ul 0 3 do 4 var_uc 5 var_ul 6 while var_uc var_ul Nach Beendigung der while Schleife kann dann anhand der long Variable var_1 die An zahl der Bits die ein char ben tigt berechnet werden Solange der Test auf Mikroprozes soren mit einer Bytegr e von 8 Bit l uft kommt es zu 256 Wiederholungen Sollte der Test aber auf einem Prozessor mit einer h heren Bytegr e laufen erh ht sich die Anzahl der Wiederholungen exponentiell mit jedem zus tzlichen Bit Eine bessere Variante bietet der Shift Operator Hierbei werden die beiden Variablen nicht hochgez hlt sondern es wird ein Bit solange verscho
138. shed onto the microcontroller for run time tests The output of the onboard test has to be stored into runl txt for the first test run2 txt for the second etc These text files will be stored in a temporary folder which has to be defined in the file rbCEval_config prm too To get the output from the microcontroller the user has to implement the C function rbCEval_outputByte unsigned char It has to ensure that the passed parameter is stored somehow or transferred to the PC for further usage The next script will read the outputs of the previous one s and the whole process is repeated After all tests are finished the script evaluation pl is called which will collect all results of the compile link and onboard tests and generate a readable result Dataflow of the programme predefined final result Se compResult1 txt compResult4 txt dynamic code evaluation generation compiler results run1 pl run4 pl evaluation pl Y generated sources uC results rbCEval_0 c rbCEval_5 c run 1 txt run4 txt user denned executable build process called by runx pl Red Has to done somehow by the user Usage 1 Preparation Before the Evaluation Tool can be used you have to provide a compile script and at least one additional file 1 1 Cfile Implements a start up function eg main which calls the function rbCEval_toolKit To call this fun
139. sion of a if or e1if preprocessing directive 6 8 1 The itinclude preprocessing directive that results after expansion does not match one of the two header name forms 6 8 2 A macro argument consists of no preprocessing tokens 6 8 3 There are sequences of preprocessing tokens within the list of macro arguments that would otherwise act as preprocessing directive lines 6 8 3 The result of the preprocessing operator is not a valid character string literal 6 8 3 2 The result of the preprocessing concatenation operator is not a valid preprocessing token 6 8 3 3 The line preprocessing directive that results after expansion does not match one of the two well defined forms 6 8 4 One of the following identifiers is the subject of a define or undef preprocessing directive defined LINE_ FILE DATE _ TIME _ or__STDC__ 6 8 8 An attempt is made to copy an object to an overlapping object by use of a library function other than memmove clause 7 The effect if a standard header is included within an external definition is included for the first time after the first reference to any of the functions or objects it declares or to any of the types or macros it defines or is included while a macro is defined with a name the same as a keyword 7 1 2 The effect if the program redefines a reserved external identifier 7 1 3 A macro definition of errno is suppressed to obt
140. stants csv list of integer constants with their appropriate name the Perl script generates a header file and a Perl module from this file so that the constants for the C programme are the same as used in the final evaluation script base c_sourcen Contains all predefined C files necessary for the compiler evaluation Most of the files contain only one function This helps to check each function separately if it compiles The appendix contains a list of files and which predefined function s it contains docs Folder where this and other documentation about the tool can be found example Folder with an example e comile pl apredefined compile script which uses the GNU compiler gcc It will generate executables for the current machine it is running on ie the PC The subfolders in this directory are used by the compile script and for the example evaluation They are also used in the example configuration file Appendix List of the evaluated features Length of Byte in bit Negative representation two s complement one s complement sign bit Right shift logical or arithmetical Endianess little endian big endian Maximum length of identifiers up to 1023 digits Plain char signed or unsigned Character set of execution environment ASCII extended ASCII no ASCII Character set during preprocessing ASCI or not comments accepted or not Size of data types in bits void c
141. t such as the dollar sign or characters in national character sets may appear in an identifier 6 1 2 G 5 3 Lengths and cases of identifiers All characters in identifiers with or without external linkage are significant and case distinctions are observed 6 1 2 G 5 4 Scopes of identifiers A function identifier or the identifier of an object the declaration of which contains the keyword extern has file scope 6 1 2 1 G 5 5 Writable string literals String literals are modifiable Identical string literals shall be distinct 6 1 4 G 5 6 Other arithmetic types Other arithmetic types such as long long int and their appropriate conversions are defined 6 2 2 1 G 5 7 Function pointer casts A pointer to an object or to void may be cast to a pointer to a function allowing data to be invoked as a function 6 3 4 A pointer to a function may be cast to a pointer to an object or to void allowing a function to be inspected or modified for example by a debugger 6 3 4 G 5 8 Non int bit field types Types other than int unsigned int or signed int can be declared as bit fields with appropriate maximum widths 6 5 2 1 G 5 9 The fortran keyword The fortran declaration specifier may be used in a function declaration to indicate that calls suitable for FORTRAN should be generated or that different representations for external names are to be generated 6 5 4 3 208 Portability issues Annexes ISO IEC 9899 1990
142. t nur vom Datentyp int sein diirfen 3 2 3 Makros Es werden in C oft Makros verwendet also Pr prozessorsymbole hinter denen sich Code oder auch nur eine Konstante verbirgt Diese machen den Quellcode lesbarer wartungs freundlicher und auch portabler da bei einer nderung nur die Definition des Makros ge ndert werden muss In den meisten F llen werden Makros in Headerdateien definiert Viele Compiler haben aber auch Makros intern vordefiniert Das Programmsystem soll eine M glichkeit bieten den Inhalt solcher Makros anzuzeigen 25 Kapitel 3 Zu analysierende Eigenschaften 3 2 4 Kommentare Zur Kennzeichnung von Kommentaren ist nach dem Standard C90 nur der mehrzeilige Kommentar mit zugelassen In dem neuen Standard C99 wird der einzeilige Kommentar mit eingef hrt Da mittlerweile fast alle Compiler den Kommentar mit gt unterst tzen wird dieser auch h ufig angewendet Deshalb soll berpr ft werden ob der Compiler diesen auch akzeptiert 26 Kapitel 4 Programmsystem Das zu entwickelnde Programmsystem wird im Folgenden CEval genannt abgeleitet von Compiler Evaluation Bevor jedoch n her auf die Anforderungen und den Aufbau von CEval eingegangen wird beschreibt der folgende Abschnitt den Build Prozess eines Programms Dieser hat gro en Einfluss auf den Aufbau des Programmsystems 4 1 Build Prozess Der Build Prozess ist der Weg vom Quellcode zum fertigen Programm Er umfasst das K
143. t register klassifizierten Variablen abgelegt werden Eine Analyse des Assemblercodes ist aber nicht vorgesehen da sich die ser auch je nach Compiler und Mikroprozessor unterscheidet Deshalb wird dieser Punkt in der Analyse au er Acht gelassen 3 1 9 Structures unions enumerations and bit fields Bei Strukturen und Unions handelt es sich um zusammengesetzte Datentypen Dabei spielt besonders die Ablage der Datentypen im Speicher eine Rolle Unions Unions bieten die M glichkeit mehrere verschiedene Datentypen auf dem gleichen Spei cherbereich abzulegen Oft werden sie bei der Mikroprozessorprogrammierung in Verbin dung mit Strukturen dazu verwendet auf einzelne Bits eines Registerd zuzugreifen oder um das ganze oder mehrere Register auf einmal zu bearbeiten oder auszulesen Unions bieten auch eine gute M glichkeit Speicher zu sparen Da jedoch die Anordnung der By tes der verschiedenen Datentypen von Prozessor zu Prozessor unterschiedlich sein kann ist das Auslesen von Daten die ber ein anderes Element als dem aktuellen in die Uni on geschrieben wurden implementationsabh ngig In diesem Zusammenhang spielt die Anordnung der Bytes eine gro e Rolle Endianess Es gibt haupts chlich Little Endian z B Intel Prozessoren und Big Endian z B Motorola Prozessoren Abbildung 3 2 zeigt graphisch die Anordnung der Bytes anhand der Hexadezimalzahl 0x04030201 long var 0
144. t signed oder unsigned deklariert immer als unsigned interpretiert werden Bit fields Bit fields Padding Padding no padding bits used e g int 16 Bit 10 16 6 lt gt padding bits used e g int 16 Bit 10 16 6 32 32 Bit gt 2 int bit fields Bit gt 3 int bit fields Order of bits in a complete int bit field LSB fir Order of bits in a complete int bit field MSB fir st gt NIE WARNING Size of bit field differs according to us ed bits WARNING First bit in bit fields of various size is not equal Signedness of int bit fields Signedness of int bit fields each bit field is unsigned regardless of its de lt gt plain int bit field is unsigned the others as d finition eg signed int bf 4 has a range of 0 1 efined 5 Allowed types of bit fields appart from int Allowed types of bit fields appart from int char short long lt gt char short long long long Beyond Compare 2 5 1 Abbildung 6 3 Vergleich von Bitfeldern beim HC12 Cosmic und PowerPC GreenHills 6 3 Unterschiedliche Prozessoren gleicher Compiler Mikroprozessor 1 MPC5516G PowerPC 32 Bit Mikroprozessor 2 Pentium 4 Intel 32 Bit Compiler GNU C Compiler v3 4 4 Bei diesem Test wurde der GNU Compiler f r den PowerPC als Crosscompiler verwendet Da es sich um den gleichen Compiler handelt h ngen die wenigen Unterschiede mit dem Mikroprozessor zusammen PowerPC
145. talzahlen werden anders als Dezimalzahlen eingestuft Dezimalzahlen werden in diesem Fall direkt zu signed long umgewandelt Bei den beiden anderen kommt zuerst unsigned int und dann signed long Ist int 32 Bit gro gibt es kein Problem da 0x8000 mit 32 Bit auf jeden Fall darstellbar ist Ist int jedoch nur 16 Bit gro ist der Wert der Wert zu grog Deswegen wird 0x8000 in unsigned int umgewandelt Jetzt greift das Balancing und wandelt das y auch zu unsigned int Das Ergebnis des Ausdrucks y 0x8000 ist deshalb ebenfalls unsigned int also positiv Somit ist der if Ausdruck immer falsch Es findet noch ein zweites Ba lancing f r den kleiner als Operator statt das aber keine Auswirkung mehr auf das Ergebnis hat Diese beiden Beispiele sollen einen kurzen Einblick in die vielf ltigen Bereiche geben in denen nicht klar definiertes Verhalten eine Rolle spielt Gerade das zweite Beispiel zeigt dass bei Software die auf verschiedenen Mikroprozessoren laufen und mit verschiedenen Compilern kompiliert werden soll auf viele zum Teil auch versteckte Eigenheiten geachtet werden muss 2 2 2 Der C Standard Wie in der Einleitung erw hnt gibt es verschiedene Versionen des C Standards Diese Ar beit behandelt haupts chlich die Version aus dem Jahr 1990 ISO IEC 9899 C90 Auch wenn es eine berarbeitete Version aus dem Jahr 1999 C99 gibt wird heute bei einge betteten Systemen noch C90 vorausgesetzt Viele Punkte des neueren Stand
146. tants and string literals to members of the execution character set 6 1 3 4 The value of an integer character constant that contains a character or escape sequence not represented in the basic execution character set or the extended character set for a wide character constant 6 1 3 4 The value of an integer character constant that contains more than one character or a wide character constant that contains more than one multibyte character 6 1 3 4 204 Portability issues Annexes ISO IEC 9899 1990 E The current locale used to convert multibyte characters into corresponding wide characters codes for a wide character constant 6 1 3 4 Whether a plan char has the same range of values as signed char or unsigned char 6 2 1 1 G 3 5 Integers The representations and sets of values of the various types of integers 6 1 2 5 The result of converting an integer to a shorter signed integer or the result of converting an unsigned integer to a signed integer of equal length if the value cannot be represented 6 2 1 2 The results of bitwise operations on signed integers 6 3 The sign of the remainder on integer division 6 3 5 The result of a right shift of a negative valued signed integral type 6 3 7 G 3 6 Floating point The representations and sets of values of the various types of floating point numbers 6 1 2 5 The direction of truncation when an integral number is c
147. tgelegt sind m ssen diese nun so weit wie m glich automatisiert durchgef hrt werden Als Grundlage daf r dient das in Abschnitt 4 3 erstellte Datenmo dell Die Verarbeitung und Erzeugung von Daten wird dort in vier Prozesse unterteilt siehe auch Abbildung 4 2 1 Die dynamische Codegenerierung 2 Der Build Prozess 3 Der Programmlauf 4 Die Auswertung Die dynamische Codegenerierung und die Auswertung k nnen automatisiert werden Der Build Prozess muss vom Anwender bereitgestellt werden kann dann aber vom Programm system automatisiert verwendet werden Der Programmlauf auf dem Mikroprozessor muss manuell durchgef hrt werden Der Aufbau des Programmsystem muss also so entwickelt werden dass der Build Prozess und der Programmlauf optimal eingebunden werden Bevor jedoch auf die einzelnen Prozesse n her eingegangen wird wird zum besseren Verst ndnis der folgenden Erkl rungen das Resultat grafisch dargestellt Das Diagramm in der Abbildung zeigt den Ablauf des Programmsystems CEval aus Sicht des An wenders Es wird dargestellt welche Aufgaben vom Anwender durchzuf hren sind und in welcher Reihenfolge die Perlskripte gestartet werden m ssen um die automatisierten Prozesse zu starten 61 Kapitel 5 Implementierung Perlskripte die der Anwender A Muss vom Anwender aufrufen muss bereitgestellt oder manuell Nein i ausgef hrt werden rbCEval_ outputByte unsigned char erstellen
148. tlich C90 Anordnung der Bytes einer Variable International Electrotechnical Commission Integer Promotion Alle Zahlen und Datentypen kleiner int werden bei Berechnungen zu ISO Linker int konvertiert Internatinal Organization for Standardization L st Abh ngigkeiten zwischen Modulen auf und verbindet den Objektcode zum fertigen Programm siehe Compiler 84 Glossar Little Endian Das niederwertigste Byte einer Variable Zahl liegt auf der niederwertigs ten Speicherdaddresse Middle Endian Mischform von Little und Big Endian Mixed Endian Siehe Middle Endian Padding F llbytes und Bits damit das Alignment gew hrleistet werden kann Stringize Operator Pr prozessor Operator der eine beliebige Zeichenkette w hrend des Preprocessing in einen String umwandelt Kette Kette Zweierkomplement Eine Darstellung negativer Bin rzahlen Der Betrag einer negativen Zahl ergibt sich wenn alle Bits invertiert werden und 1 hinzuaddiert wird 85 Literaturverzeichnis Cos05 COSMIC SOFTWARE C Cross Compiler Users Guide for Freescale HC12 HCS12 2005 Version 4 6 Cos07 COSMIC SOFTWARE Cosmic Software C Compilers 2007 Online Stand 30 05 2007 http www cosmic software com compiler php Fre06 FREESCALE SEMICONDUCTOR Inc HC S Compiler Manual 2006 GCCO7 GCC TEAM Status of C99 features in GCC 2007 Online Stand 13 02 2007 http gec gnu org c99status html Gre07 GREEN HIL
149. und rbCEval toolKit aufrufen Y Die ersten drei Schritte m ssen noch mal Build Prozess anpassen berpr ft werden Y Konfiguration in der Datei rbCEval_config pm anpassen p Be lt Konfiguration OK lt q init pl o ja run1 pl erzeugt Maschinencode und compResult1 txt y Programmlauf auf dem pC erzeuge run1 txt run2 pl erzeugt Maschinencode und compResult2 txt gt y Programmlauf auf dem uC erzeuge run2 txt run3 pl erzeugt Maschinencode und compResult3 txt y Programmlauf auf dem pC erzeuge run3 txt Makrotest nein optional y Makros und Includedateien f r den Test festlegen run4 pl compResult4 txt y Programmlauf auf dem uC erzeuge run4 txt erzeugt Maschinencode und evaluation pl greift auf compResultx txt und runx txt zur ck und erzeugt das Endergebnis Abbildung 5 3 Gesamtablauf 62 Kapitel 5 Implementierung 5 3 1 Anpassungen am Build Prozess Am Beispiel des Tools Make werden hier die vom Anwender vorzunehmenden Anpassun gen erkl rt In der Make Konfigurationsdatei sind zus tzlich zu den Parametern und Optionen f r den Compiler und den Linker die Abh ngigkeiten der verschiedenen Quellen hinterlegt Das bedeutet dass es eine Liste mit C Dateien gibt die zu dem P
150. und dem Linker noch andere Tools zum Einsatz kommen die das Ergebnis ab ndern k nnen wie in Abschnitt 4 1 erkl rt Aus diesen Gr nden musste eine andere L sung gefunden werden Der zweite Ansatz ergibt sich aus der Aufgabenstellung Da diese Analyse jeweils f r ein bestimmtes Projekt durchgef hrt werden soll ist es sinnvoll dass der Anwender den Build Prozess zur Verf gung stellt So ist die N he zum eigentlichen Projekt garantiert und auch die Flexibilit t die n tig ist um zuk nftige Compiler zu analysieren Der Anwender kann daf r seinen schon bestehenden Build Prozess nehmen einige nderungen vornehmen und dem Programm mitteilen wie der Prozess aufgerufen wird Auf die nderungen wird in Abschnitt eingegangen Neben dem Build Prozess soll sich auch die Software zur Analyse der Eigenschaften m he los in bestehende Projektumgebungen integrieren lassen Die Idee dabei ist dass der Anwender nur eine zus tzliche Funktion aufrufen muss um die relevanten Tests zu starten Hierbei muss er aber darauf achten dass ungewollte Ne beneffekte zum Beispiel durch einen Watchdog vermieden werden 32 Kapitel 4 Programmsystem 4 4 2 Compilerfehler Compilerfehler treten auf wenn der Compiler w hrend des Kompilierens Fehler im Quell code entdeckt Laut Standard C90 muss dann eine Diagnosemeldung angezeigt werden und der Vorgang bricht ab Wie schon erw hnt sind dem Compilerhersteller beim Ver fassen dieser Meldung
151. x 04030201 middle endian little endian big endian Beispiel Ox00FO 0x01 0x04 0x02 0x00F1 0x02 0x03 0x01 Ox00F2 Qx03 0x02 0x04 0x00F3 0x04 0x01 0x03 Abbildung 3 2 Anordnung von Bytes Welche Auswirkungen die unterschiedliche Anordnung der Bytes auf Unions hat zeigt das folgende Codebeispiel Register bezeichnet hier Steuerregister oder I O Register nicht die Registerb nke der CPU 18 Kapitel 3 Zu analysierende Eigenschaften Voraussetzung short ist 16 Bit gro x 2 union 3 unsigned char var uc 4 unsigned short var us 5 test_un 6 test_un var_us 0x2010 Je nach Endianess hat test_un var_uc nun den Wert 0x20 bei Big Endian oder 0x10 bei Little Endian Bei einigen Compilern l sst sich die Endianess umschalten PowerPC ARM MIPS Manche Prozessoren benutzen Big Endian f r die Anordnung der Bytes in einem Datenwort 16 Bit und Little Endian f r die Anordnung der Datenworte bei Datentypen mit mindestens 32 Bit In diesem Fall wird von Middle Endian oder Mixed Endian gesprochen Strukturen In Strukturen werden Daten in Gruppen zusammengefasst Dies bietet die M glichkeit zusammengeh rige Daten als Gruppe zu bergeben Solange dieses auf nur einem Sys tem stattfindet stellt der Zugriff auf die Daten kein Problem dar Kommunizieren aber unterschiedliche Systeme miteinander spielt das Alignment also die Anordnung der Spei cheradressen eine gro e Rolle In vielen
152. zahl der zu untersuchenden Makros und deren Inhalt vergr ert sich die Menge an Daten die vom Mikroprozessor gelesen werden muss Es kann sein dass nicht beliebig viele Daten auf einmal bertragen werden k nnen weil sie beispiels weise im RAM oder in einem EEPROM zwischengespeichert werden Da die Gr e der Ergebnisse des ersten Programmlaufs schon bei 900 bis 1000 Bytes liegt muss eine Vergr erung der Datenmenge in diesem Durchlauf vermieden werden 2 Es ist keine notwendige Analyse Der Anwender kann entscheiden ob und welche Makros er analysieren m chte 5 3 3 5 Die Auswertung Die Auswertung findet in dem Perlskript evaluation pl statt und greift auf die Er gebnisse aus der Compilerfehleranalyse compResultx txt und den verschiedenen Pro gramml ufen runx txt zur ck Dort sind die Ergebnisse im Format name wert abgelegt vel B 2 1 3 Die Ergebnisse aus der Compilerfehleranalyse und den Programml ufen wer den jeweils komplett in einen Hast eingelesen wobei der Name des Ergebnisses als Index genutzt wird So k nnen die Werte anhand des Namens ausgelesen und zugeordnet wer den Damit es keine berschneidungen gibt sind die Namen der Ergebnisse eindeutig gew hlt Der Wert stellt je nach Analyse entweder direkt das Ergebnis dar oder dient als Schl ssel Konstante mit dem das Ergebnis zugeordnet werden kann vgl 5 2 1 2 Als Unterscheidungsmerkmal werden die Namen der Ergebnisse die einen Schl ssel liefern in

Download Pdf Manuals

image

Related Search

Related Contents

Samsung F2080 Benutzerhandbuch  ecker白  PVRS User Manual V2  Samsung GE234STS دليل المستخدم  Mellanox MLNX-OS® Release Notes for VPI  

Copyright © All rights reserved.
Failed to retrieve file