Woher kommen Software-Fehler?  Andreas Zeller • Universität des Saarlandes
Eine F-16 (Nördliche Halbkugel)
Eine F-16 (Südliche Halbkugel)
F-16 Fahrgestell
Flughafen Denver
Airport opened 16 moslater;Soft ware firm (BEA) gotbankruptOverall damage 1.8 bln
// Get #years, #days since 1980days = ...;year = 1980;while (days > 365) {    if (IsLeapYear(year)) {        if (days > 36...
Der erste Bug    9. September 1947
Der erste Bug    9. September 1947
bug.aj@interface A {}aspect Test {  declare @field : @A int var* : @A;  declare @field : int var* : @A;    interface Subje...
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
bug.aj@interface A {}aspect Test {  declare @field : @A int var* : @A;  declare @field : int var* : @A;    interface Subje...
ajc Stack Tracejava.util.NoSuchElementException  at java.util.AbstractList$Itr     .next(AbstractList.java:427)  at org.as...
weaveAtFieldRepeatedlyfor (Iterator iter = itdFields.iterator();     iter.hasNext();) {    ...    for (Iterator iter2 = wo...
Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs...
Vereinfachen• Proceed by binary search. Throw away half  the input and see if the output is still wrong.• If not, go back ...
Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs...
Lenhof, Hans-Peter,, +49 681 302-64701, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9378406, +49 681 302 7790, lindig@cs...
Problem:Vereinfachen von Hand     ist grausam!
Delta DebuggingDelta Debugging isoliert automatisch Fehlerursachen:Eingaben: 1 von 436 Kontakten in ColumbaÄnderungen: 1 v...
Problem:Benutzeraktionen simulieren      ist umständlich!
Isolieren Relevanter Aufrufe              Schritt 1: Aufzeichnen                                       ↯   Vector()    add...
Isolieren Relevanter Aufrufe               Schritt 2: Abspielen                                      ↯    Vector()     add...
Isolieren Relevanter Aufrufe             Schritt 3:Vereinfachen                                      ↯    Vector()     add...
Isolieren Relevanter Aufrufe           Schritt 4: Testfall erzeugen                                          ↯  testVector...
Columba ContactModel                                         ↯  ContactModel() setSortString()setFormattedName()  setNickN...
Columba ContactModel  ContactModel()getPreferredEmail()   c: ContactModel                                        ↯
Unit TesttestContactModel(){    ContactModel c = new ContactModel();    String s = c.getPreferredEmail();}
getPreferredEmailpublic String getPreferredEmail() {   Iterator it = getEmailIterator();    // get first item    IEmailMod...
Delta DebuggingDelta Debugging isoliert automatisch Fehlerursachen:Eingaben: 1 von 436 Kontakten in ColumbaÄnderungen: 1 v...
#1 inSoftware Engineering BooksAlgorithms BooksSoftware Design Books
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
AspectJ                    Columba• Ungültige Benutzung von Iteratoren:  vor next() sollte hasNext() kommen• hasNext() ist...
Problem:Vorbedingungen spezifizieren       ist aufwändig!
OP-Miner                    Benutzungsmodelle                Temporale Eigenschaften                                      ...
OP-Miner                    Benutzungsmodelle                Temporale Eigenschaften                                      ...
Methodenmodellepublic Stack createStack () {  Random r = new Random ();  int n = r.nextInt ();  Stack s = new Stack ();  i...
Methodenmodelle                                Random r = new Random ();public Stack createStack () {  Random r = new Rand...
Methodenmodelle                                Random r = new Random ();public Stack createStack () {  Random r = new Rand...
Methodenmodelle                                Random r = new Random ();public Stack createStack () {  Random r = new Rand...
Methodenmodelle                                      Random r = new Random ();public Stack createStack () {  Random r = ne...
Methodenmodelle                                      Random r = new Random ();public Stack createStack () {  Random r = ne...
Benutzungsmodelle                 Random r = new Random ();                 int n = r.nextInt ();                 Stack s ...
Benutzungsmodelle                Stack s = new Stack (); s.push (-1);   s.push (rand (r));
Benutzungsmodelle      s.<init>()        s.push (_)      s.push (_)
Benutzungsmodelle                 Random r = new Random ();                 int n = r.nextInt ();                 Stack s ...
Benutzungsmodelle       Random r = new Random ();       int n = r.nextInt ();       s.push (rand (r));
Benutzungsmodelle     r.<init> ()     r.nextInt ()       Utils.rand (r)
OP-Miner                    Benutzungsmodelle                Temporale Eigenschaften                                      ...
OP-Miner                    Benutzungsmodelle                Temporale Eigenschaften                                      ...
Anomalien entdecken                         Temporale Eigenschaften                     start ≺     lock ≺       eof ≺    ...
Ein Defektfor (Iterator iter = itdFields.iterator();     iter.hasNext();) {    ...    for (Iterator iter2 = worthRetrying....
Noch ein Defektpublic void visitNEWARRAY (NEWARRAY o) {   byte t = o.getTypecode ();   if (!((t == Constants.T_BOOLEAN) ||...
Ein FehlalarmName internalNewName (String[] identifiers)  ...  for (int i = 1; i < count; i++) {    SimpleName name = new ...
Ein Code Smellpublic String getRetentionPolicy (){  ...  for (Iterator it = ...; it.hasNext();)  {      ... = it.next();  ...
AspectJDefekte         Code smells   Fehlalarme                   16                         42          242
Fehler finden          Table 2: Summary of the results for the experiment subjects. (See Section 5.2 for a discussion.)    ...
OP-MinerOP-Miner lernt operationale Vorbedingungen –wie man Argumente gewöhnlich konstruiertLernt aus gewöhnlicher Benutzu...
201,321,237200,000,000                 8,000                                      6,097150,000,000                 6,00010...
Ein Defekt               conspire-0.20 (IRC client)static int dcc_listen_init (…) {  dcc-sok = socket (…);  if (…) {    wh...
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
Problem: Wie können wir ausunseren Fehlern lernen?
Fehler   Versionen
Fehler auf         Code abbildenFehler                   Versionen
Fehler in AspectJ
SicherheitslückenWoher kommen diese Fehler?     in Firefox
Sind es die Entwickler?     Macht            Je mehrErfahrung einen   Erfahrung, desto Unterschied?       mehr Fehler!
Oder die Geschichte?Wir haben hier                 Dann sind dort viele Fehler                  noch mehr! gefunden…
Wie steht es mit Metriken? Korrelieren Metriken  mit Fehlerdichte?                        Manchmal!
Programmiersprache? Sind gotos              Keine Korrelation! schädlich?
Ok. Problembereich?Welche Tokens    import • extendssind relevant?     • implements
✘       ✘       ✘                           ✘       ✘                       ✘       ✘       ✘nsIPrivateDOMEvent.h         ...
Vorhersage      Komponente          Tatsache    1        nsDOMClassInfo            3    2        SGridRowLayout           ...
•   Wissen, wo die Fehler sind•   Kalibrieren der Fehlervorhersage•   Wissen, wo die nächsten Fehler sind•   Vollautomatis...
Software-Archive• enthalten komplette Projektgeschichte• gepflegt durch Programmierumgebungen• automatischer Zugang• frei v...
Modelle   Specs     Code      Traces       Profile     Testse-mail    Fehler   Aufwand   Navigation   Versionen   Chats
Modelle   Specs     Code      Traces       Profile     Testse-mail    Fehler   Aufwand   Navigation   Versionen   Chats
Daten sammeln
Studien                                                   Make this                                                   Acti...
Diagnose                    Erkennen                   VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universitä...
Diagnose                                                             Erkennen   Vorbeugen             ZELLER              ...
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
Upcoming SlideShare
Loading in …5
×

Woher kommen Software-Fehler?

2,390 views

Published on

Jeder Programmierer kennt die Situation: Ein Programm läuft nicht so, wie es soll.  Ich stelle Techniken vor, die automatisch

(a) die Ursachen eines Fehlverhaltens finden - indem wir genau die Aspekte isolieren, die das Zustandekommen eines Fehlers verursachen;
(b) Programmfehler finden - indem wir aus dem Code "normale" Anweisungsfolgen lernen und nach Abweichungen suchen; und
(c) vorhersagen, wo in Zukunft Fehler auftreten werden - indem wir maschinell lernen, welche Code- und Prozesseigenschaften bisher mit Fehlern korrelierten.

Fallstudien an echten Programmen mit echten Fehlern, von AspectJ über Firefox zu Windows demonstrieren die Praxistauglichkeit der vorgestellten Verfahren.

Andreas Zeller ist Professor für Softwaretechnik an der Universität des Saarlandes in Saarbrücken.  Sein Forschungsgebiet ist die Analyse großer Software-Systeme und deren Fehler.  Sein Buch "Why Programs Fail - A Guide to Systematic Debugging" wurde 2006 mit dem Jolt Software Development Productivity Award ausgezeichnet.

Vortrag der GI Regionalgruppe Rhein-Neckar 2008-06-19

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,390
On SlideShare
0
From Embeds
0
Number of Embeds
31
Actions
Shares
0
Downloads
26
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Woher kommen Software-Fehler?

  1. 1. Woher kommen Software-Fehler? Andreas Zeller • Universität des Saarlandes
  2. 2. Eine F-16 (Nördliche Halbkugel)
  3. 3. Eine F-16 (Südliche Halbkugel)
  4. 4. F-16 Fahrgestell
  5. 5. Flughafen Denver
  6. 6. Airport opened 16 moslater;Soft ware firm (BEA) gotbankruptOverall damage 1.8 bln
  7. 7. // Get #years, #days since 1980days = ...;year = 1980;while (days > 365) { if (IsLeapYear(year)) { if (days > 366) { days -= 366; year += 1; } } else { days -= 365; year += 1; }}
  8. 8. Der erste Bug 9. September 1947
  9. 9. Der erste Bug 9. September 1947
  10. 10. bug.aj@interface A {}aspect Test { declare @field : @A int var* : @A; declare @field : int var* : @A; interface Subject {} public int Subject.vara; public int Subject.varb;}class X implements Test.Subject {}
  11. 11. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  12. 12. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  13. 13. bug.aj@interface A {}aspect Test { declare @field : @A int var* : @A; declare @field : int var* : @A; interface Subject {} public int Subject.vara; public int Subject.varb;}class X implements Test.Subject {}
  14. 14. ajc Stack Tracejava.util.NoSuchElementException at java.util.AbstractList$Itr .next(AbstractList.java:427) at org.aspectj.weaver.bcel.BcelClassWeaver .weaveAtFieldRepeatedly (BcelClassWeaver.java:1016)
  15. 15. weaveAtFieldRepeatedlyfor (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... }}
  16. 16. Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de mozilla.csvMehlmann, Martin,,, mehlmann@st.cs.uni-sb.deMeyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099,meyer@cs.uni-sb.deMileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.deMüller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.deNir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.deOffergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.dePC, CC 2006,,, cc2006pc@st.cs.uni-sb.dePaul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.dePremraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.deReindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.deSchuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.deSchuler, Erika,, +49 6813025069, schuler@tf.uni-sb.deSchäfer, Christa, +49 6895 51165, +49 68130265011,Security, AG,,, security@st.cs.uni-sb.deSeidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.deSekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.deSliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.deSlusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.deSlusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.deSmolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.deSoftware-Evolution, AG,,, softevo@st.cs.uni-sb.deThiel, Frank,,, hausmeister@cs.uni-sb.deWeiß, Cathrin,,, weiss@st.cs.uni-sb.deWilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.deZeller, Andreas,,, zeller@cs.uni-sb.deZeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.deZimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
  17. 17. Vereinfachen• Proceed by binary search. Throw away half the input and see if the output is still wrong.• If not, go back to the previous state and discard the other half of the input. mozilla.csv ✔ ✘
  18. 18. Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de FehlerursacheMehlmann, Martin,,, mehlmann@st.cs.uni-sb.deMeyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099,meyer@cs.uni-sb.deMileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.deMüller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.deNir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.deOffergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.dePC, CC 2006,,, cc2006pc@st.cs.uni-sb.dePaul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.dePremraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.deReindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.deSchuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.deSchuler, Erika,, +49 6813025069, schuler@tf.uni-sb.deSchäfer, Christa, +49 6895 51165, +49 68130265011,Security, AG,,, security@st.cs.uni-sb.deSeidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.deSekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.deSliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.deSlusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.deSlusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.deSmolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.deSoftware-Evolution, AG,,, softevo@st.cs.uni-sb.deThiel, Frank,,, hausmeister@cs.uni-sb.deWeiß, Cathrin,,, weiss@st.cs.uni-sb.deWilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.deZeller, Andreas,,, zeller@cs.uni-sb.deZeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.deZimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
  19. 19. Lenhof, Hans-Peter,, +49 681 302-64701, lenhof@cs.uni-sb.deLindig, Christian, +49 681 9378406, +49 681 302 7790, lindig@cs.uni-sb.de FehlerursacheMehlmann, Martin,,, mehlmann@st.cs.uni-sb.deMeyer zu Tittingdorf, Friederike, +49 6894 890037, +49 681 302-78099,meyer@cs.uni-sb.deMileva, Yana,, +49 681 302-64020, mileva@cs.uni-sb.deMüller-Perich, Elisabeth,, +49 681 302-7070, sekr.techfak@rz.uni-sb.deNir-Bleimling, Naomi,, +49 68130264011, naomi@wjpserver.cs.uni-sb.deOffergeld, Thilo,, +49 681 302-6794, t.offergeld@univw.uni-sb.dePC, CC 2006,,, cc2006pc@st.cs.uni-sb.dePaul, Wolfgang, +4968171827, +49 6813022436, wjp@cs.uni-sb.dePremraj, Rahul, +44 7796973711, +49 681 302-64013, premraj@cs.uni-sb.deReindel, Erich, +49 6371 912842, +49 681 302-78091, reindel@cs.uni-sb.deSchuler, David,, +49 681 302-64026, schuler@st.cs.uni-sb.deSchuler, Erika,, +49 6813027069, schuler@tf.uni-sb.deSchäfer, Christa, +49 6895 51165, +49 68130265011,Security, AG,,, security@st.cs.uni-sb.deSeidel, Raimund, +49 6894 383698, +49 681 302-4713, rseidel@cs.uni-sb.deSekretariat, Sekretariat,, +49 681 302-64011, office@st.cs.uni-sb.deSliwerski, Jacek, +491741333208,, sliwers@st.cs.uni-sb.deSlusallek, Philipp, +49 6826 1 88 71 32, +49 681 302-3830, slusallek@cs.uni-sb.deSlusallek USA, Philipp, +1 670 391 9186, +1 408 486 2788, slusallek@cs.uni-sb.deSmolka, Gert, +49 681 782770, +49 681 302-7311, smolka@ps.uni-sb.deSoftware-Evolution, AG,,, softevo@st.cs.uni-sb.deThiel, Frank,,, hausmeister@cs.uni-sb.deWeiß, Cathrin,,, weiss@st.cs.uni-sb.deWilhelm, Reinhard,, +49 681 302-4399, wilhelm@cs.uni-sb.deZeller, Andreas,,, zeller@cs.uni-sb.deZeller, Andreas, +49 681 3710467, +49 681 302-64011, zeller@cs.uni-sb.deZimmermann, Tom, +49 871 71742 (Eltern), +1 403 210 9470, zimmerth@cs.uni-sb.de
  20. 20. Problem:Vereinfachen von Hand ist grausam!
  21. 21. Delta DebuggingDelta Debugging isoliert automatisch Fehlerursachen:Eingaben: 1 von 436 Kontakten in ColumbaÄnderungen: 1 von 8,721 Änderungen in GDBThreads: 1 von 3.8 bio Thread-Wechsel in Scene.java➔ Automatisierte Fehlersuche
  22. 22. Problem:Benutzeraktionen simulieren ist umständlich!
  23. 23. Isolieren Relevanter Aufrufe Schritt 1: Aufzeichnen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  24. 24. Isolieren Relevanter Aufrufe Schritt 2: Abspielen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  25. 25. Isolieren Relevanter Aufrufe Schritt 3:Vereinfachen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  26. 26. Isolieren Relevanter Aufrufe Schritt 4: Testfall erzeugen ↯ testVector() { Text Vector v = new Vector(); v.remove(obj); } JINSI
  27. 27. Columba ContactModel ↯ ContactModel() setSortString()setFormattedName() setNickName() c: ContactModel setFamilyName() setGivenName() und 18732 weitere…
  28. 28. Columba ContactModel ContactModel()getPreferredEmail() c: ContactModel ↯
  29. 29. Unit TesttestContactModel(){ ContactModel c = new ContactModel(); String s = c.getPreferredEmail();}
  30. 30. getPreferredEmailpublic String getPreferredEmail() { Iterator it = getEmailIterator(); // get first item IEmailModel model = (IEmailModel) it.next(); // backwards compatiblity // -> its not possible anymore to create a // contact model without email address if (model == null) return null; return model.getAddress();}
  31. 31. Delta DebuggingDelta Debugging isoliert automatisch Fehlerursachen:Eingaben: 1 von 436 Kontakten in ColumbaÄnderungen: 1 von 8,721 Änderungen in GDBThreads: 1 von 3.8 bio Thread-Wechsel in Scene.javaAufrufe: 2 von 18738 Methodenaufrufen 99,8% Verringerung des➔ Automatisierte Fehlersuche Suchraums
  32. 32. #1 inSoftware Engineering BooksAlgorithms BooksSoftware Design Books
  33. 33. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  34. 34. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  35. 35. AspectJ Columba• Ungültige Benutzung von Iteratoren: vor next() sollte hasNext() kommen• hasNext() ist operationale Vorbedingung
  36. 36. Problem:Vorbedingungen spezifizieren ist aufwändig!
  37. 37. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  38. 38. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  39. 39. Methodenmodellepublic Stack createStack () { Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; while (i < n) { s.push (rand (r)); i++; } s.push (-1); return s;}
  40. 40. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; while (i < n) { s.push (rand (r)); i++; } s.push (-1); return s;}
  41. 41. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); return s;}
  42. 42. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); i < n return s; i++;} s.push (rand (r));
  43. 43. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); i < n i < n return s; i++;} s.push (-1); s.push (rand (r));
  44. 44. Methodenmodelle Random r = new Random ();public Stack createStack () { Random r = new Random (); int n = r.nextInt (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; Stack s = new Stack (); while (i < n) { s.push (rand (r)); i++; int i = 0; } s.push (-1); i < n i < n return s; i++;} s.push (-1); s.push (rand (r));
  45. 45. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; i < n i < n i++; s.push (-1); s.push (rand (r));
  46. 46. Benutzungsmodelle Stack s = new Stack (); s.push (-1); s.push (rand (r));
  47. 47. Benutzungsmodelle s.<init>() s.push (_) s.push (_)
  48. 48. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); Stack s = new Stack (); int i = 0; i < n i < n i++; s.push (-1); s.push (rand (r));
  49. 49. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); s.push (rand (r));
  50. 50. Benutzungsmodelle r.<init> () r.nextInt () Utils.rand (r)
  51. 51. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  52. 52. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ nextProgramm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  53. 53. Anomalien entdecken Temporale Eigenschaften start ≺ lock ≺ eof ≺ stop unlock close get() ✘Methoden open() hello() parse()
  54. 54. Ein Defektfor (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... sollte iter2 sein }}
  55. 55. Noch ein Defektpublic void visitNEWARRAY (NEWARRAY o) { byte t = o.getTypecode (); if (!((t == Constants.T_BOOLEAN) || (t == Constants.T_CHAR) || ... (t == Constants.T_LONG))) { constraintViolated (o, "(...) +t+ (...)"); }} sollte “+t+” sein
  56. 56. Ein FehlalarmName internalNewName (String[] identifiers) ... for (int i = 1; i < count; i++) { SimpleName name = new SimpleName(this); name.internalSetIdentifier(identifiers[i]); ... } sollte unverändert ... bleiben}
  57. 57. Ein Code Smellpublic String getRetentionPolicy (){ ... for (Iterator it = ...; it.hasNext();) { ... = it.next(); ... return retentionPolicy; } ... sollte repariert werden}
  58. 58. AspectJDefekte Code smells Fehlalarme 16 42 242
  59. 59. Fehler finden Table 2: Summary of the results for the experiment subjects. (See Section 5.2 for a discussion.) # Violations Program Total Investigated # Defects # Code smells # False positives Efficiency A-Rʙ 0.8.2 25 25 2 13 10 60% Aʜ T 6.0.16 55 55 0 9 46 16% AʀɢUML 0.24 305 28 0 12 16 43% AJ 1.5.3 300 300 16 42 242 19% Aʀ 2.5.0.0 315 85 1 26 58 32% Cʟʙ 1.2 57 57 4 15 38 33% Eɪ 4.2 11 11 0 4 7 36% 1,068 562 23 121 417 26% String getPreferredEmail () {erator it = getEmailIterator (); • The tools we have used (JADET and Cʟɪʙʀɪ) couldmailModel = (IEmailModel) it.next (); fective. We think this is very improbable, especially f. ɪʙʀɪ, whose implementation is publicly available [28] JADET as well as the OP-Mɪɴʀ code, we have u thoroughly validated it, so we believe that any defects17: Another defect in Cʟʙ. Missing call to hasNext fect only a small number of OUMs and violations a
  60. 60. OP-MinerOP-Miner lernt operationale Vorbedingungen –wie man Argumente gewöhnlich konstruiertLernt aus gewöhnlicher Benutzung – allgemein und projektspezifischVollautomatischDutzende bestätigter Fehler gefunden
  61. 61. 201,321,237200,000,000 8,000 6,097150,000,000 6,000100,000,000 4,000 50,000,000 2,000 0 0 Codezeilen C-Projekte
  62. 62. Ein Defekt conspire-0.20 (IRC client)static int dcc_listen_init (…) { dcc-sok = socket (…); if (…) { while (…) { … = bind (dcc-sok, …); } /* with a small port range, reUseAddr is needed */ setsockopt (dcc-sok, …, SO_REUSEADDR, …); } listen (dcc-sok, …); muss vor bind() stehen}
  63. 63. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  64. 64. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  65. 65. Problem: Wie können wir ausunseren Fehlern lernen?
  66. 66. Fehler Versionen
  67. 67. Fehler auf Code abbildenFehler Versionen
  68. 68. Fehler in AspectJ
  69. 69. SicherheitslückenWoher kommen diese Fehler? in Firefox
  70. 70. Sind es die Entwickler? Macht Je mehrErfahrung einen Erfahrung, desto Unterschied? mehr Fehler!
  71. 71. Oder die Geschichte?Wir haben hier Dann sind dort viele Fehler noch mehr! gefunden…
  72. 72. Wie steht es mit Metriken? Korrelieren Metriken mit Fehlerdichte? Manchmal!
  73. 73. Programmiersprache? Sind gotos Keine Korrelation! schädlich?
  74. 74. Ok. Problembereich?Welche Tokens import • extendssind relevant? • implements
  75. 75. ✘ ✘ ✘ ✘ ✘ ✘ ✘ ✘nsIPrivateDOMEvent.h ✘ ✘ ✘ ✘ ✘ ✘ ✘ nsReadableUtils.h ✘ ✘ ✘ ✘
  76. 76. Vorhersage Komponente Tatsache 1 nsDOMClassInfo 3 2 SGridRowLayout 95 3 xpcprivate 6 4 jsxml 2 5 nsGenericHTMLElement 8 6 jsgc 3 7 nsISEnvironment 12 8 jsfun 1 9 nsHTMLLabelElement 18 10 nsHttpTransaction 35
  77. 77. • Wissen, wo die Fehler sind• Kalibrieren der Fehlervorhersage• Wissen, wo die nächsten Fehler sind• Vollautomatisch!
  78. 78. Software-Archive• enthalten komplette Projektgeschichte• gepflegt durch Programmierumgebungen• automatischer Zugang• frei verfügbar durch Open-Source Projekte Fehler Versionen
  79. 79. Modelle Specs Code Traces Profile Testse-mail Fehler Aufwand Navigation Versionen Chats
  80. 80. Modelle Specs Code Traces Profile Testse-mail Fehler Aufwand Navigation Versionen Chats
  81. 81. Daten sammeln
  82. 82. Studien Make this Actionable! Rosenberg, L. and Hyatt, L. “Developing An Effective Metrics Program”European Space Agency Software Assurance Symposium, Netherlands, March, 1996
  83. 83. Diagnose Erkennen VorbeugenWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  84. 84. Diagnose Erkennen Vorbeugen ZELLER WHY PROGRAMS FAIL WHY PROGRAMS FAIL A Guide to Systematic Debugging ANDREAS ZELLERWoher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes

×