SlideShare una empresa de Scribd logo
1 de 159
Learning from
6,000 Projects
Mining Models in the Large


       Andreas Zeller
     Saarland University
Learning from 6,000 projects   mining specifications in the large
Learning from 6,000 projects   mining specifications in the large
Learning from 6,000 projects   mining specifications in the large
Saarbrücken
Saarbrücken
Saarbrücken
Saarbrücken
Saarbrücken
Saarbrücken
Saarbrücken




®
    Visual
    Computing
    Institute
Saarbrücken
Some numbers
Some numbers
•   ~70 PhD advisors in computer science
Some numbers
•   ~70 PhD advisors in computer science
•   ≥ 300 PhD students in computer science
Some numbers
•   ~70 PhD advisors in computer science
•   ≥ 300 PhD students in computer science
•   ~60 new PhD graduates per year
Some numbers
•   ~70 PhD advisors in computer science
•   ≥ 300 PhD students in computer science
•   ~60 new PhD graduates per year
•   ~60 new MSc graduates per year
Some numbers
•   ~70 PhD advisors in computer science
•   ≥ 300 PhD students in computer science
•   ~60 new PhD graduates per year
•   ~60 new MSc graduates per year
•   800–1400 € per month as a PhD stipend
    (+ laptop & office • starting right after BSc • all courses in English)
Two Graduates




Michael Backes   Andrej Rybalchenko
 TR35 in 2009       TR35 in 2010
Michael Backes   Andrej Rybalchenko
secure protocols   Andrej Rybalchenko
secure protocols   loop termination
secure protocols        loop termination

             hard to verify
secure protocols          loop termination




              hard to verify
information ow

secure protocols          loop termination




              hard to verify
information ow                 liveness

secure protocols          loop termination




              hard to verify
buffer over ow

information ow                 liveness

secure protocols          loop termination




              hard to verify
buffer over ow              resource leaks

information ow                 liveness

secure protocols          loop termination




              hard to verify
buffer over ow              resource leaks

information ow                 liveness

secure protocols         loop termination




             easy to specify
             hard to verify
hard to specify
sorting




hard to specify
∀i ∈ {0, . . . , |x |} : x [i] < x [i + 1]
            |x| = |x |
 ∀i ∈ {0, . . . , |x|} : ιi ∈ {0, . . . , |x |} : x[i] = x [i ]
∀i ∈ {0, . . . , |x |} : ιi ∈ {0, . . . , |x|} : x [i ] = x[i]




                      hard to specify
∀i ∈ {0, . . . , |x |} : x [i] < x [i + 1]
            |x| = |x |
 ∀i ∈ {0, . . . , |x|} : ιi ∈ {0, . . . , |x |} : x[i] = x [i ]
∀i ∈ {0, . . . , |x |} : ιi ∈ {0, . . . , |x|} : x [i ] = x[i]



                      easy to verify
                      hard to specify
is-sorted(x ) ∧ is-permutation(x, x )




           still hard to specify
Learning from 6,000 projects   mining specifications in the large
microsoft word
microsoft word

travel booking
microsoft word

travel booking

airplane control
microsoft word     mobile phones

travel booking

airplane control
microsoft word      mobile phones

travel booking     operating systems

airplane control
microsoft word      mobile phones

travel booking     operating systems

airplane control   banking systems
microsoft word              mobile phones

travel booking            operating systems

airplane control           banking systems




               hard to specify
microsoft word              mobile phones

travel booking            operating systems

airplane control           banking systems




                easy to verify
               hard to specify
hard to specify
hard to specify




new language • duplicate effort • can’t abstract from details
speci cation crisis
mine speci cations
mine speci cations
mine speci cations
from 6,000 projects
Speci cations

∀i ∈ {0, . . . , |x |} : x [i] < x [i + 1]
            |x| = |x |
 ∀i ∈ {0, . . . , |x|} : ιi ∈ {0, . . . , |x |} : x[i] = x [i ]
∀i ∈ {0, . . . , |x |} : ιi ∈ {0, . . . , |x|} : x [i ] = x[i]



              pre- and postconditions
Speci cations
               auth()!
<init>()
                                   openPort()
               socket: null                       socket: ¬null
           state: NOT_CON                         state: PLAIN


            quit()                              auth()
                              socket: ¬null
                              state: AUTH




                     nite state models
OP-Miner
OP-Miner

Program
OP-Miner
                 Usage Models



Program   iter.hasNext ()   iter.next ()
OP-Miner
                 Usage Models              Temporal Properties

                                           hasNext ≺ next
Program                                    hasNext ≺ hasNext
          iter.hasNext ()   iter.next ()   next ≺ hasNext
                                           next ≺ next
OP-Miner
                 Usage Models                      Temporal Properties

                                                    hasNext ≺ next
Program                                             hasNext ≺ hasNext
          iter.hasNext ()   iter.next ()            next ≺ hasNext
                                                    next ≺ next




                                               Patterns


                                           hasNext ≺ next
                                           hasNext ≺ hasNext
OP-Miner
                       Usage Models                      Temporal Properties

                                                          hasNext ≺ next
Program                                                   hasNext ≺ hasNext
               iter.hasNext ()    iter.next ()            next ≺ hasNext
                                                          next ≺ next




                Anomalies                            Patterns

              hasNext ≺ next
          ✓   hasNext ≺ hasNext                  hasNext ≺ next
              hasNext ≺ next                     hasNext ≺ hasNext
          ✗   hasNext ≺ hasNext
OP-Miner
                       Usage Models                      Temporal Properties

                                                          hasNext ≺ next
Program                                                   hasNext ≺ hasNext
               iter.hasNext ()    iter.next ()            next ≺ hasNext
                                                          next ≺ next




                Anomalies                            Patterns

              hasNext ≺ next
          ✓   hasNext ≺ hasNext                  hasNext ≺ next
              hasNext ≺ next                     hasNext ≺ hasNext
          ✗   hasNext ≺ hasNext
Learning from 6,000 projects   mining specifications in the large
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;
}
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;
}
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;
}
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;
}
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));
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));
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));
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));
Stack s = new Stack ();




s.push (-1);   s.push (rand (r));
s.<init>()

  s.push (_)

s.push (_)
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));
Random r = new Random ();


int n = r.nextInt ();




s.push (rand (r));
r.<init> ()



r.nextInt ()

  Utils.rand (r)
OP-Miner
                       Usage Models                      Temporal Properties

                                                          hasNext ≺ next
Program                                                   hasNext ≺ hasNext
               iter.hasNext ()    iter.next ()            next ≺ hasNext
                                                          next ≺ next




                Anomalies                            Patterns

              hasNext ≺ next
          ✓   hasNext ≺ hasNext                  hasNext ≺ next
              hasNext ≺ next                     hasNext ≺ hasNext
          ✗   hasNext ≺ hasNext
OP-Miner
                       Usage Models                      Temporal Properties

                                                          hasNext ≺ next
Program                                                   hasNext ≺ hasNext
               iter.hasNext ()    iter.next ()            next ≺ hasNext
                                                          next ≺ next




                Anomalies                            Patterns

              hasNext ≺ next
          ✓   hasNext ≺ hasNext                  hasNext ≺ next
              hasNext ≺ next                     hasNext ≺ hasNext
          ✗   hasNext ≺ hasNext
Methods vs. Properties
               Temporal Properties
          start ≺    lock ≺      eof ≺
           stop      unlock      close
Methods
Methods vs. Properties
                       Temporal Properties
                  start ≺    lock ≺      eof ≺
                   stop      unlock      close


          get()
Methods
Methods vs. Properties
                        Temporal Properties
                   start ≺    lock ≺      eof ≺
                    stop      unlock      close


          get()
Methods




          open()
Methods vs. Properties
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close


           get()
Methods




          open()


          hello()
Methods vs. Properties
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close


           get()
Methods




          open()


          hello()


          parse()
Methods vs. Properties
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close


           get()
Methods




          open()


          hello()


          parse()
Methods vs. Properties
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close


           get()
Methods




          open()


          hello()


          parse()
Methods vs. Properties
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close
                                                   Pattern
           get()
Methods




          open()


          hello()


          parse()
Methods vs. Properties
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close
                                                         Pattern
           get()
Methods




          open()


          hello()


          parse()
                                               Support
Discovering Anomalies
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close


           get()
Methods




          open()


          hello()


          parse()
Discovering Anomalies
                         Temporal Properties
                    start ≺    lock ≺      eof ≺
                     stop      unlock      close
                                                   Anomaly
           get()                 ✘
Methods




          open()


          hello()


          parse()
AspectJ
for (Iterator iter = itdFields.iterator();
    iter.hasNext();) {
   ...
   for (Iterator iter2 = worthRetrying.iterator();
        iter.hasNext();) {
       ...
   }
}
for (Iterator iter = itdFields.iterator();
    iter.hasNext();) {
   ...
   for (Iterator iter2 = worthRetrying.iterator();
        iter.hasNext();) {
       ...       should be iter2
   }
}
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+' (...)");

 }
}
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+' (...)");

 }
}                                     should be double quotes
Name internalNewName (String[] identifiers)
  ...

 for (int i = 1; i < count; i++) {

     SimpleName name = new SimpleName(this);

     name.internalSetIdentifier(identifiers[i]);

     ...

 }
  ...
}
Name internalNewName (String[] identifiers)
  ...

 for (int i = 1; i < count; i++) {

     SimpleName name = new SimpleName(this);

     name.internalSetIdentifier(identifiers[i]);

     ...

 }                                      should stay as is
  ...
}
public String getRetentionPolicy ()
{
  ...
  for (Iterator it = ...; it.hasNext();)
  {
      ... = it.next();
      ...
      return retentionPolicy;
  }
  ...
}
public String getRetentionPolicy ()
{
  ...
  for (Iterator it = ...; it.hasNext();)
  {
      ... = it.next();
      ...
      return retentionPolicy;
  }
  ...                                 should be   xed
}
Learning from 6,000 projects   mining specifications in the large
44% of violations
are defects or code smells
mine speci cations
mine speci cations
across thousands of projects
Wisdom of the crowds




                Francis
                Galton
                Nein, links auch nicht
Wisdom of the crowds




                Francis
                Galton
                Nein, links auch nicht
Learning from 6,000 projects   mining specifications in the large
lightweight parsing
Target Languages
Java     C++   C   PHP   Javascript
Target Languages
  Java       C++   C       PHP   Javascript


Similar syntax
           {...}       ;         foo()
Target Languages
  Java        C++        C        PHP    Javascript


Similar syntax
           {...}             ;           foo()


Similar keywords
      while         if       switch     return
Lightweight Parser

                 Abstract      Temporal
Source Code
              Representation   Properties
Lightweight Parser

                     Abstract      Temporal
Source Code
                  Representation   Properties
       }
       language-independent
         lightweight parsing
Abstract      Temporal
Source Code
              Representation   Properties
Abstract      Temporal
         Source Code
                       Representation   Properties



int j;
int fA;
int fB = open(“newFile”);
fA = open(“myFile”);
j = 7;
while (j > 3) {
   read(fA);
   write(fB, “Hello”);
   j--;
}

close(fA);
close(fB);
Abstract          Temporal
         Source Code
                       Representation       Properties



int j;                                    fB: open(CONST)
int fA;
int fB = open(“newFile”);
                                         fA: open(CONST)
fA = open(“myFile”);
j = 7;
while (j > 3) {                         Loop:
   read(fA);                                  read(fA)
   write(fB, “Hello”);                   write(fB, CONST)
   j--;
}
                                                close(fA)
close(fA);
close(fB);                                      close(fB)
Abstract      Temporal
            Source Code
                          Representation   Properties



  fB: open(CONST)

 fA: open(CONST)

Loop:
      read(fA)
 write(fB, CONST)

        close(fA)

        close(fB)
Abstract        Temporal
            Source Code
                          Representation     Properties


                           fA: open(CONST)
  fB: open(CONST)
                               read(fA)
 fA: open(CONST)
                              close(fA)


Loop:
      read(fA)
 write(fB, CONST)

        close(fA)

        close(fB)
Abstract         Temporal
            Source Code
                          Representation      Properties


                           fA: open(CONST)
  fB: open(CONST)
                               read(fA)
 fA: open(CONST)
                               close(fA)


Loop:
      read(fA)
 write(fB, CONST)

                           fB: open(CONST)
        close(fA)
                           write(fB, CONST)

        close(fB)              close(fB)
Abstract         Temporal
            Source Code
                          Representation      Properties


                           fA: open(CONST)
  fB: open(CONST)                                open() < read()
                               read(fA)
 fA: open(CONST)
                               close(fA)


Loop:
      read(fA)
 write(fB, CONST)

                           fB: open(CONST)
        close(fA)
                           write(fB, CONST)

        close(fB)              close(fB)
Abstract         Temporal
            Source Code
                          Representation      Properties


                           fA: open(CONST)
  fB: open(CONST)                                open() < read()
                                                 open() < close()
                               read(fA)
 fA: open(CONST)
                               close(fA)


Loop:
      read(fA)
 write(fB, CONST)

                           fB: open(CONST)
        close(fA)
                           write(fB, CONST)

        close(fB)              close(fB)
Abstract         Temporal
            Source Code
                          Representation      Properties


                           fA: open(CONST)
  fB: open(CONST)                                open() < read()
                                                 open() < close()
                               read(fA)
                                                 read() < read()
 fA: open(CONST)
                               close(fA)


Loop:
      read(fA)
 write(fB, CONST)

                           fB: open(CONST)
        close(fA)
                           write(fB, CONST)

        close(fB)              close(fB)
Abstract         Temporal
            Source Code
                          Representation      Properties


                           fA: open(CONST)
  fB: open(CONST)                                open() < read()
                                                 open() < close()
                               read(fA)
                                                 read() < read()
 fA: open(CONST)
                               close(fA)         read() < close()

Loop:
      read(fA)
 write(fB, CONST)

                           fB: open(CONST)
        close(fA)
                           write(fB, CONST)

        close(fB)              close(fB)
Abstract         Temporal
            Source Code
                          Representation      Properties


                           fA: open(CONST)
  fB: open(CONST)                                open() < read()
                                                 open() < close()
                               read(fA)
                                                 read() < read()
 fA: open(CONST)
                               close(fA)         read() < close()

Loop:
      read(fA)
 write(fB, CONST)

                           fB: open(CONST)       open() < write()
        close(fA)                                open() < close()
                           write(fB, CONST)      write() < write()
        close(fB)              close(fB)
                                                 write() < close()
Learning from 6,000 projects   mining specifications in the large
thousands of projects
Learning from 6,000 projects   mining specifications in the large
8,000


6,000


4,000


2,000


   0
        C projects
8,000

          6,097
6,000


4,000


2,000


   0
        C projects
200,000,000                   8,000

                                        6,097
150,000,000                   6,000


100,000,000                   4,000


 50,000,000                   2,000


         0                       0
              Lines of code           C projects
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
              Lines of code           C projects
6,097 C projects
201,321,237 lines of code
5,985,193 functions
15,803,766 properties (“f < g”)
6 GB database
18 hours analysis time
       single core
11 million lines of code per hour
11 seconds per project
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, …);
}
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, …);           should be called before bind()
}
static int find_file (…)
{
    DIR *dirp;
    struct dirent *dirinfo;
    …
    dirp = opendir(".");
    if (dirp == NULL)
    {
        …
    }
    while ((dirinfo = readdir(dirp)) != NULL)
    {
        …
    }
    rewinddir(dirp);
    return 1;
}
static int find_file (…)
{
    DIR *dirp;
    struct dirent *dirinfo;
    …
    dirp = opendir(".");
    if (dirp == NULL)
    {
        …
    }
    while ((dirinfo = readdir(dirp)) != NULL)
    {
        …
    }
    rewinddir(dirp);
    return 1;    should call closedir() instead
}
Learning from 6,000 projects   mining specifications in the large
Platform
Learning from 6,000 projects   mining specifications in the large
Learning from 6,000 projects   mining specifications in the large
Check my Code

•   Check your code against
    the wisdom of Linux

•   Builds on millions of
    mined speci cations

•   Detects problems no
    other tool can detect


             www.checkmycode.org
Check my Code

•   Check your code against
    the wisdom of Linux
                              Dat  abase
•   Builds on millions of
                                    ilable
    mined speci cations        ava
                              fo r dow nload
•   Detects problems no
    other tool can detect


             www.checkmycode.org
speci cation crisis
speci cation crisis
microsoft word      mobile phones

travel booking     operating systems

airplane control   banking systems
microsoft word                mobile phones

travel booking               operating systems

airplane control             banking systems




                   easy to mine
Challenges
Challenges

•   Mining complete speci cations
Challenges

•   Mining complete speci cations
•   Finding relevant abstractions
Challenges

•   Mining complete speci cations
•   Finding relevant abstractions
•   Producing readable speci cations
Challenges

•   Mining complete speci cations
•   Finding relevant abstractions
•   Producing readable speci cations
•   Integrating speci cation mining
    and programming
Andrzej Wasylkowski   Christian Lindig   Natalie Gruska
Summary
Summary
Summary
Summary
Summary
Summary

Más contenido relacionado

La actualidad más candente

The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)jeffz
 
Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Leonardo Borges
 
The Vanishing Pattern: from iterators to generators in Python
The Vanishing Pattern: from iterators to generators in PythonThe Vanishing Pattern: from iterators to generators in Python
The Vanishing Pattern: from iterators to generators in PythonOSCON Byrum
 
openFrameworks 007 - utils
openFrameworks 007 - utilsopenFrameworks 007 - utils
openFrameworks 007 - utilsroxlu
 
New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)Matthew Turland
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Leonardo Borges
 
미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정SeungChul Kang
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NETFuture Processing
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Sergey Platonov
 
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)François Sarradin
 
Introduction to modern c++ principles(part 1)
Introduction to modern c++ principles(part 1)Introduction to modern c++ principles(part 1)
Introduction to modern c++ principles(part 1)Oky Firmansyah
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015NAVER / MusicPlatform
 
(3) cpp abstractions more_on_user_defined_types
(3) cpp abstractions more_on_user_defined_types(3) cpp abstractions more_on_user_defined_types
(3) cpp abstractions more_on_user_defined_typesNico Ludwig
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013aleks-f
 
Toonz code leaves much to be desired
Toonz code leaves much to be desiredToonz code leaves much to be desired
Toonz code leaves much to be desiredPVS-Studio
 
Coscup2021-rust-toturial
Coscup2021-rust-toturialCoscup2021-rust-toturial
Coscup2021-rust-toturialWayne Tsai
 

La actualidad más candente (20)

The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)The Evolution of Async-Programming on .NET Platform (.Net China, C#)
The Evolution of Async-Programming on .NET Platform (.Net China, C#)
 
Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015
 
The Vanishing Pattern: from iterators to generators in Python
The Vanishing Pattern: from iterators to generators in PythonThe Vanishing Pattern: from iterators to generators in Python
The Vanishing Pattern: from iterators to generators in Python
 
openFrameworks 007 - utils
openFrameworks 007 - utilsopenFrameworks 007 - utils
openFrameworks 007 - utils
 
Coding in Style
Coding in StyleCoding in Style
Coding in Style
 
New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)New SPL Features in PHP 5.3 (TEK-X)
New SPL Features in PHP 5.3 (TEK-X)
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012
 
미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정
 
YUI Tidbits
YUI TidbitsYUI Tidbits
YUI Tidbits
 
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
[JuraSIC! Meetup] Mateusz Stasch - Monady w .NET
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
 
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
 
Eta
EtaEta
Eta
 
1.2 scala basics
1.2 scala basics1.2 scala basics
1.2 scala basics
 
Introduction to modern c++ principles(part 1)
Introduction to modern c++ principles(part 1)Introduction to modern c++ principles(part 1)
Introduction to modern c++ principles(part 1)
 
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
서버 개발자가 바라 본 Functional Reactive Programming with RxJava - SpringCamp2015
 
(3) cpp abstractions more_on_user_defined_types
(3) cpp abstractions more_on_user_defined_types(3) cpp abstractions more_on_user_defined_types
(3) cpp abstractions more_on_user_defined_types
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
 
Toonz code leaves much to be desired
Toonz code leaves much to be desiredToonz code leaves much to be desired
Toonz code leaves much to be desired
 
Coscup2021-rust-toturial
Coscup2021-rust-toturialCoscup2021-rust-toturial
Coscup2021-rust-toturial
 

Destacado (8)

Do Bugs Reside in Complex Code?
Do Bugs Reside in Complex Code?Do Bugs Reside in Complex Code?
Do Bugs Reside in Complex Code?
 
Effective debugging
Effective debuggingEffective debugging
Effective debugging
 
Notes on Debugging
Notes on DebuggingNotes on Debugging
Notes on Debugging
 
Debugging
DebuggingDebugging
Debugging
 
Debugging Debugging
Debugging DebuggingDebugging Debugging
Debugging Debugging
 
The Art Of Debugging
The Art Of DebuggingThe Art Of Debugging
The Art Of Debugging
 
Debugging
DebuggingDebugging
Debugging
 
Advanced Production Debugging
Advanced Production DebuggingAdvanced Production Debugging
Advanced Production Debugging
 

Similar a Learning from 6,000 projects mining specifications in the large

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for AndroidTomáš Kypta
 
Programming Android Application in Scala.
Programming Android Application in Scala.Programming Android Application in Scala.
Programming Android Application in Scala.Brian Hsu
 
Simple APIs and innovative documentation
Simple APIs and innovative documentationSimple APIs and innovative documentation
Simple APIs and innovative documentationPyDataParis
 
Locks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael BarkerLocks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael BarkerJAX London
 
Lagergren jvmls-2013-final
Lagergren jvmls-2013-finalLagergren jvmls-2013-final
Lagergren jvmls-2013-finalMarcus Lagergren
 
Real Time Big Data Management
Real Time Big Data ManagementReal Time Big Data Management
Real Time Big Data ManagementAlbert Bifet
 
Lisp Macros in 20 Minutes (Featuring Clojure)
Lisp Macros in 20 Minutes (Featuring Clojure)Lisp Macros in 20 Minutes (Featuring Clojure)
Lisp Macros in 20 Minutes (Featuring Clojure)Phil Calçado
 
Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem
Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłemTomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem
Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłemSegFaultConf
 
Python在豆瓣的应用
Python在豆瓣的应用Python在豆瓣的应用
Python在豆瓣的应用Qiangning Hong
 
Clojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMClojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMsunng87
 
The Swift Compiler and Standard Library
The Swift Compiler and Standard LibraryThe Swift Compiler and Standard Library
The Swift Compiler and Standard LibrarySantosh Rajan
 
NTU ML TENSORFLOW
NTU ML TENSORFLOWNTU ML TENSORFLOW
NTU ML TENSORFLOWMark Chang
 
Virtual Machines
Virtual MachinesVirtual Machines
Virtual MachinesJoa Ebert
 
Yin Yangs of Software Development
Yin Yangs of Software DevelopmentYin Yangs of Software Development
Yin Yangs of Software DevelopmentNaveenkumar Muguda
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemSages
 
JavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for DummiesJavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for DummiesCharles Nutter
 

Similar a Learning from 6,000 projects mining specifications in the large (20)

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
Programming Android Application in Scala.
Programming Android Application in Scala.Programming Android Application in Scala.
Programming Android Application in Scala.
 
Simple APIs and innovative documentation
Simple APIs and innovative documentationSimple APIs and innovative documentation
Simple APIs and innovative documentation
 
Locks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael BarkerLocks? We Don't Need No Stinkin' Locks - Michael Barker
Locks? We Don't Need No Stinkin' Locks - Michael Barker
 
Lagergren jvmls-2013-final
Lagergren jvmls-2013-finalLagergren jvmls-2013-final
Lagergren jvmls-2013-final
 
Real Time Big Data Management
Real Time Big Data ManagementReal Time Big Data Management
Real Time Big Data Management
 
Lisp Macros in 20 Minutes (Featuring Clojure)
Lisp Macros in 20 Minutes (Featuring Clojure)Lisp Macros in 20 Minutes (Featuring Clojure)
Lisp Macros in 20 Minutes (Featuring Clojure)
 
Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem
Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłemTomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem
Tomasz Nurkiewicz - Programowanie reaktywne: czego się nauczyłem
 
N flavors of streaming
N flavors of streamingN flavors of streaming
N flavors of streaming
 
Reactive x
Reactive xReactive x
Reactive x
 
Python在豆瓣的应用
Python在豆瓣的应用Python在豆瓣的应用
Python在豆瓣的应用
 
Clojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVMClojure: Practical functional approach on JVM
Clojure: Practical functional approach on JVM
 
Java Language fundamental
Java Language fundamentalJava Language fundamental
Java Language fundamental
 
The Swift Compiler and Standard Library
The Swift Compiler and Standard LibraryThe Swift Compiler and Standard Library
The Swift Compiler and Standard Library
 
Ns2 by khan
Ns2 by khan Ns2 by khan
Ns2 by khan
 
NTU ML TENSORFLOW
NTU ML TENSORFLOWNTU ML TENSORFLOW
NTU ML TENSORFLOW
 
Virtual Machines
Virtual MachinesVirtual Machines
Virtual Machines
 
Yin Yangs of Software Development
Yin Yangs of Software DevelopmentYin Yangs of Software Development
Yin Yangs of Software Development
 
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data EcosystemWprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
Wprowadzenie do technologii Big Data / Intro to Big Data Ecosystem
 
JavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for DummiesJavaOne 2012 - JVM JIT for Dummies
JavaOne 2012 - JVM JIT for Dummies
 

Más de CISPA Helmholtz Center for Information Security

Más de CISPA Helmholtz Center for Information Security (17)

Language-Based Testing and Debugging.pdf
Language-Based Testing and Debugging.pdfLanguage-Based Testing and Debugging.pdf
Language-Based Testing and Debugging.pdf
 
Digital Networking and Community
Digital Networking and CommunityDigital Networking and Community
Digital Networking and Community
 
Fuzzing - A Tale of Two Cultures
Fuzzing - A Tale of Two CulturesFuzzing - A Tale of Two Cultures
Fuzzing - A Tale of Two Cultures
 
Illustrated Code (ASE 2021)
Illustrated Code (ASE 2021)Illustrated Code (ASE 2021)
Illustrated Code (ASE 2021)
 
On Impact in Software Engineering Research (HU Berlin 2021)
On Impact in Software Engineering Research (HU Berlin 2021)On Impact in Software Engineering Research (HU Berlin 2021)
On Impact in Software Engineering Research (HU Berlin 2021)
 
On Impact in Software Engineering Research (Dagstuhl 2020)
On Impact in Software Engineering Research (Dagstuhl 2020)On Impact in Software Engineering Research (Dagstuhl 2020)
On Impact in Software Engineering Research (Dagstuhl 2020)
 
Fast and Effective Fuzz Testing (Facebook TAV 2019)
Fast and Effective Fuzz Testing (Facebook TAV 2019)Fast and Effective Fuzz Testing (Facebook TAV 2019)
Fast and Effective Fuzz Testing (Facebook TAV 2019)
 
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
 
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)
 
Woher kommen Software-Fehler?
Woher kommen Software-Fehler?Woher kommen Software-Fehler?
Woher kommen Software-Fehler?
 

Último

Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding TeamAdam Moalla
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesDavid Newbury
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfJamie (Taka) Wang
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfDaniel Santiago Silva Capera
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7DianaGray10
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1DianaGray10
 

Último (20)

Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
20150722 - AGV
20150722 - AGV20150722 - AGV
20150722 - AGV
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
activity_diagram_combine_v4_20190827.pdfactivity_diagram_combine_v4_20190827.pdf
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7UiPath Studio Web workshop series - Day 7
UiPath Studio Web workshop series - Day 7
 
Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1Secure your environment with UiPath and CyberArk technologies - Session 1
Secure your environment with UiPath and CyberArk technologies - Session 1
 

Learning from 6,000 projects mining specifications in the large

  • 1. Learning from 6,000 Projects Mining Models in the Large Andreas Zeller Saarland University
  • 11. Saarbrücken ® Visual Computing Institute
  • 14. Some numbers • ~70 PhD advisors in computer science
  • 15. Some numbers • ~70 PhD advisors in computer science • ≥ 300 PhD students in computer science
  • 16. Some numbers • ~70 PhD advisors in computer science • ≥ 300 PhD students in computer science • ~60 new PhD graduates per year
  • 17. Some numbers • ~70 PhD advisors in computer science • ≥ 300 PhD students in computer science • ~60 new PhD graduates per year • ~60 new MSc graduates per year
  • 18. Some numbers • ~70 PhD advisors in computer science • ≥ 300 PhD students in computer science • ~60 new PhD graduates per year • ~60 new MSc graduates per year • 800–1400 € per month as a PhD stipend (+ laptop & office • starting right after BSc • all courses in English)
  • 19. Two Graduates Michael Backes Andrej Rybalchenko TR35 in 2009 TR35 in 2010
  • 20. Michael Backes Andrej Rybalchenko
  • 21. secure protocols Andrej Rybalchenko
  • 22. secure protocols loop termination
  • 23. secure protocols loop termination hard to verify
  • 24. secure protocols loop termination hard to verify
  • 25. information ow secure protocols loop termination hard to verify
  • 26. information ow liveness secure protocols loop termination hard to verify
  • 27. buffer over ow information ow liveness secure protocols loop termination hard to verify
  • 28. buffer over ow resource leaks information ow liveness secure protocols loop termination hard to verify
  • 29. buffer over ow resource leaks information ow liveness secure protocols loop termination easy to specify hard to verify
  • 32. ∀i ∈ {0, . . . , |x |} : x [i] < x [i + 1] |x| = |x | ∀i ∈ {0, . . . , |x|} : ιi ∈ {0, . . . , |x |} : x[i] = x [i ] ∀i ∈ {0, . . . , |x |} : ιi ∈ {0, . . . , |x|} : x [i ] = x[i] hard to specify
  • 33. ∀i ∈ {0, . . . , |x |} : x [i] < x [i + 1] |x| = |x | ∀i ∈ {0, . . . , |x|} : ιi ∈ {0, . . . , |x |} : x[i] = x [i ] ∀i ∈ {0, . . . , |x |} : ιi ∈ {0, . . . , |x|} : x [i ] = x[i] easy to verify hard to specify
  • 34. is-sorted(x ) ∧ is-permutation(x, x ) still hard to specify
  • 39. microsoft word mobile phones travel booking airplane control
  • 40. microsoft word mobile phones travel booking operating systems airplane control
  • 41. microsoft word mobile phones travel booking operating systems airplane control banking systems
  • 42. microsoft word mobile phones travel booking operating systems airplane control banking systems hard to specify
  • 43. microsoft word mobile phones travel booking operating systems airplane control banking systems easy to verify hard to specify
  • 45. hard to specify new language • duplicate effort • can’t abstract from details
  • 49. mine speci cations from 6,000 projects
  • 50. Speci cations ∀i ∈ {0, . . . , |x |} : x [i] < x [i + 1] |x| = |x | ∀i ∈ {0, . . . , |x|} : ιi ∈ {0, . . . , |x |} : x[i] = x [i ] ∀i ∈ {0, . . . , |x |} : ιi ∈ {0, . . . , |x|} : x [i ] = x[i] pre- and postconditions
  • 51. Speci cations auth()! <init>() openPort() socket: null socket: ¬null state: NOT_CON state: PLAIN quit() auth() socket: ¬null state: AUTH nite state models
  • 54. OP-Miner Usage Models Program iter.hasNext () iter.next ()
  • 55. OP-Miner Usage Models Temporal Properties hasNext ≺ next Program hasNext ≺ hasNext iter.hasNext () iter.next () next ≺ hasNext next ≺ next
  • 56. OP-Miner Usage Models Temporal Properties hasNext ≺ next Program hasNext ≺ hasNext iter.hasNext () iter.next () next ≺ hasNext next ≺ next Patterns hasNext ≺ next hasNext ≺ hasNext
  • 57. OP-Miner Usage Models Temporal Properties hasNext ≺ next Program hasNext ≺ hasNext iter.hasNext () iter.next () next ≺ hasNext next ≺ next Anomalies Patterns hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 58. OP-Miner Usage Models Temporal Properties hasNext ≺ next Program hasNext ≺ hasNext iter.hasNext () iter.next () next ≺ hasNext next ≺ next Anomalies Patterns hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 60. 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; }
  • 61. 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; }
  • 62. 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; }
  • 63. 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; }
  • 64. 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));
  • 65. 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));
  • 66. 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));
  • 67. 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));
  • 68. Stack s = new Stack (); s.push (-1); s.push (rand (r));
  • 69. s.<init>() s.push (_) s.push (_)
  • 70. 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));
  • 71. Random r = new Random (); int n = r.nextInt (); s.push (rand (r));
  • 72. r.<init> () r.nextInt () Utils.rand (r)
  • 73. OP-Miner Usage Models Temporal Properties hasNext ≺ next Program hasNext ≺ hasNext iter.hasNext () iter.next () next ≺ hasNext next ≺ next Anomalies Patterns hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 74. OP-Miner Usage Models Temporal Properties hasNext ≺ next Program hasNext ≺ hasNext iter.hasNext () iter.next () next ≺ hasNext next ≺ next Anomalies Patterns hasNext ≺ next ✓ hasNext ≺ hasNext hasNext ≺ next hasNext ≺ next hasNext ≺ hasNext ✗ hasNext ≺ hasNext
  • 75. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close Methods
  • 76. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods
  • 77. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods open()
  • 78. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods open() hello()
  • 79. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods open() hello() parse()
  • 80. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods open() hello() parse()
  • 81. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods open() hello() parse()
  • 82. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close Pattern get() Methods open() hello() parse()
  • 83. Methods vs. Properties Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close Pattern get() Methods open() hello() parse() Support
  • 84. Discovering Anomalies Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close get() Methods open() hello() parse()
  • 85. Discovering Anomalies Temporal Properties start ≺ lock ≺ eof ≺ stop unlock close Anomaly get() ✘ Methods open() hello() parse()
  • 87. for (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... } }
  • 88. for (Iterator iter = itdFields.iterator(); iter.hasNext();) { ... for (Iterator iter2 = worthRetrying.iterator(); iter.hasNext();) { ... should be iter2 } }
  • 89. 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+' (...)"); } }
  • 90. 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+' (...)"); } } should be double quotes
  • 91. Name internalNewName (String[] identifiers) ... for (int i = 1; i < count; i++) { SimpleName name = new SimpleName(this); name.internalSetIdentifier(identifiers[i]); ... } ... }
  • 92. Name internalNewName (String[] identifiers) ... for (int i = 1; i < count; i++) { SimpleName name = new SimpleName(this); name.internalSetIdentifier(identifiers[i]); ... } should stay as is ... }
  • 93. public String getRetentionPolicy () { ... for (Iterator it = ...; it.hasNext();) { ... = it.next(); ... return retentionPolicy; } ... }
  • 94. public String getRetentionPolicy () { ... for (Iterator it = ...; it.hasNext();) { ... = it.next(); ... return retentionPolicy; } ... should be xed }
  • 96. 44% of violations are defects or code smells
  • 98. mine speci cations across thousands of projects
  • 99. Wisdom of the crowds Francis Galton Nein, links auch nicht
  • 100. Wisdom of the crowds Francis Galton Nein, links auch nicht
  • 103. Target Languages Java C++ C PHP Javascript
  • 104. Target Languages Java C++ C PHP Javascript Similar syntax {...} ; foo()
  • 105. Target Languages Java C++ C PHP Javascript Similar syntax {...} ; foo() Similar keywords while if switch return
  • 106. Lightweight Parser Abstract Temporal Source Code Representation Properties
  • 107. Lightweight Parser Abstract Temporal Source Code Representation Properties } language-independent lightweight parsing
  • 108. Abstract Temporal Source Code Representation Properties
  • 109. Abstract Temporal Source Code Representation Properties int j; int fA; int fB = open(“newFile”); fA = open(“myFile”); j = 7; while (j > 3) { read(fA); write(fB, “Hello”); j--; } close(fA); close(fB);
  • 110. Abstract Temporal Source Code Representation Properties int j; fB: open(CONST) int fA; int fB = open(“newFile”); fA: open(CONST) fA = open(“myFile”); j = 7; while (j > 3) { Loop: read(fA); read(fA) write(fB, “Hello”); write(fB, CONST) j--; } close(fA) close(fA); close(fB); close(fB)
  • 111. Abstract Temporal Source Code Representation Properties fB: open(CONST) fA: open(CONST) Loop: read(fA) write(fB, CONST) close(fA) close(fB)
  • 112. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) read(fA) fA: open(CONST) close(fA) Loop: read(fA) write(fB, CONST) close(fA) close(fB)
  • 113. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) read(fA) fA: open(CONST) close(fA) Loop: read(fA) write(fB, CONST) fB: open(CONST) close(fA) write(fB, CONST) close(fB) close(fB)
  • 114. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) open() < read() read(fA) fA: open(CONST) close(fA) Loop: read(fA) write(fB, CONST) fB: open(CONST) close(fA) write(fB, CONST) close(fB) close(fB)
  • 115. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) open() < read() open() < close() read(fA) fA: open(CONST) close(fA) Loop: read(fA) write(fB, CONST) fB: open(CONST) close(fA) write(fB, CONST) close(fB) close(fB)
  • 116. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) open() < read() open() < close() read(fA) read() < read() fA: open(CONST) close(fA) Loop: read(fA) write(fB, CONST) fB: open(CONST) close(fA) write(fB, CONST) close(fB) close(fB)
  • 117. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) open() < read() open() < close() read(fA) read() < read() fA: open(CONST) close(fA) read() < close() Loop: read(fA) write(fB, CONST) fB: open(CONST) close(fA) write(fB, CONST) close(fB) close(fB)
  • 118. Abstract Temporal Source Code Representation Properties fA: open(CONST) fB: open(CONST) open() < read() open() < close() read(fA) read() < read() fA: open(CONST) close(fA) read() < close() Loop: read(fA) write(fB, CONST) fB: open(CONST) open() < write() close(fA) open() < close() write(fB, CONST) write() < write() close(fB) close(fB) write() < close()
  • 122. 8,000 6,000 4,000 2,000 0 C projects
  • 123. 8,000 6,097 6,000 4,000 2,000 0 C projects
  • 124. 200,000,000 8,000 6,097 150,000,000 6,000 100,000,000 4,000 50,000,000 2,000 0 0 Lines of code C projects
  • 125. 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 Lines of code C projects
  • 131. 18 hours analysis time single core
  • 132. 11 million lines of code per hour
  • 133. 11 seconds per project
  • 134. 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, …); }
  • 135. 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, …); should be called before bind() }
  • 136. static int find_file (…) { DIR *dirp; struct dirent *dirinfo; … dirp = opendir("."); if (dirp == NULL) { … } while ((dirinfo = readdir(dirp)) != NULL) { … } rewinddir(dirp); return 1; }
  • 137. static int find_file (…) { DIR *dirp; struct dirent *dirinfo; … dirp = opendir("."); if (dirp == NULL) { … } while ((dirinfo = readdir(dirp)) != NULL) { … } rewinddir(dirp); return 1; should call closedir() instead }
  • 142. Check my Code • Check your code against the wisdom of Linux • Builds on millions of mined speci cations • Detects problems no other tool can detect www.checkmycode.org
  • 143. Check my Code • Check your code against the wisdom of Linux Dat abase • Builds on millions of ilable mined speci cations ava fo r dow nload • Detects problems no other tool can detect www.checkmycode.org
  • 146. microsoft word mobile phones travel booking operating systems airplane control banking systems
  • 147. microsoft word mobile phones travel booking operating systems airplane control banking systems easy to mine
  • 149. Challenges • Mining complete speci cations
  • 150. Challenges • Mining complete speci cations • Finding relevant abstractions
  • 151. Challenges • Mining complete speci cations • Finding relevant abstractions • Producing readable speci cations
  • 152. Challenges • Mining complete speci cations • Finding relevant abstractions • Producing readable speci cations • Integrating speci cation mining and programming
  • 153. Andrzej Wasylkowski Christian Lindig Natalie Gruska

Notas del editor

  1. You talk to these people, and you immediately realize they&amp;#x2019;re smart. They&amp;#x2019;re really smart &amp;#x2013; Michael got a MSc in maths and CS at the age of 21, got his PhD with 24, and became a professor at the age of 27. Today, he&amp;#x2019;s the best paid professor of Germany.
  2. You talk to these people, and you immediately realize they&amp;#x2019;re smart. They&amp;#x2019;re really smart &amp;#x2013; Michael got a MSc in maths and CS at the age of 21, got his PhD with 24, and became a professor at the age of 27. Today, he&amp;#x2019;s the best paid professor of Germany.
  3. You talk to these people, and you immediately realize they&amp;#x2019;re smart. They&amp;#x2019;re really smart &amp;#x2013; Michael got a MSc in maths and CS at the age of 21, got his PhD with 24, and became a professor at the age of 27. Today, he&amp;#x2019;s the best paid professor of Germany.
  4. You talk to these people, and you immediately realize they&amp;#x2019;re smart. They&amp;#x2019;re really smart &amp;#x2013; Michael got a MSc in maths and CS at the age of 21, got his PhD with 24, and became a professor at the age of 27. Today, he&amp;#x2019;s the best paid professor of Germany.
  5. You talk to these people, and you immediately realize they&amp;#x2019;re smart. They&amp;#x2019;re really smart &amp;#x2013; Michael got a MSc in maths and CS at the age of 21, got his PhD with 24, and became a professor at the age of 27. Today, he&amp;#x2019;s the best paid professor of Germany.
  6. You talk to these people, and you immediately realize they&amp;#x2019;re smart. They&amp;#x2019;re really smart &amp;#x2013; Michael got a MSc in maths and CS at the age of 21, got his PhD with 24, and became a professor at the age of 27. Today, he&amp;#x2019;s the best paid professor of Germany.
  7. They chose to do these other things, not because they are easy, but because they are hard. Hard to verify, this is. Many things are of that kind. However&amp;#x2026; notice that all these problems can be stated in very simple terms.
  8. They chose to do these other things, not because they are easy, but because they are hard. Hard to verify, this is. Many things are of that kind. However&amp;#x2026; notice that all these problems can be stated in very simple terms.
  9. They chose to do these other things, not because they are easy, but because they are hard. Hard to verify, this is. Many things are of that kind. However&amp;#x2026; notice that all these problems can be stated in very simple terms.
  10. They chose to do these other things, not because they are easy, but because they are hard. Hard to verify, this is. Many things are of that kind. However&amp;#x2026; notice that all these problems can be stated in very simple terms.
  11. They chose to do these other things, not because they are easy, but because they are hard. Hard to verify, this is. Many things are of that kind. However&amp;#x2026; notice that all these problems can be stated in very simple terms.
  12. What do I mean by &amp;#x201C;easy to specify&amp;#x201D;? Here&amp;#x2019;s something that&amp;#x2019;s hard to verify &amp;#x2013; sorting.
  13. Tell story of first NORA talk forall i in {0, dots, |x&apos;|} :&amp;: x&apos;[i] &lt; x&apos;[i + 1] \ |x| = |x&apos;| \ forall i in {0, dots, |x|}:&amp;: iota i&apos; in {0, dots, |x&apos;|}: x[i] = x&apos;[i&apos;] \ forall i&apos; in {0, dots, |x&apos;|}:&amp;: iota i in {0, dots, |x|}: x&apos;[i&apos;] = x[i]
  14. Tell story of first NORA talk forall i in {0, dots, |x&apos;|} :&amp;: x&apos;[i] &lt; x&apos;[i + 1] \ |x| = |x&apos;| \ forall i in {0, dots, |x|}:&amp;: iota i&apos; in {0, dots, |x&apos;|}: x[i] = x&apos;[i&apos;] \ forall i&apos; in {0, dots, |x&apos;|}:&amp;: iota i in {0, dots, |x|}: x&apos;[i&apos;] = x[i]
  15. We can introduce a vocabulary, and do things incrementally, but the burden remains. ext{is-sorted}(x&apos;) land ext{is-permutation}(x, x&apos;)
  16. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  17. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  18. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  19. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  20. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  21. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  22. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  23. It&amp;#x2019;s nice to know that MS word won&amp;#x2019;t dereference null pointers, but will it print my text? Full of functional properties
  24. Why is it that things are hard to specify? &amp;#x21D2; New language, &amp;#x21D2; Effort duplicated, &amp;#x21D2; Can&amp;#x2019;t abstract from details
  25. and leverage the knowledge of 50 years of programming! This is what my talk today is about. In fact, it&amp;#x2019;s about mining specifications from 6,000 projects &amp;#x2013; the largest such attempt ever.
  26. and leverage the knowledge of 50 years of programming! This is what my talk today is about. In fact, it&amp;#x2019;s about mining specifications from 6,000 projects &amp;#x2013; the largest such attempt ever.
  27. Dynamic invariants &amp;#x2013; mined from executions Work by Michael Ernst &amp;#x2013; my big inspiration Describe what should hold &amp;#x2013; but not how to get there
  28. API usage &amp;#x2013; as mined from executions Describe what holds &amp;#x2013; and how to achieve it!
  29. This would be a pattern, if it were not for the missing element
  30. This would be a pattern, if it were not for the missing element
  31. This would be a pattern, if it were not for the missing element
  32. This would be a pattern, if it were not for the missing element
  33. We can detect such gaps by looking at overlapping patterns (concepts)
  34. We can detect such gaps by looking at overlapping patterns (concepts)
  35. We can detect such gaps by looking at overlapping patterns (concepts)
  36. We can detect such gaps by looking at overlapping patterns (concepts)
  37. We can detect such gaps by looking at overlapping patterns (concepts)
  38. Produced in 8 minutes on this machine
  39. On encountering a wrong typecode, &lt;visitNEWARRAY()&gt; should report the typecode to the user. However, it fails to do so, as it uses &lt;&apos;+t+&apos;&gt; instead of &lt;&quot;+t+&quot;&gt; when constructing the second parameter to the &lt;constraintViolated()&gt; method, causing the string &lt;&apos;+t+&apos;&gt; to be interpreted verbatim---the message contains &lt;&apos;+t+&apos;&gt; rather than the typecode in &lt;t&gt;. OPMiner{} reports this as an OP violation: the second parameter of &lt;constraintViolated()&gt; should be the result of a &lt;StringBuffer.toString()&gt; method call---i.e. a constructed string rather than a constant string. The rationale for using a constructed string is to include some information about the violation.
  40. On encountering a wrong typecode, &lt;visitNEWARRAY()&gt; should report the typecode to the user. However, it fails to do so, as it uses &lt;&apos;+t+&apos;&gt; instead of &lt;&quot;+t+&quot;&gt; when constructing the second parameter to the &lt;constraintViolated()&gt; method, causing the string &lt;&apos;+t+&apos;&gt; to be interpreted verbatim---the message contains &lt;&apos;+t+&apos;&gt; rather than the typecode in &lt;t&gt;. OPMiner{} reports this as an OP violation: the second parameter of &lt;constraintViolated()&gt; should be the result of a &lt;StringBuffer.toString()&gt; method call---i.e. a constructed string rather than a constant string. The rationale for using a constructed string is to include some information about the violation.
  41. In 48 cases: argument comes from String() constructor; only in 3 cases: from array
  42. In 48 cases: argument comes from String() constructor; only in 3 cases: from array
  43. Code smell &amp;#x2192; does not result in errors, but may cause maintainability problems Defects &amp;#x2192; reported &amp; verified
  44. Code smell &amp;#x2192; does not result in errors, but may cause maintainability problems Defects &amp;#x2192; reported &amp; verified
  45. 44% holds for AspectJ; same for other projects Lots of subtle defects in production code Unclear whether these would be found by other means
  46. and leverage the knowledge of 50 years of programming! This is what my talk today is about
  47. and leverage the knowledge of 50 years of programming! This is what my talk today is about
  48. and leverage the knowledge of 50 years of programming! This is what my talk today is about
  49. Die einleitende Geschichte erz&amp;#xE4;hlt von Francis Galtons &amp;#xDC;berraschung, dass Besucher einer Vieh-Ausstellung im Rahmen eines Gewinnspiels das Schlachtgewicht eines Rindes genau sch&amp;#xE4;tzten, wenn man als Sch&amp;#xE4;tzwert der Gruppe den Mittelwert aller Sch&amp;#xE4;tzungen annahm. (Die Sch&amp;#xE4;tzung der Gruppe war sogar besser als die jedes einzelnen Teilnehmers, darunter manche Metzger.)
  50. First thing we needed was a lightweight parser
  51. Wir m&amp;#xFC;ssen daher in der Lage sein, gro&amp;#xDF;e Mengen Code zu analysieren &amp;#x2013; am besten Quellcode.
  52. Wir m&amp;#xFC;ssen daher in der Lage sein, gro&amp;#xDF;e Mengen Code zu analysieren &amp;#x2013; am besten Quellcode.
  53. Next thing we needed was thousands of projects
  54. We have 6097 projects in our reference database. Their size ranges from 7 (for openssl-blacklist_0.4.2 and openvpn-blacklist_0.3) to 5,491,951 (for linux-2.6.29) SLOC (generated using David A. Wheeler&apos;s &apos;SLOCCount&apos;; includes only .c files). Some other statistics: &amp;#xA0;[first quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;1093 &amp;#xA0;[third quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;16160 &amp;#xA0;[median]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;4162 &amp;#xA0;[mean]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;33020
  55. We have 6097 projects in our reference database. Their size ranges from 7 (for openssl-blacklist_0.4.2 and openvpn-blacklist_0.3) to 5,491,951 (for linux-2.6.29) SLOC (generated using David A. Wheeler&apos;s &apos;SLOCCount&apos;; includes only .c files). Some other statistics: &amp;#xA0;[first quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;1093 &amp;#xA0;[third quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;16160 &amp;#xA0;[median]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;4162 &amp;#xA0;[mean]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;33020
  56. We have 6097 projects in our reference database. Their size ranges from 7 (for openssl-blacklist_0.4.2 and openvpn-blacklist_0.3) to 5,491,951 (for linux-2.6.29) SLOC (generated using David A. Wheeler&apos;s &apos;SLOCCount&apos;; includes only .c files). Some other statistics: &amp;#xA0;[first quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;1093 &amp;#xA0;[third quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;16160 &amp;#xA0;[median]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;4162 &amp;#xA0;[mean]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;33020
  57. We have 6097 projects in our reference database. Their size ranges from 7 (for openssl-blacklist_0.4.2 and openvpn-blacklist_0.3) to 5,491,951 (for linux-2.6.29) SLOC (generated using David A. Wheeler&apos;s &apos;SLOCCount&apos;; includes only .c files). Some other statistics: &amp;#xA0;[first quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;1093 &amp;#xA0;[third quartile]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;16160 &amp;#xA0;[median]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;4162 &amp;#xA0;[mean]: &amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;33020
  58. Defect in Conspire 0.20
  59. Defect in Conspire 0.20
  60. Defect in cksfv-1.3.13
  61. Defect in cksfv-1.3.13
  62. As a special treat to SCAM attendees, we&amp;#x2019;re making all of our database available &amp;#x2013; today!
  63. coming back to the beginning of my talk &amp;#x2013; are we facing a specification crisis? Yes.
  64. coming back to the beginning of my talk &amp;#x2013; are we facing a specification crisis? Yes.
  65. But we can alleviate it
  66. by reusing and abstracting from all the code that&amp;#x2019;s around.
  67. But still, we just scratch the surface of the knowledge that&amp;#x2019;s in there. Plenty of work lies ahead of us.
  68. But still, we just scratch the surface of the knowledge that&amp;#x2019;s in there. Plenty of work lies ahead of us.
  69. But still, we just scratch the surface of the knowledge that&amp;#x2019;s in there. Plenty of work lies ahead of us.
  70. But still, we just scratch the surface of the knowledge that&amp;#x2019;s in there. Plenty of work lies ahead of us.
  71. But with these future challenges, let&amp;#x2019;s not forget past challenges. My students faced these challenges not because they were easy, but because they were hard. And I am very grateful for the wonderful results they achieved.