SlideShare ist ein Scribd-Unternehmen logo
1 von 99
Downloaden Sie, um offline zu lesen
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 mos
later;
Soft ware firm (BEA) got
bankrupt
Overall damage 1.8 bln
// Get #years, #days since 1980
days = ...;
year = 1980;
while (days > 365) {
    if (IsLeapYear(year)) {
        if (days > 366) {
             days -= 366; year += 1;
        }
    }
    else {
        days -= 365; year += 1;
    }
}
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 Subject {}

    public int Subject.vara;
    public int Subject.varb;
}

class X implements Test.Subject {}
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
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 {}
ajc Stack Trace

java.util.NoSuchElementException
  at java.util.AbstractList$Itr
     .next(AbstractList.java:427)
  at org.aspectj.weaver.bcel.BcelClassWeaver
     .weaveAtFieldRepeatedly
     (BcelClassWeaver.java:1016)
weaveAtFieldRepeatedly

for (Iterator iter = itdFields.iterator();
     iter.hasNext();) {
    ...
    for (Iterator iter2 = worthRetrying.iterator();
         iter.hasNext();) {
        ...
    }
}
Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.de
Lindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de


                         mozilla.csv
Mehlmann, Martin,,, mehlmann@st.cs.uni-sb.de
Meyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099,
meyer@cs.uni-sb.de
Mileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.de
Müller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.de
Nir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.de
Offergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.de
PC, CC 2006,,, cc2006pc@st.cs.uni-sb.de
Paul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.de
Premraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.de
Reindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.de
Schuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.de
Schuler, Erika,, +49 6813025069, schuler@tf.uni-sb.de
Schäfer, Christa, +49 6895 51165, +49 68130265011,
Security, AG,,, security@st.cs.uni-sb.de
Seidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.de
Sekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.de
Sliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.de
Slusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.de
Slusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.de
Smolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.de
Software-Evolution, AG,,, softevo@st.cs.uni-sb.de
Thiel, Frank,,, hausmeister@cs.uni-sb.de
Weiß, Cathrin,,, weiss@st.cs.uni-sb.de
Wilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.de
Zeller, Andreas,,, zeller@cs.uni-sb.de
Zeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.de
Zimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
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

                                              ✔
                                              ✘
Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.de
Lindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de


                    Fehlerursache
Mehlmann, Martin,,, mehlmann@st.cs.uni-sb.de
Meyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099,
meyer@cs.uni-sb.de
Mileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.de
Müller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.de
Nir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.de
Offergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.de
PC, CC 2006,,, cc2006pc@st.cs.uni-sb.de
Paul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.de
Premraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.de
Reindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.de
Schuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.de
Schuler, Erika,, +49 6813025069, schuler@tf.uni-sb.de
Schäfer, Christa, +49 6895 51165, +49 68130265011,
Security, AG,,, security@st.cs.uni-sb.de
Seidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.de
Sekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.de
Sliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.de
Slusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.de
Slusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.de
Smolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.de
Software-Evolution, AG,,, softevo@st.cs.uni-sb.de
Thiel, Frank,,, hausmeister@cs.uni-sb.de
Weiß, Cathrin,,, weiss@st.cs.uni-sb.de
Wilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.de
Zeller, Andreas,,, zeller@cs.uni-sb.de
Zeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.de
Zimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
Lenhof, Hans-Peter,, +49 681 302-64701, lenhof@cs.uni-sb.de
Lindig, Christian, +49 681 9378406, +49 681 302 7790, lindig@cs.uni-sb.de


                    Fehlerursache
Mehlmann, Martin,,, mehlmann@st.cs.uni-sb.de
Meyer zu Tittingdorf, Friederike, +49 6894 890037, +49 681 302-78099,
meyer@cs.uni-sb.de
Mileva, Yana,, +49 681 302-64020, mileva@cs.uni-sb.de
Müller-Perich, Elisabeth,, +49 681 302-7070, sekr.techfak@rz.uni-sb.de
Nir-Bleimling, Naomi,, +49 68130264011, naomi@wjpserver.cs.uni-sb.de
Offergeld, Thilo,, +49 681 302-6794, t.offergeld@univw.uni-sb.de
PC, CC 2006,,, cc2006pc@st.cs.uni-sb.de
Paul, Wolfgang, +4968171827, +49 6813022436, wjp@cs.uni-sb.de
Premraj, Rahul, +44 7796973711, +49 681 302-64013, premraj@cs.uni-sb.de
Reindel, Erich, +49 6371 912842, +49 681 302-78091, reindel@cs.uni-sb.de
Schuler, David,, +49 681 302-64026, schuler@st.cs.uni-sb.de
Schuler, Erika,, +49 6813027069, schuler@tf.uni-sb.de
Schäfer, Christa, +49 6895 51165, +49 68130265011,
Security, AG,,, security@st.cs.uni-sb.de
Seidel, Raimund, +49 6894 383698, +49 681 302-4713, rseidel@cs.uni-sb.de
Sekretariat, Sekretariat,, +49 681 302-64011, office@st.cs.uni-sb.de
Sliwerski, Jacek, +491741333208,, sliwers@st.cs.uni-sb.de
Slusallek, Philipp, +49 6826 1 88 71 32, +49 681 302-3830, slusallek@cs.uni-sb.de
Slusallek USA, Philipp, +1 670 391 9186, +1 408 486 2788, slusallek@cs.uni-sb.de
Smolka, Gert, +49 681 782770, +49 681 302-7311, smolka@ps.uni-sb.de
Software-Evolution, AG,,, softevo@st.cs.uni-sb.de
Thiel, Frank,,, hausmeister@cs.uni-sb.de
Weiß, Cathrin,,, weiss@st.cs.uni-sb.de
Wilhelm, Reinhard,, +49 681 302-4399, wilhelm@cs.uni-sb.de
Zeller, Andreas,,, zeller@cs.uni-sb.de
Zeller, Andreas, +49 681 3710467, +49 681 302-64011, zeller@cs.uni-sb.de
Zimmermann, Tom, +49 871 71742 (Eltern), +1 403 210 9470, zimmerth@cs.uni-sb.de
Problem:
Vereinfachen von Hand
     ist grausam!
Delta Debugging
Delta Debugging isoliert automatisch Fehlerursachen:
Eingaben: 1 von 436 Kontakten in Columba
Änderungen: 1 von 8,721 Änderungen in GDB
Threads: 1 von 3.8 bio Thread-Wechsel in Scene.java


➔ Automatisierte Fehlersuche
Problem:
Benutzeraktionen simulieren
      ist umständlich!
Isolieren Relevanter Aufrufe
              Schritt 1: Aufzeichnen




                                       ↯
   Vector()
    add()
    add()
   remove()              v:Vector

   remove()
   remove()

                           JINSI
                                       Event
                                        Log
Isolieren Relevanter Aufrufe
               Schritt 2: Abspielen




                                      ↯
    Vector()
     add()
     add()
    remove()             v:Vector

    remove()
    remove()

               JINSI
                                      Event
                                       Log
Isolieren Relevanter Aufrufe
             Schritt 3:Vereinfachen




                                      ↯
    Vector()
     add()
     add()
    remove()            v:Vector

    remove()
    remove()

               JINSI
                                      Event
                                       Log
Isolieren Relevanter Aufrufe
           Schritt 4: Testfall erzeugen




                                          ↯
  testVector()
  {                Text
      Vector v = new Vector();
      v.remove(obj);
  }



               JINSI
Columba ContactModel



                                         ↯
  ContactModel()
 setSortString()
setFormattedName()
  setNickName()        c: ContactModel

 setFamilyName()
  setGivenName()

  und 18732 weitere…
Columba ContactModel

  ContactModel()
getPreferredEmail()   c: ContactModel


                                        ↯
Unit Test

testContactModel()
{
    ContactModel c = new ContactModel();
    String s = c.getPreferredEmail();
}
getPreferredEmail
public 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();
}
Delta Debugging
Delta Debugging isoliert automatisch Fehlerursachen:
Eingaben: 1 von 436 Kontakten in Columba
Änderungen: 1 von 8,721 Änderungen in GDB
Threads: 1 von 3.8 bio Thread-Wechsel in Scene.java
Aufrufe: 2 von 18738 Methodenaufrufen 99,8%
                                     Verringerung des
➔ Automatisierte Fehlersuche            Suchraums
#1 in
Software Engineering Books
Algorithms Books
Software Design Books
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
AspectJ                    Columba



• Ungültige Benutzung von Iteratoren:
  vor next() sollte hasNext() kommen

• hasNext() ist operationale Vorbedingung
Problem:
Vorbedingungen spezifizieren
       ist aufwändig!
OP-Miner
                    Benutzungsmodelle                Temporale Eigenschaften

                                                           hasNext ≺ next
Programm        iter.hasNext ()    iter.next ()
                                                           hasNext ≺ hasNext
                                                           next ≺ hasNext
                                                           next ≺ next




                Anomalien                             Muster
               hasNext ≺ next
           ✓   hasNext ≺ hasNext                  hasNext ≺ next
               hasNext ≺ next                     hasNext ≺ hasNext
           ✗   hasNext ≺ hasNext
OP-Miner
                    Benutzungsmodelle                Temporale Eigenschaften

                                                           hasNext ≺ next
Programm        iter.hasNext ()    iter.next ()
                                                           hasNext ≺ hasNext
                                                           next ≺ hasNext
                                                           next ≺ next




                Anomalien                             Muster
               hasNext ≺ next
           ✓   hasNext ≺ hasNext                  hasNext ≺ next
               hasNext ≺ next                     hasNext ≺ hasNext
           ✗   hasNext ≺ hasNext
Methodenmodelle
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;
}
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;
}
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;
}
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));
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));
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));
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));
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 = new Stack ();


                 int i = 0;


         i < n   i < n
                                      i++;
 s.push (-1);    s.push (rand (r));
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

                                                           hasNext ≺ next
Programm        iter.hasNext ()    iter.next ()
                                                           hasNext ≺ hasNext
                                                           next ≺ hasNext
                                                           next ≺ next




                Anomalien                             Muster
               hasNext ≺ next
           ✓   hasNext ≺ hasNext                  hasNext ≺ next
               hasNext ≺ next                     hasNext ≺ hasNext
           ✗   hasNext ≺ hasNext
OP-Miner
                    Benutzungsmodelle                Temporale Eigenschaften

                                                           hasNext ≺ next
Programm        iter.hasNext ()    iter.next ()
                                                           hasNext ≺ hasNext
                                                           next ≺ hasNext
                                                           next ≺ next




                Anomalien                             Muster
               hasNext ≺ next
           ✓   hasNext ≺ hasNext                  hasNext ≺ next
               hasNext ≺ next                     hasNext ≺ hasNext
           ✗   hasNext ≺ hasNext
Anomalien entdecken
                         Temporale Eigenschaften
                     start ≺     lock ≺       eof ≺
                      stop       unlock       close


            get()                  ✘
Methoden




           open()


           hello()


           parse()
Ein Defekt

for (Iterator iter = itdFields.iterator();
     iter.hasNext();) {
    ...
    for (Iterator iter2 = worthRetrying.iterator();
         iter.hasNext();) {
        ... sollte iter2 sein
    }
}
Noch ein Defekt

public 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
Ein Fehlalarm
Name internalNewName (String[] identifiers)
  ...
  for (int i = 1; i < count; i++) {
    SimpleName name = new SimpleName(this);
    name.internalSetIdentifier(identifiers[i]);
    ...
  }                            sollte unverändert
  ...                                bleiben
}
Ein Code Smell
public String getRetentionPolicy ()
{
  ...
  for (Iterator it = ...; it.hasNext();)
  {
      ... = it.next();
      ...
      return retentionPolicy;
  }
  ...                   sollte repariert werden
}
AspectJ
Defekte         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.)

                                  # 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ʟɪʙʀɪ) could
mailModel = (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 defects
17: Another defect in Cʟʙ. Missing call to hasNext               fect only a small number of OUMs and violations a
OP-Miner
OP-Miner lernt operationale Vorbedingungen –
wie man Argumente gewöhnlich konstruiert
Lernt aus gewöhnlicher Benutzung – 
allgemein und projektspezifisch
Vollautomatisch
Dutzende bestätigter Fehler gefunden
201,321,237
200,000,000                 8,000

                                      6,097
150,000,000                 6,000


100,000,000                 4,000


 50,000,000                 2,000


         0                     0
              Codezeilen            C-Projekte
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
}
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
Problem:
 Wie können wir aus
unseren Fehlern lernen?
Fehler   Versionen
Fehler auf
         Code abbilden




Fehler                   Versionen
Fehler in AspectJ
Sicherheitslücken
Woher kommen diese Fehler?
     in Firefox
Sind es die Entwickler?


     Macht            Je mehr
Erfahrung 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 • extends
sind relevant?     • implements
✘       ✘       ✘
                           ✘       ✘
                       ✘       ✘       ✘
nsIPrivateDOMEvent.h
                           ✘       ✘
                       ✘    ✘          ✘
                         ✘     ✘
 nsReadableUtils.h
                           ✘
                       ✘     ✘   ✘
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
•   Wissen, wo die Fehler sind
•   Kalibrieren der Fehlervorhersage
•   Wissen, wo die nächsten Fehler sind
•   Vollautomatisch!
Software-Archive
• enthalten komplette Projektgeschichte
• gepflegt durch Programmierumgebungen
• automatischer Zugang
• frei verfügbar durch Open-Source Projekte

     Fehler                     Versionen
Modelle   Specs     Code      Traces       Profile     Tests




e-mail    Fehler   Aufwand   Navigation   Versionen   Chats
Modelle   Specs     Code      Traces       Profile     Tests




e-mail    Fehler   Aufwand   Navigation   Versionen   Chats
Daten sammeln
Studien


                                                   Make this
                                                   Actionable!




     Rosenberg, L. and Hyatt, L. “Developing An Effective Metrics Program”
European Space Agency Software Assurance Symposium, Netherlands, March, 1996
Diagnose                    Erkennen                   Vorbeugen




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
Diagnose                                                             Erkennen   Vorbeugen




             ZELLER
              WHY PROGRAMS FAIL




                                  WHY
                                  PROGRAMS
                                        FAIL
                                    A Guide to Systematic Debugging
                                                  ANDREAS ZELLER




Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes

Weitere ähnliche Inhalte

Mehr von CISPA Helmholtz Center for Information Security (11)

Software-Tests automatisch erzeugen: Frische Ansätze für Forschung, Praxis un...
Software-Tests automatisch erzeugen: Frische Ansätze für Forschung, Praxis un...Software-Tests automatisch erzeugen: Frische Ansätze für Forschung, Praxis un...
Software-Tests automatisch erzeugen: Frische Ansätze für Forschung, Praxis un...
 
On impact in Software Engineering Research (ICSE 2018 New Faculty Symposium)
On impact in Software Engineering Research (ICSE 2018 New Faculty Symposium)On impact in Software Engineering Research (ICSE 2018 New Faculty Symposium)
On impact in Software Engineering Research (ICSE 2018 New Faculty Symposium)
 
On Impact in Software Engineering Research
On Impact in Software Engineering ResearchOn Impact in Software Engineering Research
On Impact in Software Engineering Research
 
Twelve tips on how to prepare an ERC grant proposal
Twelve tips on how to prepare an ERC grant proposalTwelve tips on how to prepare an ERC grant proposal
Twelve tips on how to prepare an ERC grant proposal
 
Getting your work funded
Getting your work fundedGetting your work funded
Getting your work funded
 
Debugging Debugging
Debugging DebuggingDebugging Debugging
Debugging Debugging
 
Seeding Bugs To Find Bugs
Seeding Bugs To Find BugsSeeding Bugs To Find Bugs
Seeding Bugs To Find Bugs
 
Mining Processes
Mining ProcessesMining Processes
Mining Processes
 
Mining Programs
Mining ProgramsMining Programs
Mining Programs
 
Getting your paper accepted (at ISSTA 2008)
Getting your paper accepted (at ISSTA 2008)Getting your paper accepted (at ISSTA 2008)
Getting your paper accepted (at ISSTA 2008)
 
Do Bugs Reside in Complex Code?
Do Bugs Reside in Complex Code?Do Bugs Reside in Complex Code?
Do Bugs Reside in Complex Code?
 

Woher kommen Software-Fehler?

  • 1. Woher kommen Software-Fehler? Andreas Zeller • Universität des Saarlandes
  • 3. Eine F-16 (Südliche Halbkugel)
  • 6. Airport opened 16 mos later; Soft ware firm (BEA) got bankrupt Overall damage 1.8 bln
  • 7. // Get #years, #days since 1980 days = ...; year = 1980; while (days > 365) { if (IsLeapYear(year)) { if (days > 366) { days -= 366; year += 1; } } else { days -= 365; year += 1; } }
  • 8. Der erste Bug 9. September 1947
  • 9. Der erste Bug 9. September 1947
  • 10.
  • 11. 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 {}
  • 12.
  • 13.
  • 14.
  • 15. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 16. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 17. 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 {}
  • 18. ajc Stack Trace java.util.NoSuchElementException at java.util.AbstractList$Itr .next(AbstractList.java:427) at org.aspectj.weaver.bcel.BcelClassWeaver .weaveAtFieldRepeatedly (BcelClassWeaver.java:1016)
  • 19. weaveAtFieldRepeatedly for (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... } }
  • 20.
  • 21. Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.de Lindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de mozilla.csv Mehlmann, Martin,,, mehlmann@st.cs.uni-sb.de Meyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099, meyer@cs.uni-sb.de Mileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.de Müller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.de Nir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.de Offergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.de PC, CC 2006,,, cc2006pc@st.cs.uni-sb.de Paul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.de Premraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.de Reindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.de Schuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.de Schuler, Erika,, +49 6813025069, schuler@tf.uni-sb.de Schäfer, Christa, +49 6895 51165, +49 68130265011, Security, AG,,, security@st.cs.uni-sb.de Seidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.de Sekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.de Sliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.de Slusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.de Slusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.de Smolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.de Software-Evolution, AG,,, softevo@st.cs.uni-sb.de Thiel, Frank,,, hausmeister@cs.uni-sb.de Weiß, Cathrin,,, weiss@st.cs.uni-sb.de Wilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.de Zeller, Andreas,,, zeller@cs.uni-sb.de Zeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.de Zimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
  • 22. 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 ✔ ✘
  • 23. Lenhof, Hans-Peter,, +49 681 302-65501, lenhof@cs.uni-sb.de Lindig, Christian, +49 681 9558506, +49 681 302 5590, lindig@cs.uni-sb.de Fehlerursache Mehlmann, Martin,,, mehlmann@st.cs.uni-sb.de Meyer zu Tittingdorf, Friederike, +49 6895 890055, +49 681 302-58099, meyer@cs.uni-sb.de Mileva, Yana,, +49 681 302-63020, mileva@cs.uni-sb.de Müller-Perich, Elisabeth,, +49 681 302-5050, sekr.techfak@rz.uni-sb.de Nir-Bleimling, Naomi,, +49 68130265011, naomi@wjpserver.cs.uni-sb.de Offergeld, Thilo,, +49 681 302-6595, t.offergeld@univw.uni-sb.de PC, CC 2006,,, cc2006pc@st.cs.uni-sb.de Paul, Wolfgang, +4968151825, +49 6813022556, wjp@cs.uni-sb.de Premraj, Rahul, +55 5596955511, +49 681 302-65015, premraj@cs.uni-sb.de Reindel, Erich, +49 6551 912852, +49 681 302-58091, reindel@cs.uni-sb.de Schuler, David,, +49 681 302-63026, schuler@st.cs.uni-sb.de Schuler, Erika,, +49 6813025069, schuler@tf.uni-sb.de Schäfer, Christa, +49 6895 51165, +49 68130265011, Security, AG,,, security@st.cs.uni-sb.de Seidel, Raimund, +49 6895 585698, +49 681 302-5515, rseidel@cs.uni-sb.de Sekretariat, Sekretariat,, +49 681 302-65011, office@st.cs.uni-sb.de Sliwerski, Jacek, +491551555208,, sliwers@st.cs.uni-sb.de Slusallek, Philipp, +49 6826 1 88 51 52, +49 681 302-5850, slusallek@cs.uni-sb.de Slusallek USA, Philipp, +1 650 591 9186, +1 508 586 2588, slusallek@cs.uni-sb.de Smolka, Gert, +49 681 582550, +49 681 302-5511, smolka@ps.uni-sb.de Software-Evolution, AG,,, softevo@st.cs.uni-sb.de Thiel, Frank,,, hausmeister@cs.uni-sb.de Weiß, Cathrin,,, weiss@st.cs.uni-sb.de Wilhelm, Reinhard,, +49 681 302-5599, wilhelm@cs.uni-sb.de Zeller, Andreas,,, zeller@cs.uni-sb.de Zeller, Andreas, +49 681 5510565, +49 681 302-65011, zeller@cs.uni-sb.de Zimmermann, Tom, +49 851 51552 (Eltern), +1 505 210 9550, zimmerth@cs.uni-sb.de
  • 24. Lenhof, Hans-Peter,, +49 681 302-64701, lenhof@cs.uni-sb.de Lindig, Christian, +49 681 9378406, +49 681 302 7790, lindig@cs.uni-sb.de Fehlerursache Mehlmann, Martin,,, mehlmann@st.cs.uni-sb.de Meyer zu Tittingdorf, Friederike, +49 6894 890037, +49 681 302-78099, meyer@cs.uni-sb.de Mileva, Yana,, +49 681 302-64020, mileva@cs.uni-sb.de Müller-Perich, Elisabeth,, +49 681 302-7070, sekr.techfak@rz.uni-sb.de Nir-Bleimling, Naomi,, +49 68130264011, naomi@wjpserver.cs.uni-sb.de Offergeld, Thilo,, +49 681 302-6794, t.offergeld@univw.uni-sb.de PC, CC 2006,,, cc2006pc@st.cs.uni-sb.de Paul, Wolfgang, +4968171827, +49 6813022436, wjp@cs.uni-sb.de Premraj, Rahul, +44 7796973711, +49 681 302-64013, premraj@cs.uni-sb.de Reindel, Erich, +49 6371 912842, +49 681 302-78091, reindel@cs.uni-sb.de Schuler, David,, +49 681 302-64026, schuler@st.cs.uni-sb.de Schuler, Erika,, +49 6813027069, schuler@tf.uni-sb.de Schäfer, Christa, +49 6895 51165, +49 68130265011, Security, AG,,, security@st.cs.uni-sb.de Seidel, Raimund, +49 6894 383698, +49 681 302-4713, rseidel@cs.uni-sb.de Sekretariat, Sekretariat,, +49 681 302-64011, office@st.cs.uni-sb.de Sliwerski, Jacek, +491741333208,, sliwers@st.cs.uni-sb.de Slusallek, Philipp, +49 6826 1 88 71 32, +49 681 302-3830, slusallek@cs.uni-sb.de Slusallek USA, Philipp, +1 670 391 9186, +1 408 486 2788, slusallek@cs.uni-sb.de Smolka, Gert, +49 681 782770, +49 681 302-7311, smolka@ps.uni-sb.de Software-Evolution, AG,,, softevo@st.cs.uni-sb.de Thiel, Frank,,, hausmeister@cs.uni-sb.de Weiß, Cathrin,,, weiss@st.cs.uni-sb.de Wilhelm, Reinhard,, +49 681 302-4399, wilhelm@cs.uni-sb.de Zeller, Andreas,,, zeller@cs.uni-sb.de Zeller, Andreas, +49 681 3710467, +49 681 302-64011, zeller@cs.uni-sb.de Zimmermann, Tom, +49 871 71742 (Eltern), +1 403 210 9470, zimmerth@cs.uni-sb.de
  • 26. Delta Debugging Delta Debugging isoliert automatisch Fehlerursachen: Eingaben: 1 von 436 Kontakten in Columba Änderungen: 1 von 8,721 Änderungen in GDB Threads: 1 von 3.8 bio Thread-Wechsel in Scene.java ➔ Automatisierte Fehlersuche
  • 28. Isolieren Relevanter Aufrufe Schritt 1: Aufzeichnen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  • 29. Isolieren Relevanter Aufrufe Schritt 2: Abspielen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  • 30. Isolieren Relevanter Aufrufe Schritt 3:Vereinfachen ↯ Vector() add() add() remove() v:Vector remove() remove() JINSI Event Log
  • 31. Isolieren Relevanter Aufrufe Schritt 4: Testfall erzeugen ↯ testVector() { Text Vector v = new Vector(); v.remove(obj); } JINSI
  • 32. Columba ContactModel ↯ ContactModel() setSortString() setFormattedName() setNickName() c: ContactModel setFamilyName() setGivenName() und 18732 weitere…
  • 33. Columba ContactModel ContactModel() getPreferredEmail() c: ContactModel ↯
  • 34. Unit Test testContactModel() { ContactModel c = new ContactModel(); String s = c.getPreferredEmail(); }
  • 35. getPreferredEmail public 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(); }
  • 36. Delta Debugging Delta Debugging isoliert automatisch Fehlerursachen: Eingaben: 1 von 436 Kontakten in Columba Änderungen: 1 von 8,721 Änderungen in GDB Threads: 1 von 3.8 bio Thread-Wechsel in Scene.java Aufrufe: 2 von 18738 Methodenaufrufen 99,8% Verringerung des ➔ Automatisierte Fehlersuche Suchraums
  • 37. #1 in Software Engineering Books Algorithms Books Software Design Books
  • 38. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 39. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 40. AspectJ Columba • Ungültige Benutzung von Iteratoren: vor next() sollte hasNext() kommen • hasNext() ist operationale Vorbedingung
  • 42. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ next Programm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 43. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ next Programm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 44. Methodenmodelle 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; }
  • 45. 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; }
  • 46. 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; }
  • 47. 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));
  • 48. 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));
  • 49. 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));
  • 50. 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));
  • 51. Benutzungsmodelle Stack s = new Stack (); s.push (-1); s.push (rand (r));
  • 52. Benutzungsmodelle s.<init>() s.push (_) s.push (_)
  • 53. 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));
  • 54. Benutzungsmodelle Random r = new Random (); int n = r.nextInt (); s.push (rand (r));
  • 55. Benutzungsmodelle r.<init> () r.nextInt () Utils.rand (r)
  • 56. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ next Programm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 57. OP-Miner Benutzungsmodelle Temporale Eigenschaften hasNext ≺ next Programm iter.hasNext () iter.next () hasNext ≺ hasNext next ≺ hasNext next ≺ next Anomalien Muster hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 58. Anomalien entdecken Temporale Eigenschaften start ≺ lock ≺ eof ≺ stop unlock close get() ✘ Methoden open() hello() parse()
  • 59. Ein Defekt for (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... sollte iter2 sein } }
  • 60. Noch ein Defekt public 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
  • 61. Ein Fehlalarm Name internalNewName (String[] identifiers) ... for (int i = 1; i < count; i++) { SimpleName name = new SimpleName(this); name.internalSetIdentifier(identifiers[i]); ... } sollte unverändert ... bleiben }
  • 62. Ein Code Smell public String getRetentionPolicy () { ... for (Iterator it = ...; it.hasNext();) { ... = it.next(); ... return retentionPolicy; } ... sollte repariert werden }
  • 63. AspectJ Defekte Code smells Fehlalarme 16 42 242
  • 64. 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ʟɪʙʀɪ) could mailModel = (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 defects 17: Another defect in Cʟʙ. Missing call to hasNext fect only a small number of OUMs and violations a
  • 65. OP-Miner OP-Miner lernt operationale Vorbedingungen – wie man Argumente gewöhnlich konstruiert Lernt aus gewöhnlicher Benutzung –  allgemein und projektspezifisch Vollautomatisch Dutzende bestätigter Fehler gefunden
  • 66. 201,321,237 200,000,000 8,000 6,097 150,000,000 6,000 100,000,000 4,000 50,000,000 2,000 0 0 Codezeilen C-Projekte
  • 67.
  • 68.
  • 69. 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 }
  • 70.
  • 71. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 72. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 73.
  • 74. Problem: Wie können wir aus unseren Fehlern lernen?
  • 75. Fehler Versionen
  • 76. Fehler auf Code abbilden Fehler Versionen
  • 79. Sind es die Entwickler? Macht Je mehr Erfahrung einen Erfahrung, desto Unterschied? mehr Fehler!
  • 80. Oder die Geschichte? Wir haben hier Dann sind dort viele Fehler noch mehr! gefunden…
  • 81. Wie steht es mit Metriken? Korrelieren Metriken mit Fehlerdichte? Manchmal!
  • 82. Programmiersprache? Sind gotos Keine Korrelation! schädlich?
  • 83. Ok. Problembereich? Welche Tokens import • extends sind relevant? • implements
  • 84. ✘ ✘ ✘ ✘ ✘ ✘ ✘ nsIPrivateDOMEvent.h ✘ ✘ ✘ ✘ ✘ ✘ ✘ nsReadableUtils.h ✘ ✘ ✘ ✘
  • 85. 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
  • 86. Wissen, wo die Fehler sind • Kalibrieren der Fehlervorhersage • Wissen, wo die nächsten Fehler sind • Vollautomatisch!
  • 87. Software-Archive • enthalten komplette Projektgeschichte • gepflegt durch Programmierumgebungen • automatischer Zugang • frei verfügbar durch Open-Source Projekte Fehler Versionen
  • 88. Modelle Specs Code Traces Profile Tests e-mail Fehler Aufwand Navigation Versionen Chats
  • 89. Modelle Specs Code Traces Profile Tests e-mail Fehler Aufwand Navigation Versionen Chats
  • 91.
  • 92.
  • 93. Studien Make this Actionable! Rosenberg, L. and Hyatt, L. “Developing An Effective Metrics Program” European Space Agency Software Assurance Symposium, Netherlands, March, 1996
  • 94.
  • 95.
  • 96.
  • 97.
  • 98. Diagnose Erkennen Vorbeugen Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes
  • 99. Diagnose Erkennen Vorbeugen ZELLER WHY PROGRAMS FAIL WHY PROGRAMS FAIL A Guide to Systematic Debugging ANDREAS ZELLER Woher kommen Software-Fehler? • Andreas Zeller, Universität des Saarlandes