Code Coverage mit gcov
|
|
|
- Sven Böhler
- vor 9 Jahren
- Abrufe
Transkript
1 Code Coverage mit gcov Seminararbeit zur Veranstaltung Verteilte und parallele Systeme II bei Prof. Dr. Rudolf Berrendorf Von Jan Seidel, Stefan Winarzki Fachbereich Informatik Fachhochschule Bonn-Rhein-Sieg, St. Augustin
2 Inhaltsverzeichnis: 1 Einleitung Begriffsdefinition - Code Coverage & gcov Ziele von Code Coverage 3 2 Code Coverage Beschreibung / Abgrenzung Kontrollflussgraphen Verschiedene Möglichkeiten Statement Coverage (Anweisungsüberdeckung) Decision Coverage (Zweigüberdeckung) Condition Coverage (Bedingungsüberdeckung) Path Coverage (Pfadüberdeckung) 8 3 gcov Beschreibung (Realisierung von Code Coverage) Anwendung (allgemein) Übersetzen des Quellcodes Ausführung des Programmes Starten von gcov / Auswerten der Ergebnisse Beispiel 12 4 Bewertung / Zusammenfassung Code Coverage gcov 15 5 Quellenverzeichnis Code Coverage mit gcov 2
3 1 Einleitung Diese Seminararbeit wurde im Rahmen der Lehrveranstaltung Verteilte und parallele Systeme II des Wintersemesters 2003 / 2004 erstellt. Sie befasst sich mit Code Coverage im Allgemeinen und mit dem Thema, die zahlreichen Aspekte, die der Begriff Code Coverage umfasst, mit dem Test Coverage Programm gcov zu realisieren. 1.1 Begriffsdefinitionen Code Coverage - Nachdem man ein Programm geschrieben hat, möchte man in der Regel dessen korrekten Ablauf mit Hilfe von Testprogrammen und darin enthaltenen Testfällen überprüfen. Dabei lässt man das Programm ausführen und vergleicht die daraus resultierenden Daten mit erwarteten Werten. Allerdings nützt es dem Programmierer nicht viel, wenn sämtliche Tests zwar erfolgreich beendet wurden, jedoch, nur 25% des Testprogrammcodes ausgeführt wurde. Der Begriff 'Code Coverage' bedeutet, zu protokollieren, wie oft welche Zeile eines Programms ausgeführt wurde und so lässt sich ein Programm, falls es nicht die gewünschten Befehle ausführt, wesentlich leichter modifizieren, als wenn man gar keine Kontrollmöglichkeit hätte. Code Coverage ist eine von mehreren Möglichkeiten, um ein Testprogramm so effektiv und umfassend wie möglich zu gestalten. Dass keine Fehler in einem Programm existieren, kann man zwar nie hundertprozentig ausschließen, jedoch kann man die Wahrscheinlichkeit für deren Auftreten mittels Code Coverage minimieren. Es gibt verschiedene Möglichkeiten, um die Qualität bzw. Funktionalität und Effektivität eines Testes zu analysieren, bspw. das sog. 'Statement Coverage', das lediglich angibt, ob eine Anweisung ausgeführt wurde oder nicht. Weitere Kriterien werden in Kapitel 2.2 eingehender behandelt. gcov - gcov ist ein Programm, das die durch den Begriff Code Coverage bestimmten Eigenschaften und benötigten Funktionen umsetzt, also ein sog. Test Coverage Programm. Sein Ziel ist es, die Wahrscheinlichkeit, dass ein Code Fehler enthält, zu minimieren und Testprogramme effizienter zu gestalten. Auf die Handhabung und Funktionen von gcov wird in Kapitel 3 ausführlich eingegangen. 1.2 Ziele von Code Coverage Wie im vorhergehenden Kapitel schon kurz angesprochen, soll Code Coverage die Funktionalität und Effizienz von Testprogrammen verbessern. Dieses Ziel erreicht es, indem Bereiche eines Programms, die nicht durch Testfälle des Testprogramms abgedeckt werden, ermittelt werden. Nun kann der Programmierer diese Ergebnisse auswerten und neue Testfälle entwerfen, die diese Lücken beheben sollen. Code Coverage allein kann dies natürlich nicht bewirken, jedoch hilft es dem Programmierer, sich diese Arbeit zu erleichtern. Durch die quantitative Erhöhung des getesteten Programmcodes wird folglich die Qualität des Programms erhöht Code Coverage mit gcov 3
4 2 Code Coverage 2.1 Beschreibung / Abgrenzung Mit Code Coverage lässt sich die Überdeckung, also wie oft welche Zeile bzw. Anweisung eines Programms ausgeführt wurde, feststellen. Ein möglichst hoher Überdeckungsgrad ist zwar wünschenswert um die in Kapitel 1.2 genannten Ziele zu erreichen, jedoch bedeutet auch ein hundertprozentiger Überdeckungsgrad nicht automatisch, dass das Programm vollständig getestet oder gar fehlerfrei ist. Anhand von einem kurzen Stück Beispielcode wird diese Aussage verdeutlicht: 10: int x = testmethod(); /* testmethod() wird ausgeführt, x wird der Rückgabewert (hier ein Fehlercode) zugewiesen */ 11: if(x == FATAL_ERROR) 12: exit(5); // Programmende mit Fehlercode 5 13: else 14:... // Kein Fehler, Programm fährt fort Nehmen wir an, in diesem Beispiel wird Zeile 12 nie ausgeführt. Das könnte entweder daran liegen, dass wirklich niemals ein Fehler auftritt und das Programm korrekt läuft, aber es könnte auch sein, dass ein anderer Fehlercode vorliegt, den der Programmierer nicht bedacht hat. Im zweiten Fall hätte man also trotz fehlerhafter Ausführung des Programms einen sehr hohen Überdeckungsgrad von ca. 90%. Dieser Fehler kann folgendermaßen behoben werden: 10: int x = testmethod(); /* testmethod() wird ausgeführt, x wird der Rückgabewert (hier ein Fehlercode) zugewiesen */ 11: if(x == FATAL_ERROR) 12: exit(5); // Programmende mit Fehlercode 5 13: else if(x == RECOVERABLE_ERROR) { 14:... // Fehler beheben 15: 16: else 17:... // Kein Fehler, Programm fährt fort Nun hätte man die fehlende Fallunterscheidung korrigiert, gleichzeitig den Grad der Codeüberdeckung vermindert und dennoch einen Fehler des Programms behoben. Das liegt vor allem daran, dass Code Coverage Tools nur den vorhandenen Code analysieren können - wie wir im Beispiel gesehen haben, werden fehlende Codestücke, wie die hier nicht vorhandene Fallunterscheidung, folglich nicht berücksichtigt, so dass sich der Programmierer nicht nur auf das Code Coverage Programm und den Überdeckungsgrad allein verlassen kann. Das soll jedoch nicht heißen, dass der Überdeckungsgrad unwichtig ist. Anhand einer fehlenden Überdeckung einer Codekomponente lässt sich zwar nicht sagen, dass dieser Fehler enthält, jedoch kann man daraus schließen, dass das Stück Code nicht ausreichend betrachtet bzw. getestet wurde. Es sei hier nochmals gesagt, dass ein Test Coverage Programm nicht das Denken des Menschen ersetzen, sondern nur eine Hilfestellung darstellen soll. Der Fehler, der im obigen Beispiel auftrat, gehört zu den Unterlassungsfehlern oder auch Faults of Omission. Unter diese Fehlerklasse fallen u. a. unvollständige Fallunterscheidungen (fehlende Bedingungen in IF-Abfragen, fehlender ELSE-Zweig, Code Coverage mit gcov 4
5 fehlender case in switch, ), fehlende catch-anweisungen für Exceptions und andere wesentlich komplexere Fälle. Die komplette Abwesenheit von Fehlern in einem Programm kann man ohnehin nie mit absoluter Sicherheit festlegen, da es einfach nicht gelingen kann, für alle auftretenden Fälle Testfälle in einem Testprogramm zu schreiben. Auch die Vollständigkeit des Codes ist mit Code Coverage allein nicht zu zeigen. Allerdings kann der Programmierer aus den Analysedaten, die das Code Coverage Programm ihm liefert, schließen, welche Segmente eines Programms noch nicht ausreichend getestet wurden und somit eine entsprechende Test-Methode schreiben oder vorhandene Fehler korrigieren. Wie wir im obigem Beispiel gesehen haben, ist die Maßnahme, eine neue Test-Methode zu schreiben, nicht immer die beste Lösung. Schließlich kann es auch vorkommen, dass ein Fehler in der Programmlogik vorliegt, daher sollte der Programmierer bei nicht ausreichender Überdeckung einer Code- Region, diese eingehender betrachten und nach Fehlern suchen, anstatt einfach die Codeüberdeckung und damit scheinbar auch die Codekorrektheit und -vollständigkeit zu erhöhen, indem er eine neue Test-Methode entwirft. Natürlich kann man das Testprogramm mit Hilfe einer Code Coverage Analyse nicht nur erweitern, sondern auch reduzieren. Wenn man feststellt, dass bestimmte Bereiche des zu testenden Programmes, hervorgerufen durch redundante Testmethoden, viel zu oft mit den selben Daten ausgeführt werden, kann man dies relativ leicht erkennen und die entsprechenden Methoden modifizieren oder löschen. 2.2 Kontrollflussgraphen Um den Ablauf eines Programmes und die Kriterien der verschiedenen Überdeckungsmaße anschaulicher darstellen zu können, verwenden wir in den folgenden Kapiteln sog. Kontrollflussgraphen. Der Kontrollflussgraph ist ein gerichteter Graph mit festem Anfangs- und Endpunkt. Jeder Knoten stellt eine ausführbare Instruktion dar, während die Kanten anzeigen, wo das Programm mit der Ausführung fortfährt. Die Verzweigung der Kanten ist abhängig von Anweisungsfolgen (einfache Ausführung einer Instruktion), Selektionen (z. B. IFoder switch-anweisungen) und Iterationen (Schleifen). Das folgende Beispiel soll dies verdeutlichen: Quellcode: 10:... 11: int x = 0; 12: while(x<5) 13: x++; 14: Code Coverage mit gcov 5
6 Kontrollflussgraph: 2.3 Verschiedene Möglichkeiten Es gibt eine große Anzahl von Codeüberdeckungsmaßen. Wir wollen hier nur die wichtigsten betrachten und deren Stärken und Schwächen verdeutlichen Statement Coverage (Anweisungsüberdeckung) Statement Coverage überprüft und protokolliert, welche Instruktionen eines Programms ausgeführt wurden, und welche nicht. Vollständige Anweisungsüberdeckung wird erreicht, falls jede Anweisung eines Programms mindest einmal ausgeführt wurde, d.h. alle Knoten des Kontrollflussgraphen mindestens einmal besucht wurden. Dazu braucht man, falls mindestens eine IFoder switch-anweisung im Programm vorkommt, mehrere Testfälle, da es mit nur einem Testfall nicht möglich wäre, sämtliche Anweisungen auszuführen. Nach folgender Formel hat der Anweisungsüberdeckungsgrad sein Maximum bei 1 und Minimum bei 0: Anweisungsüberdeckungsgrad := Anzahl der besuchten Knoten / Anzahl aller Knoten Falls eine Sequenz von Instruktionen ohne Verzweigungen vorkommt, könnte man theoretisch diese als eine Instruktion werten bzw. mehrere Knoten in einer Reihe zu einem Knoten zusammenfassen, da ohnehin entweder keine oder alle Anweisungen ausgeführt werden. I.d.R. wird aber dennoch jede Zeile bzw. Instruktion für sich gezählt, da es die Auswertung von statistischen Zusammenfassungen eines Programmablaufs erleichtert. Diese Art der Überdeckung ist eher schwach, da trotz hundertprozentiger Anweisungsüberdeckung immer noch schwerwiegende Fehler auftreten können. Einige durch Statement Coverage nicht zu erkennende Fehler können durch andere Überdeckungsmaße erkannt werden, jedoch ist es dazu allein oftmals nicht in der Lage. Dennoch wird es eingesetzt, um bspw. beim ersten Testlauf umfangreicher Programme die gröbsten Fehler zu erkennen und zu beseitigen Code Coverage mit gcov 6
7 2.3.2 Decision Coverage (Zweigüberdeckung) Decision Coverage, auch Branch oder Arc Coverage genannt, wird erreicht, indem alle möglichen Entscheidungen durch IF- oder switch-anweisungen oder Schleifen mit bestimmten Bedingungen durchlaufen werden, d.h. dass alle Kanten des Kontrollflussgraphen mindestens einmal besucht wurden. Auch bei der hier geltenden Formel gilt wieder das selbe wie für den Anweisungsüberdeckungsgrad. Das Maximum liegt bei 1, das Minimum bei 0: Zweigüberdeckungsgrad := Anzahl der besuchten Zweige / Anzahl aller Zweige Im folgenden Beispiel... 10: if (run) { 11: print "case1"; 12: 13: else { 14: print "case2"; 15:... wird Decision Coverage nur dann erreicht, falls tatsächlich 2 Fälle durchlaufen werden, in denen run einmal TRUE und einmal FALSE ist. Diesen Ablauf verdeutlicht der folgende Kontrollflussgraph: Vollständige Decision Coverage impliziert logischerweise vollständige Statement Coverage. Decision Coverage erhöht die Effektivität der Suche nach Fehlern geringfügig, jedoch bleiben auch bei diesem Maß noch viele Fehler verborgen Code Coverage mit gcov 7
8 2.3.3 Condition Coverage (Bedingungsüberdeckung) Bei Condition Coverage wird noch ein weiterer Aspekt berücksichtigt, der bei Decision Coverage ignoriert wurde. Bei Decision Coverage wurde jede Bedingung als genau ein Prädikat gesehen, egal ob es tatsächlich nur eine Bedingung oder aus mehreren atomaren Prädikaten zusammengesetzt und durch logische AND s und OR s getrennt war. Bei Condition Coverage wird dieser Mangel nun beseitigt und jeder einzelne Teil eines Prädikats betrachtet, wobei man zwischen mehreren verschiedenen Arten von Condition Coverage unterscheiden muss. Minimale Bedingungsüberdeckung wird erreicht, wenn alle atomaren Prädikate einmal zu TRUE und einmal zu FALSE ausgewertet werden. Bei Mehrfach-Bedingungsüberdeckung dagegen müssen alle atomaren Prädikate zu allen möglichen Wertekombinationen ausgewertet werden. Einen Kompromiss zwischen diesen beiden Überdeckungsmaßen stellt die Minimale Mehrfach-Bedingungsüberdeckung dar. Bei diesem Maß muss jedes Prädikat, unabhängig davon ob es atomar oder zusammengesetzt ist, einmal zu TRUE und einmal zu FALSE ausgewertet werden Path Coverage (Pfadüberdeckung) Path Coverage wird erreicht, wenn alle möglichen Wege, beginnend beim Startknoten und endend beim Endknoten, des Kontrollflussgraphen eines Programms durchlaufen werden, d.h. wenn alle möglichen Pfade aller Funktionen durchlaufen werden. Solch ein Pfad ist eine einzigartige Folge von Instruktionen und Zweigen, der vom Programmanfang zum -ende führt. Dieses Maß zu bestimmen kann ggf. natürlich sehr aufwendig werden, da die Anzahl der möglichen Pfade mit jedem hinzukommenden IF-Statement exponentiell ansteigt. Hat man bspw. 10 IF-Anweisungen, müssten 2 10 (1024) verschiedene Pfade getestet werden. Fügt man eine weitere IF-Anweisung hinzu, wären es 2 11 (2048) Pfade. Ein anderer Nachteil ist, dass bestimmte zu testende Pfade unmöglich zu erreichen sind. Beispiel: 10: if (success) 11: statement1; 12: statement2; 13: if (success) 14: statement3; Path Coverage würde hier 2 2 (4) Pfade erwarten, was in diesem Fall unmöglich ist. Es gibt lediglich 2 Möglichkeiten, nämlich, dass success TRUE oder FALSE ist Code Coverage mit gcov 8
9 3 gcov 3.1 Beschreibung (Realisierung von Code Coverage) Gcov ist ein Akronym für GNU Coverage und ist ein Teil von gcc, der GNU Compiler Collection. Als solches arbeitet es nur auf Code, der vom GNU CC Compiler erzeugt wurde. Es dient dazu, Code Coverage für C-Code zu ermöglichen. Gcov ermittelt, welche Zeilen eines Programms ausgeführt wurden und wie oft diese ausgeführt wurden. Da diese Ermittlung zeilenweise auf dem Code arbeitet, sollte das Programm ohne Compiler-Optimierungen kompiliert werden, da mit Optimierungseinstellungen der Compiler eventuell mehrere Zeilen zu einer zusammenfasst. Auf einigen Maschinen ist es beispielsweise möglich, Code wie folgenden if (a!= b) c = 1; else c = 0; zu einer Zeile zusammenzufassen. Gcov würde dann nur die Häufigkeit der Ausführung des kompletten Blockes berechnen. Dies ist zwar in der Hinsicht korrekt, dass auf dieser Maschine der komplette Block als eine Anweisung ausgeführt wurde, es lässt sich aber nicht feststellen, wie oft die if-abfrage zu true evaluiert wurde und wie oft zu false. Aufgrund der zeilenweisen Abarbeitung der Anweisungen ist es weiterhin empfehlenswert, pro Zeile nur eine Anweisung zu schreiben, da diese anderenfalls auch nicht in ihrer Ausführungshäufigkeit unterschieden werden können. Um zu ermitteln, welche Teile eines Programms die längste Rechenzeit brauchen, lässt sich gcov in Verbindung mit gprof anwenden (siehe Seminararbeit zu gprof). Gcov lässt sich zum Einen einsetzen, um Regionen im Code zu finden, die besonders oft ausgeführt werden und somit mögliche sogenannte Bottlenecks zu finden. Werden solche Regionen gefunden, kann versucht werden, den Code an diesen Stellen zu optimieren. Die Bottlenecks im Code befinden sich aber nicht notwendigerweise bei den Anweisungen, die am häufigsten ausgeführt werden. Können beispielsweise Festplattenzugriffe durch Code-Optimierung minimiert werden, kann dies einen sehr großen Effekt für die Ausführgeschwindigkeit des Programms haben, auch wenn die Festplattenzugriffe vorher im Vergleich zu anderen Programmanweisungen nur selten ausgeführt wurden. Aus diesem Grund sollte man sich bei der Optimierungen von Code nicht darauf beschränken, nur die mit gcov ermittelten am häufigsten ausgeführten Zeilen zu optimieren. Zum Anderen lässt sich gcov in Verbindung mit Testsuites einsetzen, um sicherzustellen, dass der Code ausreichend und korrekt getestet wird. Die Testsuite dient dazu, sicherzustellen, dass der Code fehlerfrei und wie erwartet abläuft, gcov wiederum überwacht sozusagen die Testsuite, indem es feststellt, welche Anweisungen des Programms getestet wurden. Stellt gcov fest, dass bestimmte Bereiche des Programms noch nicht getestet wurden, lassen sich in der Testsuite neue Tests hinzufügen, die den Test möglichst aller Anweisungen des Programms sicherstellen. Eine Testsuite sollte nach Möglichkeit jede Anweisung eines Code Coverage mit gcov 9
10 Programms mindestens ein Mal ausführen, also vollständige Anweisungsüberdeckung garantieren. Dies kann gcov überwachen. Dass damit noch nicht alle durch Code Coverage erkennbaren Fehler entdeckt werden können, wurde bereits in der Beschreibung der unterschiedlichen Coverage-Arten erwähnt, aus diesem Grund bietet gcov weitere Protokollierungsmöglichkeiten an, die weiter unten genauer beschrieben werden. 3.2 Anwendung Übersetzen des Quellcodes Um ein Programm mit gcov analysieren zu können, muss es als erstes mit dem GNU CC Compiler und den zusätzlichen Einstellungen fprofile-arcs und ftest-coverage kompiliert werden. Dies sieht beispielsweise wie folgt aus: $ gcc -fprofile-arcs ftest-coverage o sample sample.c Mit der Option fprofile-arcs misst der Compiler, wie oft eine Sprunganweisung erreicht wird und wie oft der Sprung vorgenommen wurde. Dazu erstellt GCC einen Programmfluss-Graphen und für diesen Graphen einen Spanning Tree (ein Gerüst). Anweisungen, die nicht in diesem Spanning Tree enthalten sind müssen gezählt werden, da diese Anweisungen nicht auf jeden Fall ausgeführt werden. Für jede Datei, die mit der fprofile-arcs Option kompiliert wurde, wird nach dem erstmaligen Ausführen eine dateiname.da Datei erstellt, in der der Graph und der Spanning Tree gespeichert sind. Jetzt ist bekannt, welche Sprünge durchgeführt wurden und welche Anweisung wie oft ausgeführt wurde. Mit diesen Informationen kann in der dateiname.gcov Datei die statistische Auswertung erstellt werden. Die Compiler-Option ftest-coverage bewirkt, dass zwei weitere für gcov nötige Dateien zu jeder kompilierten Datei erstellt werden, eine mit der Endung.bb und die andere mit.bbg. Die.bb Datei ordnet den sogenannten basic blocks, das sind Folgen von Anweisungen ohne Sprünge und Sprungziele, Zeilennummern in der Quellcode-Datei zu, um die Anzahl der Ausführungen für jede Zeile angeben zu können. Die.bbg Datei erstellt und verwaltet eine Liste aller arcs im Programmfluss-Graphen, also Sprungbefehle von einem Block in einen anderen. Damit wird gcov ermöglicht, den Graphen zur Analyse zu rekonstruieren und alle vorgenommenen Sprünge zu berechnen. Die Option g des GNU C Compilers ist nicht gcov-spezifisch, wird aber bei Code Coverage mit gcov trotzdem häufig benötigt. Mit ihr erzeugt GCC Debugging- Informationen für den Debugger gdb. Mit diesem lassen sich unter anderem im Code Stopps ( breaks ) setzen und so beispielsweise fehlgeschlagene Speicher- Alloziierungen simulieren. Springt man nach solch einer fehlgeschlagenen Alloziierung zu einer Anweisung, die auf diese Speicherstellen zugreift, lässt sich der korrekte Umgang mit Fehlern testen. So lassen sich also auch Zeilen des Programms testen, die der Ausnahmebehandlung dienen und im normalen Abarbeiten eines Programms nicht erreicht werden. Um eine vollständige Anweisungsüberdeckung zu erhalten, kann es also nötig sein, den gdb-debugger zu verwenden. Die genauere Benutzung des Debuggers wird hier nicht weiter beschrieben, da sie nicht Thema dieser Ausarbeitung ist Code Coverage mit gcov 10
11 3.2.2 Ausführung des Programms Um festzustellen, welche Anweisungen des Programms wie oft ausgeführt wurden, muss dieses nun mindestens ein Mal gestartet werden, im Falle des oben angeführten Beispiels also wie folgt: $./sample 100 Nun wird für jede Quelldatei, die mit der Option fprofile-arcs kompiliert wurde, die Datei dateiname.da erstellt, die den Programmflussgraphen enthält und somit speichert, welche Anweisungen ausgeführt und welche Sprünge durchgeführt wurden. Startet man das Programm mehrmals, beispielsweise im Rahmen einer Testsuite, mit unterschiedlichen Eingabeparametern, werden die Ergebnisse in der dateiname.da-datei aufsummiert. Das Format dieser Datei ist sehr simpel. Zu den einzelnen Anweisungen und Sprüngen wird einfach die Anzahl ihrer Ausführungen als 8-byte-Wert gespeichert Starten von gcov / Auswerten der Ergebnisse Nun sind alle benötigten Daten für gcov vorhanden, um die Auswertungsstatistiken erstellen können. Dafür wird gcov auf der Kommandozeile aufgerufen, mit der Quelldatei, für die die Auswertung erstellt werden soll als Parameter. $ gcov sample.c 63.64% of 22 source lines executed in file sample.c Creating sample.c.gcov. In diesem Beispiel wurden also % der 22 Zeilen ausgeführt, dies sind 14 von 22 Zeilen. Weiterhin wurde die Datei test.c.gcov erstellt, die im Grunde wie die Original-Quelltext-Datei aussieht, mit der Ausnahme, dass vor jeder Zeile die Ausführungshäufigkeit notiert wurde. Einige Konstrukte, wie includes und geschlossene Klammern sind hier ausgenommen, da an diesen Stellen keine Maschinenanweisungen ausgeführt werden. Eine genauere Erläuterung solch einer.gcov-datei folgt in Kapitel 3.3. Folgende Optionen existieren für gcov: -b (branch-probabilities): Diese Option veranlasst gcov, zusätzliche Statistiken darüber zu erstellen, welche Verzweigungen im Programmcode wie oft durchlaufen wurden. Dies wird als Prozentzahl angegeben. Die Ausgabe sieht dann wie folgt aus: $ gcov b sample.c 63.64% of 22 source lines executed in file sample.c % of 7 branches executed in file sample.c % of 7 branches taken at least once in file sample.c 33.33% of 12 calls executed in file sample.c Creating sample.c.gcov. In diesem Beispiel wurden alle 7 Verzweigungen ( branches ) im Programmcode erreicht und jeweils mindestens ein Mal ausgeführt. Von den 12 Funktionsaufrufe wurden nur % ausgeführt, also 4 der 12 Aufrufe. In der Datei sample.c.gcov lässt sich nun genauer sehen, welche Verzweigungen und Aufrufe ausgeführt wurden. Dies kann beispielsweise wie folgt aussehen: Code Coverage mit gcov 11
12 1 if(argc!= 2) { branch 0 taken = 100% ##### printf( Usage: %s Enter arraysize value \n,argv[0]); call 0 never executed ##### exit(-1); call 0 never executed Ausschnitt sample.c.gcov Bei diesem Beispiel wurde also in 100 % aller Fälle hinter den Block nach der if- Abfrage gesprungen und demzufolge die beiden Funktionsaufrufe in dem Block nie aufgerufen. So lässt sich das in Kapitel beschriebene Decision Coverage überwachen, indem man feststellen kann, ob und wie oft jeder Sprung durchgeführt wurde. Für Funktionsaufrufe wird die Prozentzahl ihrer Rückkehren in das Programm gezählt. Bei Aufruf der exit()-funktion erfolgt beispielsweise keine Rückkehr in den Programmablauf, bei bestimmten Arten von Sprüngen ist dies ebenfalls der Fall. -c (branch-counts): Diese Option ist nahezu identisch mit der b Option, mit der Ausnahme, dass hier für jede Verzweigung die Anzahl ihrer Ausführungen in der.gcov Datei protokolliert wird und nicht ihre Prozentzahl. -f (function-summaries): Diese Option gibt zusätzlich zu der globalen Ausgabe des kompletten Programms Auswertungen für die einzelnen Funktionen an. Hier ein Beispiel: $ gcov f sample2.c 80.00% of 5 source lines executed in function read 66.66% of 18 source lines executed in function main 71.64% of 23 source lines executed in file sample2.c An der.gcov-datei ändert sich nichts, da dort bereits die Auswertungen für jede einzelne Anweisung und Verzweigung aufgeführt sind. Diese Funktions- Auswertungen lassen sich auch mit der b oder c Option kombinieren, in diesem Fall wird auch für jede Funktion die Auswertung der Verzweigungen und Aufrufe erstellt. Dies sind die wichtigsten Optionen von gcov, die weiteren Optionen finden sich in der zugehörigen manpage. Gcov ermöglicht also das Statement Coverage und das Decision Coverage, weitere Möglichkeiten existieren nicht, da das Path Coverage beispielsweise viel zu aufwendig wäre. Hier steigt die Anzahl der zu untersuchenden Pfade exponentiell mit der Anzahl der Verzweigungsmöglichkeiten, weswegen es von gcov nicht als Option angeboten wird. 3.3 Gcov anhand eines Beispiels Anhand eines kurzen Beispiels soll die Funktionsweise von gcov jetzt noch einmal verdeutlicht werden. Folgender Quellcode dient dabei als Beispielfall: int main(int argc, char **argv) { int i; int j = 0; int size; Code Coverage mit gcov 12
13 if (argc < 2) { printf("usage: %s Arraysize value1 value2... \n",argv[0]); exit(-1); size = atoi(argv[1]); int values[size]; for(i = 0; i < size; i++) { values[i] = 0; if(argc > size) { printf("too many values entered.\n"); exit(-1); for(i = 0; i < argc-2; i++) { values[i] = atoi(argv[i+2]); j++; printf( Entered %d values\n,j); mysample.c Das Programm erwartet mindestens einen Übergabeparameter, ansonsten gibt es eine Fehlermeldung aus und bricht ab. Wird dieser Parameter angegeben, erstellt es ein Array des Typs int mit der Größe des Parameters. Daraufhin wird das Array in einer for-schleife mit dem Wert 0 gefüllt. Hat der Benutzer weitere Parameter angegeben, werden diese der Reihe nach in das Array gefüllt. Ist die Anzahl der Parameter jedoch größer als das angelegte Array, wird eine Fehlermeldung ausgegeben. Am Ende wird noch eine Bestätigung ausgegeben, wie viele Werte gespeichert wurden. Das Programm wird jetzt mit dem gcc Compiler und den genannten Optionen kompiliert: $ gcc fprofile-arcs ftest-coverage o mysample mysample.c Daraufhin lässt man das Programm ein Mal starten und führt danach gcov aus, beispielsweise wie folgt: $./mysample 5 Entered 0 values $ gcov mysample.c 66.67% of 18 source lines executed in file mysample.c Creating mysample.c.gcov. 12 von 18 Zeilen wurden bis jetzt ausgeführt, noch nicht ausgeführt wurden die beiden if-blöcke mit jeweils 2 Zeilen und auch die letzte Schleife wurde noch nicht durchlaufen, da dies nur bei mindestens 2 Übergabeparametern geschieht. Um ein vollständiges Statement Coverage zu erreichen, benötigt man also noch drei weitere Testfälle, einen, bei dem kein Argument angegeben wird, einen mit mehr Argumenten als Array-Größe und einen, bei dem zusätzliche Werte in das Array geschrieben werden: Code Coverage mit gcov 13
14 $./mysample // zu wenig Parameter Usage:./mysample Arraysize value1 value2... $./mysample // Arraygröße 2, aber 3 Werte angegeben Too many values entered $./mysample Entered 2 values $ gcov mysample.c 100% of 18 source lines executed in file mysample.c Creating mysample.c.gcov. Nach Hinzufügen dieser drei Testfälle wurden nun also alle Anweisungen mindestens ein Mal ausgeführt. Nun kann man noch die b Option von gcov hinzufügen, um das Decision Coverage zu verwirklichen. $ gcov b mysample.c % of 18 source lines executed in file mysample.c % of 8 branches executed in file mysample.c % of 8 branches taken at least once in file mysample.c % of 7 calls executed in file mysample.c Es wurden also auch alle möglichen Verzweigungen mindestens einmal durchgeführt. Damit sind die Möglichkeiten des Code Coverage mit gcov ausgeschöpft, im Statement Coverage und im Decision Coverage wurden 100 % erreicht. Die zugehörige mysample.c.gcov Datei sieht nun wie folgt aus: 4 int main(int argc, char **argv) { 4 int i; 4 int j = 0; 4 int size; 4 if (argc < 2) { branch 0 taken = 75% 1 printf("usage: %s Arraysize value1 value2... \n",argv[0]); call 0 returns = 100% 1 exit(-1); call 0 returns = 0% 3 size = atoi(argv[1]); call 0 returns = 100% 3 int values[size]; 15 for(i = 0; i < size; i++) { branch 0 taken = 80% branch 1 taken = 100% branch 2 taken = 100% 12 values[i] = 0; 3 if(argc-2 > size) { branch 0 taken = 67% 1 printf("too many values entered.\n"); call 0 returns = 100% 1 exit(-1); call 0 returns = 0% 4 for(i = 0; i < argc-2; i++) { branch 0 taken = 50% Code Coverage mit gcov 14
15 branch 1 taken = 100% branch 2 taken = 100% 2 values[i] = atoi(argv[i+2]); call 0 returns = 100% 2 j++; 2 printf("entered %d values \n", j); call 0 returns = 100% mysample.c.gcov Links neben jeder Anweisung steht, wie oft sie ausgeführt wurde bzw. für eine Verzweigung, wie oft gesprungen wurde und für Funktionsaufrufe, wie oft sie zurück in das Programm gekehrt sind. Die beiden exit() Aufrufe sind logischerweise nicht in das Programm zurück gekehrt, alle anderen Aufrufe hingegen schon. Alle Verzweigungen (branches) wurden mindestens einmal durchgeführt, branch 0 steht in einer if-abfrage für das negative Testergebnis und damit für das Springen hinter den if-block. Bei der ersten if-abfrage wurde beispielsweise nur in einem von vier Fällen in den Block hinein gesprungen. Somit wurde für dieses einfache Beispiel ein Testdurchlauf durchgeführt, der sowohl vollständiges Statement Coverage als auch vollständiges Decision Coverage verwirklicht. In diesem Fall waren dafür nur vier unterschiedliche Programmaufrufe nötig, was an der relativ einfachen Struktur des Programms liegt, aber auch hier sieht man bereits, dass es relativ aufwendig ist, Quellcode komplett zu testen. Dass in diesem Programm durch falsche Eingaben keine Fehler mehr passieren können ist dadurch noch nicht bewiesen, dies zu verhindern bleibt auch mit gcov weiterhin Sache des Programmierers. 4 Bewertung / Zusammenfassung 4.1 Code Coverage Code Coverage legt verschiedene Maße der Codeüberdeckung fest, die auf unterschiedliche Arten erreicht werden. Wenn man die Daten, die man aus einer Code Coverage Analyse gewinnt, richtig betrachtet und auswertet, kann man mit großer Wahrscheinlichkeit eine Vielzahl von Fehlern ausfindig machen und korrigieren. 4.2 gcov Gcov dient der Umsetzung von Code Coverage für C und C++ Code. Wie beschrieben werden die Möglichkeiten der Statement und der Decision Coverage umgesetzt. Die Nutzung ist sehr komfortabel, es müssen lediglich zwei Optionen beim Kompilieren angegeben werden und schon lassen sich Programme mit gcov auswerten. Mit den Einschränkungen, die bereits bei Code Coverage hinsichtlich der Fehlersuche in einem Programm gemacht wurden, eignet sich gcov gut, zu überwachen, welche Teile des Codes ausgeführt wurden. So lassen sich Testsuites gut anpassen und die Wahrscheinlichkeit für unentdeckte Fehler sinkt Code Coverage mit gcov 15
16 5 Quellenverzeichnis Steve Cornett - Code Coverage Analysis, Stand: , Aufgerufen: GCC Administrator - gcov: a Test Coverage Program, Stand: , Aufgerufen: Cem Kaner - Software Negligence and Testing Coverage, Stand: 1996, Aufgerufen: Analytische Qualitätssicherung M. Kaul SE2 Datenfluss M. Kaul SE2 Code Coverage Linux Magazine Analyzing Code Coverage with gcov, Stand: Juli 2003, Aufgerufen: gcov: a Test Coverage Program, Aufgerufen: Fröhlich, Peter H.: The GNU Coverage Tool A Brief Tutorial GCC Homepage GNU Project, Stand: , Aufgerufen: Code Coverage mit gcov 16
Software-Test: Strukturtest
Software-est: Strukturtest Andreas Zeller Lehrstuhl für Softwaretechnik Universität des Saarlandes, Saarbrücken 2006-02-02 Welche estfälle auswählen? Ich kann nur eine beschränkte Zahl von Läufen testen
Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A
2.4.6. Kontrollstrukturen if-anweisung: Bedingte Ausführung (Verzweigung) 2 Varianten: if (Bedingung) Anweisung (Anweisung = einzelne Anweisung oder Block) Bedeutung: die Anweisung wird nur ausgeführt,
Teil I Debuggen mit gdb
Teil I Debuggen mit gdb Wer kennt das nicht? $./a.out Segmentation fault Was tun dagegen? printf()s in den Code einfügen? Besser (und professioneller): Einen Debugger verwenden Wer kennt das nicht? $./a.out
ASIL-relevante SW-Module identifiziert! Was nun?
ASIL-relevante SW-Module identifiziert! Was nun? ASIL-relevante SW-Module testen Blick in die EN 26262 Häufige Irrtümer in der Praxis Funktionale Tests in die Tiefe Funktionale Tests weiter optimieren
C++ OpenCppCoverage. Detlef Wilkening
http://www.wilkening-online.de Seite 1 / 52 C++ OpenCppCoverage Detlef Wilkening 10.11.2016 http://www.wilkening-online.de Seite 2 / 52 Warum überhaupt dieser Vortrag? Wir waren mal wieder in einer Gruppe
Kurzeinführung in C99
Kurzeinführung in C99 Institut für Numerische Simulation Rheinische Friedrich-Wilhelms-Universität Bonn Oktober 2013 Überblick 1 Compiler und Editoren - Was wird benötigt um ein Programm zu erstellen 2
2 Teil 2: Nassi-Schneiderman
2 Teil 2: Nassi-Schneiderman Wie kann man Nassi-Schneiderman in einer objektorientierten Sprache verwenden? Jedes Objekt besitzt Methoden, welche die Attribute des Objektes verändern. Das Verhalten der
Programmiersprachen Einführung in C
Programmiersprachen Einführung in C Teil 2: Prof. Dr. Unser erstes C-Programm int main (int argc, char *argv[]) int i; int sum = 0; for (i = 0; i
Debugging mit ddd (Data Display Debugger)
Debugging mit ddd (Data Display Debugger) 1 Testprogramm installieren und ausführen Laden Sie sich das Fortran Programm sample.f90 und das Makefile herunter und speichern Sie sie in einem Verzeichnis.
Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Nachklausur am
1 Aufgabe 1 Analysiert man das Verfahren anhand des angegebenen Beispiels, ist schnell zu erkennen, dass das erste Element von infeld2 nach outfeld an Index 2 kopiert wird, das zweite den Index 4 bekommt,
Java Anweisungen und Ablaufsteuerung
Informatik 1 für Nebenfachstudierende Grundmodul Java Anweisungen und Ablaufsteuerung Kai-Steffen Hielscher Folienversion: 24. Januar 2017 Informatik 7 Rechnernetze und Kommunikationssysteme Inhaltsübersicht
1 Visual-LISP Editor ab AutoCAD 2000
1 Visual-LISP Editor ab AutoCAD 2000 1.1 Allgemein Der Visual-LISP Editor ist eine komfortable Programmierumgebung innerhalb der AutoCAD- Sitzung. LISP-Programme können in die aktuelle Zeichnung geladen
Assembler - Einleitung
Assembler - Einleitung Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2008 Assembler - Einleitung 1/19 2008-04-01 Teil 1: Hochsprache
Just-In-Time-Compiler (2)
Just-In-Time-Compiler (2) Dr.-Ing. Volkmar Sieh Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2015/2016 V. Sieh Just-In-Time-Compiler
Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8
Java 8 Elmar Fuchs Grundlagen Programmierung 1. Ausgabe, Oktober 2014 JAV8 5 Java 8 - Grundlagen Programmierung 5 Kontrollstrukturen In diesem Kapitel erfahren Sie wie Sie die Ausführung von von Bedingungen
Programmablaufpläne. Vorgehen zur Erstellung eines lauffähigen C-Programms
Programmablaufpläne Vorgehen zur Erstellung eines lauffähigen C-Programms Dieser Leitfaden soll eine Einführung in das Erstellen von Programmablaufplänen (kurz: PAP) geben. PAP erleichtern das Erstellen
Bedingte Anweisungen
Bedingte Anweisungen Bedingte Anweisungen werden nicht immer ausgeführt, sondern nur, wenn eine Bedingung erfüllt (wahr) ist. C/C++/Java bieten hier 2 Konstruktionen an: if-anweisung sowie switch-case
C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22
C++ Teil 2 Sven Groß IGPM, RWTH Aachen 16. Apr 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 2 16. Apr 2015 1 / 22 Themen der letzten Vorlesung Hallo Welt Elementare Datentypen Ein-/Ausgabe Operatoren Sven
Java: Eine kurze Einführung an Beispielen
Java: Eine kurze Einführung an Beispielen Quellcode, javac und die JVM Der Quellcode eines einfachen Java-Programms besteht aus einer Datei mit dem Suffix.java. In einer solchen Datei wird eine Klasse
Just-In-Time-Compiler (2)
Just-In-Time-Compiler (2) Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2011/2012 Just-In-Time-Compiler (2) 1/13 2011-09-12 Just-In-Time-Compiler
Fachhochschule Südwestfalen Wir geben Impulse. Kontrollstrukturen und Schleifen in Octave
Fachhochschule Südwestfalen Wir geben Impulse Kontrollstrukturen und Schleifen in Octave Einführung Inhalt m-files Script-Files Function-Files Ein- Ausgabe von Variablen oder Ergebnissen For-Schleife While-Schleife
JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.
JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung
Javakurs für Anfänger
Javakurs für Anfänger Einheit 06: Einführung in Kontrollstrukturen Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda 1. Teil: Einführung in Kontrollstrukturen 3 Grundstrukturen von
Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften
Programmiertechnik Teil 4 C++ Funktionen: Prototypen Overloading Parameter C++ Funktionen: Eigenschaften Funktionen (Unterprogramme, Prozeduren) fassen Folgen von Anweisungen zusammen, die immer wieder
Intensivübung zu Algorithmen und Datenstrukturen
Intensivübung zu Algorithmen und Datenstrukturen Silvia Schreier Informatik 2 Programmiersysteme Martensstraße 3 91058 Erlangen Übersicht Programmierung Fallunterscheidung Flussdiagramm Bedingungen Boolesche
Grundlagen der Programmentwicklung
Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling [email protected] Hochschule Darmstadt Fachbereich Informatik WS 2013/14 Über C++ Über C++ C++ ist eine in der Industrie
Arrays. Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss
Arrays FTI 41 2005-09-09 Arrays werden verwendet, wenn viele Variablen benötigt werden. Der Vorteil in Arrays liegt darin, dass man nur eine Variable deklarieren muss z.b. Dim Werte(x) As Single. Wobei
Java Ablaufsteuerung (Beispiele)
Informatik 1 für Nebenfachstudierende Grundmodul Java Ablaufsteuerung (Beispiele) Kai-Steffen Hielscher Folienversion: 16. Januar 2018 Informatik 7 Rechnernetze und Kommunikationssysteme Blöcke Anweisungen
Programmieren in Haskell Debugging
Programmieren in Haskell Debugging Peter Steffen Universität Bielefeld Technische Fakultät 30.01.2009 1 Programmieren in Haskell Debugger Definition laut Wikipedia: Ein Debugger (von engl. bug im Sinne
Profiling und Coverage mit GNU und Bare Embedded Systems
Profiling und Coverage mit GNU und Bare Embedded Systems Life is too short for bad tools! Prof. Erich Styger [email protected] +41 41 349 33 01 Coverage und Profiling Coverage: Analyse der Testabdeckung
06 While-Schleifen. While-Schleifen 1/7 Wiederholung: Schleifen
06 While-Schleifen While-Schleifen 1/7 Wiederholung: Schleifen Eine Schleife ist eine Struktur, welche den Computer anweist, eine Liste von Befehlen mehrmals auszuführen. Falls Du ein Verfahren hast, das
C/C++ Debugging mit CDT unter Eclipse
C/C++ Debugging mit CDT unter Eclipse Bevor Sie mit dem Debuggen beginnen können, müssen Sie eine compilierbare Applikation erstellen, also eine Applikation, die keine Syntaxfehler mehr enthält. Sie können
Was ist ein Profiler?
Profiling Was ist ein Profiler? (Theorie) Invasives Profiling Nichtinvasives Profiling Profiling in der Praxis gprof, gcov OProfile valgrind/callgrind Intel VTune Was ist ein Profiler? Analyse des Laufzeitverhaltens
2 Eine einfache Programmiersprache
2 Eine einfache Programmiersprache Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Als Beispiel betrachten wir
Vom Testkonzept zu JUnit
Testen und Testkonzept Dipl.-Inf. (FH) Christopher Olbertz 2. Dezember 2014 Testen und Testkonzept Warum testen? Wichtig, obwohl bei Programmierern unbeliebt Stellt weitgehend korrekte Funktionsweise eines
Einführung in den Einsatz von Objekt-Orientierung mit C++ I
Einführung in den Einsatz von Objekt-Orientierung mit C++ I ADV-Seminar Leiter: Mag. Michael Hahsler Syntax von C++ Grundlagen Übersetzung Formale Syntaxüberprüfung Ausgabe/Eingabe Funktion main() Variablen
hue12 January 24, 2017
hue12 January 24, 2017 1 Abgabehinweise Beachten Sie unbedingt diese Hinweise, sonst erhalten Sie keine Punkte aus dieser Abgabe! Für Details siehe z.b. Folien der nullten Zentralübung 1.1 Namen und Matrikelnummern
S. d. I.: Programieren in C Folie 4-1. im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then"
S. d. I.: Programieren in C Folie 4-1 4 Anweisungen 4.1 if-anweisung 1) if (Ausdruck) 2) if (Ausdruck) } else im Gegensatz zu Pascal gibt es in C kein Schlüsselwort "then" es wird nur der numerische Wert
Probeklausur Name: (c)
Einführung in die Praktische Informatik 30.1.2013 Probeklausur Name: Teil I: Datentypen (20 Punkte) Lösen sie die Probleme, indem sie die korrekten Lösungen ankreuzen bzw. in die vorgesehenen Freiräume
Programmsteuerung mit PHP - if/else, elseif,switch
Programmsteuerung mit PHP - if/else, elseif,switch Bei der Programmierung geht es meist vor allem darum festzulegen, welche Aktionen wie oft unter welchen Bedingungen ausgeführt werden sollen. Hierzu steht
Ein kleiner Blick auf die generische Programmierung
TgZero Technik.Blosbasis.net June 3, 2013 1 Inhaltsverzeichnis 1 Vorwort 3 2 Ein kleines Beispiel 3 3 Templates 3 4 Verschiedene Datentypen 4 5 Variadic Templates 5 6 Unterschied zwischen den Programmiersprachen
Oracle Forms Was validiere ich wo?
Oracle Forms Was validiere ich wo? Autor: Torsten Pattberg, Opitz Consulting Gummersbach GmbH DOAGNews Q1_2004 Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die
Algorithmen & Programmierung. Steuerstrukturen im Detail Selektion und Iteration
Algorithmen & Programmierung Steuerstrukturen im Detail Selektion und Iteration Selektion Selektion Vollständige einfache Selektion Wir kennen schon eine Möglichkeit, Selektionen in C zu formulieren: if
Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion. Programmieren in C
Übersicht Funktionen Verwendung Vereinbarung Wert einer Funktion Aufruf einer Funktion Parameter Rekursion Sinn von Funktionen Wiederverwendung häufig verwendeter nicht banaler Programmteile Wiederverwendung
Informationen zur Verwendung von Visual Studio und cmake
Inhaltsverzeichnis Informationen zur Verwendung von Visual Studio und cmake...2 Erste Schritte mit Visual Studio...2 Einstellungen für Visual Studio 2013...2 Nutzung von cmake...5 Installation von cmake...5
Programmiertechnik Kontrollstrukturen
Programmiertechnik Kontrollstrukturen Prof. Dr. Oliver Haase Oliver Haase Hochschule Konstanz 1 Was sind Kontrollstrukturen? Kontrollstrukturen erlauben es, ein Programm nicht nur Zeile für Zeile auszuführen,
Peter Prinz. Das Übungsbuch. CTestfragen und Aufgaben mit Lösungen
Peter Prinz Das Übungsbuch CTestfragen und Aufgaben mit Lösungen Grundlagen Dieses Kapitel enthält grundlegende Fragen und Aufgaben zur Erstellung von C-Programmen. Hierzu gehören folgende Themen: Header-Dateien
Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.
Seite 1 von 9 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 12 Pkt.) Was liefert
Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Kontrollstrukturen
Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer Programmiertechnik Kontrollstrukturen Was sind Kontrollstrukturen Kontrollstrukturen erlauben es, ein Programm nicht nur Zeile für Zeile auszuführen,
6. Zeiger Allgemeines Definition eines Zeigers
6. Zeiger www.c-programme.de Stefan Thiemert Kapitel 6 - Seite 1 von 6 6. 1. Allgemeines Zeiger spielen in der Programmierung eine wichtige Rolle. Sie sind wichtig, bei der Arbeit mit Arrays und Funktionen.
FACHHOCHSCHULE AUGSBURG Hochschule für Technik, Wirtschaft und Gestaltung
C Sprachelemente für Übung 2 Typumwandlungen (type casts) Bei Ausdrücken, in denen Operanden mit unterschiedlichem Typ vorkommen, werden diese vom Compiler vor der Ausführung automatisch in einen gemeinsamen
C++ Teil Schleifen. Man kann bestimme Anweisungen in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen.
C++ Teil 3 3.3 Schleifen Man kann bestimme en in einem Programm mehrfach ausführen lassen. Dazu gibt es in C++ verschiedene Schleifen. for-schleife for-schleife while-schleife do-while-schleife for ( Ausdruck1;
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 7. Funktionen Einleitung Nach dem Prinzip Divide and Conquer bietet es sich an, größere Aufgaben in kleinere Teile zu unterteilen. Anweisungsblöcke,
Greenfoot: Verzweigungen Nicolas Ruh und Dieter Koch
Greenfoot: Verzweigungen Nicolas Ruh und Dieter Koch Betrachten wir die act()-methode des Wombats aus dem Wombats-Szenario: Wie interpretieren Sie diesen Code? (einfach übersetzen) Falls der Wombat ein
Proseminar. C-Programmierung Grundlagen und Konzepte. Der Präprozessor. von: Svenja Neef
Proseminar C-Programmierung Grundlagen und Konzepte Der Präprozessor von: Svenja Neef Inhaltsverzeichnis 1Der C-Präprozessor...2 1.1Was ist der C-Präprozessor...2 1.2Präprozessor-Befehle...2 1.2.1Zusammenführen
Einführung in die Programmierung II. 3. Kontrollstrukturen
Einführung in die Programmierung II 3. Kontrollstrukturen Thomas Huckle, Stefan Zimmer 2.5.2007-1- Anweisungen: was bisher geschah Bisher kennen wir zwei Formen von Anweisungen Ein Ausdruck mit Semikolon
6. Grundlagen der Programmierung
Computeranwendung in der Chemie Informatik für Chemiker(innen) 6. Grundlagen der Programmierung Jens Döbler 2003 "Computer in der Chemie", WS 2003-04, Humboldt-Universität VL6 Folie 1 Dr. Jens Döbler Grundlagen
Vorbemerkung. Allgemeines zu Shell Scripts. Aufruf. Einfaches Beispiel
Inhalt: Vorbemerkung...1 Allgemeines zu Shell Scripts...1 Aufruf...1 Einfaches Beispiel...1 Testen eines Shell-Scripts...2 Kommandozeilen-Parameter...2 Prozeßsteuerung...3 Bedingte Ausführung: if...3 Mehrfachentscheidung:
Einführung in die Programmierung Wintersemester 2011/12
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund : Kontrollstrukturen Inhalt Wiederholungen - while
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 5. Kontrollstrukturen Allgemein Kontrollstrukturen dienen zur Steuerung des Programmablaufs. (Bemerkung: C und C++ besitzen die selben Kontrollstrukturen.)
2 Eine einfache Programmiersprache. Variablen. Operationen Zuweisung. Variablen
Variablen Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Variablen dienen zur Speicherung von Daten. Um Variablen
2 Eine einfache Programmiersprache
2 Eine einfache Programmiersprache Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Als Beispiel betrachten wir
Allgemeines. Shell Programmierung Unix. Kommentar. Vorgangsweise. Mag. Thomas Griesmayer
Allgemeines Shell Programmierung Unix Shell Scripts Unix Ein shell script ist eine Textdatei, welche eine Liste von Befehlen (Standard Unix Befehle) beinhaltet. Diese Datei kann durch Aufrufen ausgeführt
Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 10
Prof. Dr. Wilhelm Schäfer Paderborn, 5. Januar 2015 Christian Brenner Tristan Wittgen Musterlösung zur Vorlesung Modellbasierte Softwareentwicklung Wintersemester 2014/2015 Übungsblatt 10 Aufgabe 1 Decision-Tables
Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.
Ziele sind das Arbeiten mit Funktionen und dem Aufzählungstyp (enum), sowie - einfache Verzweigung (if else) - Alternativen switch case - einfache Schleifen (while oder do while) Aufgabe 3: Diese Aufgabe
C# - Einführung in die Programmiersprache Fehler abfangen. Leibniz Universität IT Services Anja Aue
C# - Einführung in die Programmiersprache Fehler abfangen Leibniz Universität IT Services Anja Aue Fehler in einem Programm Warnungen sind Hinweise auf eventuelle Fehler während der Laufzeit des Programms.
if ( Logischer Operator ) { } else { Anweisungen false
if ( Logischer Operator ) { Anweisungen true else { Anweisungen false Bedingte Anweisungen Operatoren verknüpfen Variable zu neuen Ausdrücken, wir unterscheiden Arithmetische Operatoren Berechnung von
4.4 Imperative Algorithmen Verzweigung und Iteration
Eine weitere bedingte Schleife kann in Java mit dem Schlüsselwort for definiert werden: for (; i ; ) Alle drei Bestandteile im Schleifenkopf sind Ausdrücke
Übungspaket 12 Der Datentyp char
Übungspaket 12 Der Datentyp char Übungsziele: Skript: 1. Umgang mit dem Datentyp char, 2. Deklarationen von char-variablen, 3. char-konstanten 4. und char-rechenoperationen. Kapitel: 29 bis 31 sowie 24,
Javakurs für Anfänger
Javakurs für Anfänger Einheit 05: Weitere Kontrollstrukturen Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme 1. Teil: Weitere Kontrollstrukturen Wiederholungsstrukturen (Schleifen) While-,do-,for-Schleifen
2 Eine einfache Programmiersprache
2 Eine einfache Programmiersprache Eine Programmiersprache soll Datenstrukturen anbieten Operationen auf Daten erlauben Kontrollstrukturen zur Ablaufsteuerung bereitstellen Als Beispiel betrachten wir
Übungspaket 9 Logische Ausdrücke
Übungspaket 9 Logische Ausdrücke Übungsziele: Skript: 1. Umgang mit logischen Vergleichs- und Verknüpfungsoperatoren 2. Bilden einfacher und komplexer logischer Ausdrücke Kapitel: 22 Semester: Wintersemester
Kontrollstrukturen -- Schleifen und Wiederholungen
Kontrollstrukturen -- Schleifen und Wiederholungen Informatik für Elektrotechnik und Informationstechnik Benedict Reuschling [email protected] Hochschule Darmstadt Fachbereich Informatik WS 2013/14
Klausur: Informatik, am 11. Juli 2013 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:
Seite 1 von 10 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 6 Pkt.) a) Geben
Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems
4. Algorithmen Motivation Algorithmen als systematische Vorgehensweisen zur Lösung eines formal definierten Problems Der Begriff Algorithmus geht auf den Gelehrten Muhammad al-chwarizmi zurück, der um
Strukturorientierter Softwaretest Erstellung eines Tools zur Überdeckungsmessung
Strukturorientierter Softwaretest Erstellung eines Tools zur Überdeckungsmessung Ronny Treyße & Hendrik Seffler HU Berlin Themenvorstellung p.1/33 Aufgabenstellung Überdeckungstesttool für C++ & Java Das
Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen
Das diesem Dokument zugrundeliegende Vorhaben wurde mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen 16OH21005 gefördert. Die Verantwortung für den Inhalt dieser
Inhaltsverzeichnis. Kapitel i: Schnelleinstieg 13. Kapitel 2: Was sind Programme? 17. Kapitel 3: Wie erstellt man eigene Programme?
Liebe Leserin, lieber Leser 10 Kapitel i: Schnelleinstieg 13 Kapitel 2: Was sind Programme? 17 Was ist ein Programm? 18 Sprechen Sie Computer? 18 Von der Idee zum Programm 19 Von Windows, Fenstern und
Qualitätssicherung von Software
Qualitätssicherung von Software Prof. Dr. Holger Schlingloff Humboldt-Universität zu Berlin und Fraunhofer FIRST 2.3 strukturelle Tests 24.11.2004 Folie 2 Hinweis auf Umfrage wir, das Institut für Informatik
Einfache Bedingte Ausführung
Kontrollstrukturen Bisher Programme mit Funktionen als einfache Folge von Befehlen Ablauf von Programmen darüber hinaus steuerbar über Bedingte Ausführung: Ausführung von Programmteilen (Befehlen oder
Kompaktkurs Einführung in die Programmierung. 4. Kontrollstrukturen
Kompaktkurs Einführung in die Programmierung 4. Kontrollstrukturen Stefan Zimmer 28.2.2008-1- Anweisungen: was bisher geschah Bisher kennen wir zwei Formen von Anweisungen Ein Ausdruck mit Semikolon ist
GERICHTETER GEWICHTETER GRAPH DESIGNDOKUMENT
User Requirements GERICHTETER GEWICHTETER GRAPH DESIGNDOKUMENT Softwareentwicklung Praktikum, Übungsbeispiel 1 Gruppe 18 Andreas Hechenblaickner [0430217] Daniela Kejzar [0310129] Andreas Maller [0431289]
Einführung in die Programmierung
: Inhalt Einführung in die Programmierung Wintersemester 2017/18 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund Wiederholungen - while - do-while - for
