SlideShare a Scribd company logo
1 of 15
Bug Finding using Coccinelle

     Julia Lawall (Inria/LIP6)

            Joint work with
 Gilles Muller, René Rydhof Hansen,
    Nicolas Palix, Arie Middelkoop



        September 21, 2012




                 1
Bugs: They’re everywhere!




                            2
Our focus


  Bugs in the Linux kernel
     Linux is critical software.
         – Used in embedded systems, desktops, servers, etc.

      Linux is very large.
         – Almost 18 000 .c files
         – Over 10.5 million lines of code
         – Increase of 8% since July 2011 (Linux 3.0).

      Linux has both more and less experienced developers.
         – Maintainers, contributers, developers of proprietary drivers




                                    3
Bug: !x&y


  Author: Al Viro <viro@ZenIV.linux.org.uk>

      wmi: (!x & y) strikes again

  diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c
  @@ -247,7 +247,7 @@
    block = &wblock->gblock;
    handle = wblock->handle;

  - if (!block->flags & ACPI_WMI_METHOD)
  + if (!(block->flags & ACPI_WMI_METHOD))
      return AE_BAD_DATA;

    if (block->instance_count < instance)
Bug: dereference of a possibly NULL value

  Author: Mariusz Kozlowski <m.kozlowski@tuxland.pl>

      tun/tap: Fix crashes if open() /dev/net/tun and
      then poll() it.

  diff --git a/drivers/net/tun.c b/drivers/net/tun.c
  @@ -486,12 +486,14 @@
  - struct sock *sk = tun->sk;
  + struct sock *sk;
    unsigned int mask = 0;

    if (!tun)
      return POLLERR;

  + sk = tun->sk;



                           5
Isolated problems, but these bug types can occur many times




                                                                                                      0
                                                                                                xt .3
                                                                                                          bug present



                                                                                             ne -2.6 9
                                                                                                          file absent



                                                                                                ux .2
                                                                                             lin -2.6 8
                                                                                                ux .2
                                                                                             lin -2.6 7
                                                                                                ux .2
                                                                                             lin -2.6 6
                                                                                                ux .2
                                                                                             lin -2.6 5
                                                                                                ux .2
                                                                                             lin -2.6 4
                                                                                                ux .2
                                                                                             lin -2.6 3
                                                                                                ux .2
                                                                                             lin -2.6 2
                                                                                                ux .2
                                                                                             lin -2.6 1
                                                                                                ux .2




                                                                                                          Linux
                                                                                             lin -2.6 0




                                                                                                                        6
                                                                                                ux .2
                                                                                             lin -2.6 9
                                                                                                ux .1
                                                                                             lin -2.6 8
                                                                                                ux .1
                                                                                             lin -2.6 7
                                                                                                ux .1
                                                                                             lin -2.6 6
                                                                                                ux .1
                                                                                             lin -2.6 5
                                                                                                ux .1
                                                                                             lin -2.6 4
                                                                                                ux .1
                                                                                             lin -2.6 3
                                                                                                ux .1
                                                                                             lin -2.6
                                                                                                ux
                                                                                             lin
                                                                      !x&y case:
                                                                                   Defects
Issue
Goal: Find and fix bugs in C code



                   Find once, fix everywhere.




  Approach: Coccinelle: http://coccinelle.lip6.fr/
      Static analysis to find patterns in C code.

      Automatic transformation to fix bugs.

      User scriptable, based on patch notation
      (semantic patches).



                                 7
Bug: !x&y


  Author: Al Viro <viro@ZenIV.linux.org.uk>

      wmi: (!x & y) strikes again

  diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c
  @@ -247,7 +247,7 @@
    block = &wblock->gblock;
    handle = wblock->handle;

  - if (!block->flags & ACPI_WMI_METHOD)
  + if (!(block->flags & ACPI_WMI_METHOD))
      return AE_BAD_DATA;

    if (block->instance_count < instance)



                           8
Finding and fixing !x&y bugs using Coccinelle



   @@
   expression E;
   constant C;
   @@

   - !E & C
   + !(E & C)


      E is an arbitrary expression.

      C is an arbitrary constant.




                                    9
Example

  Original code:

    if (!state->card->
       ac97_status & CENTER_LFE_ON)
            val &= ~DSP_BIND_CENTER_LFE;

  Semantic patch:

  @@ expression E; constant C; @@
  - !E & C
  + !(E & C)

  Generated code:

    if (!(state->card->ac97_status & CENTER_LFE_ON))
            val &= ~DSP_BIND_CENTER_LFE;


                           10
xt        .3
                                                                                        0
                                                                         ne        .6
                                                                                -2
                                                                              ux     .2
                                                                                        9
                                                                         lin       .6
                                                                                -2
          96 instances in Linux from 2.6.13 (August 2005) to




                                                                              ux     .2
                                                                                        8
                                                                         lin       .6
                                                                                -2
                                                                              ux     .2
                                                                                        7
                                                                         lin       .6
                                                                                -2
                                                                              ux     .2
                                                                                        6
                                                                         lin       .6
                                                                                -2
                                                                              ux     .2
                                                                                        5
                                                                         lin       .6
                                                                                -2
                                                                              ux     .2
                                                                                        4
                                                                         lin       .6
                                                                                -2
                                                                              ux     .2
                                                                                        3
                                                                         lin       .6
                                                                                -2
                                                                              ux     .2
                                                                                        2
                                                                         lin       .6
                                                                                -2
                                                                              ux




                                                                                            Linux
                                                                                        1
                                                                         lin         .2
                                                                                   .6




                                                                                                    11
                                                                                -2
                                                                              ux     .2
                                                                                        0
          v2.6.28 (December 2008)




                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        9
                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        8
                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        7
                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        6
                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        5
                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        4
                                                                         lin       .6
                                                                                -2
                                                                              ux     .1
                                                                                        3
                                                                         lin       .6
                                                                                -2
                                                                              ux
                                                                         lin
Results
                                                               Defects
Other examples: dereference of a possibly NULL value


  @@
  type T;
  identifier i,fld;
  expression E;
  statement S;
  @@

    T i = E->fld;
  + T i;
    ... when != E
         when != i
    if (E == NULL) S
  + i = E->fld;
Other examples: dereference of a possibly NULL value


  @@
  type T;
  identifier i,fld;
  expression E;
  statement S;
  @@

  - T i = E->fld;
  + T i;
    ... when != E
         when != i
    if (E == NULL) S
  + i = E->fld;


                         13
Other examples



     Forgetting to initialize the return value.

     Testing the wrong value.

     Forgetting to free data, unlock locks, etc.

     Dereferencing freed data.

     Double-initializing the same variable, field, etc.

     And many others...




                                  14
Conclusion

  A patch-like program matching and transformation language

  Over 1000 Coccinelle-based patches accepted into Linux

  Coccinelle semantic patches available in the Linux source code

  Used by other Linux developers

  Probable bugs found in gcc, postgresql, vim, amsn, pidgin,
  mplayer, openssl, vlc, wine


                http://coccinelle.lip6.fr/



                                15

More Related Content

More from Anne Nicolas

Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary dataKernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Anne Nicolas
 

More from Anne Nicolas (20)

Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary dataKernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
 
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
Kernel Recipes 2019 - Analyzing changes to the binary interface exposed by th...
 
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and BareboxEmbedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
Embedded Recipes 2019 - Remote update adventures with RAUC, Yocto and Barebox
 
Embedded Recipes 2019 - Making embedded graphics less special
Embedded Recipes 2019 - Making embedded graphics less specialEmbedded Recipes 2019 - Making embedded graphics less special
Embedded Recipes 2019 - Making embedded graphics less special
 
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre SiliconEmbedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
Embedded Recipes 2019 - Linux on Open Source Hardware and Libre Silicon
 
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) pictureEmbedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
Embedded Recipes 2019 - From maintaining I2C to the big (embedded) picture
 
Embedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayEmbedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops way
 
Embedded Recipes 2019 - Herd your socs become a matchmaker
Embedded Recipes 2019 - Herd your socs become a matchmakerEmbedded Recipes 2019 - Herd your socs become a matchmaker
Embedded Recipes 2019 - Herd your socs become a matchmaker
 
Embedded Recipes 2019 - LLVM / Clang integration
Embedded Recipes 2019 - LLVM / Clang integrationEmbedded Recipes 2019 - LLVM / Clang integration
Embedded Recipes 2019 - LLVM / Clang integration
 
Embedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debuggingEmbedded Recipes 2019 - Introduction to JTAG debugging
Embedded Recipes 2019 - Introduction to JTAG debugging
 
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimediaEmbedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
Embedded Recipes 2019 - Pipewire a new foundation for embedded multimedia
 
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedKernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
 
Kernel Recipes 2019 - Suricata and XDP
Kernel Recipes 2019 - Suricata and XDPKernel Recipes 2019 - Suricata and XDP
Kernel Recipes 2019 - Suricata and XDP
 
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
Kernel Recipes 2019 - Marvels of Memory Auto-configuration (SPD)
 
Kernel Recipes 2019 - Formal modeling made easy
Kernel Recipes 2019 - Formal modeling made easyKernel Recipes 2019 - Formal modeling made easy
Kernel Recipes 2019 - Formal modeling made easy
 
Kernel Recipes 2019 - CVEs are dead, long live the CVE!
Kernel Recipes 2019 - CVEs are dead, long live the CVE!Kernel Recipes 2019 - CVEs are dead, long live the CVE!
Kernel Recipes 2019 - CVEs are dead, long live the CVE!
 
Kernel Recipes 2019 - XDP closer integration with network stack
Kernel Recipes 2019 -  XDP closer integration with network stackKernel Recipes 2019 -  XDP closer integration with network stack
Kernel Recipes 2019 - XDP closer integration with network stack
 
Kernel Recipes 2019 - Kernel hacking behind closed doors
Kernel Recipes 2019 - Kernel hacking behind closed doorsKernel Recipes 2019 - Kernel hacking behind closed doors
Kernel Recipes 2019 - Kernel hacking behind closed doors
 
Kernel Recipes 2019 - Faster IO through io_uring
Kernel Recipes 2019 - Faster IO through io_uringKernel Recipes 2019 - Faster IO through io_uring
Kernel Recipes 2019 - Faster IO through io_uring
 
Embedded Recipes 2019 - RT is about to make it to mainline. Now what?
Embedded Recipes 2019 - RT is about to make it to mainline. Now what?Embedded Recipes 2019 - RT is about to make it to mainline. Now what?
Embedded Recipes 2019 - RT is about to make it to mainline. Now what?
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Coccinelle, a bug finding tool

  • 1. Bug Finding using Coccinelle Julia Lawall (Inria/LIP6) Joint work with Gilles Muller, René Rydhof Hansen, Nicolas Palix, Arie Middelkoop September 21, 2012 1
  • 3. Our focus Bugs in the Linux kernel Linux is critical software. – Used in embedded systems, desktops, servers, etc. Linux is very large. – Almost 18 000 .c files – Over 10.5 million lines of code – Increase of 8% since July 2011 (Linux 3.0). Linux has both more and less experienced developers. – Maintainers, contributers, developers of proprietary drivers 3
  • 4. Bug: !x&y Author: Al Viro <viro@ZenIV.linux.org.uk> wmi: (!x & y) strikes again diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c @@ -247,7 +247,7 @@ block = &wblock->gblock; handle = wblock->handle; - if (!block->flags & ACPI_WMI_METHOD) + if (!(block->flags & ACPI_WMI_METHOD)) return AE_BAD_DATA; if (block->instance_count < instance)
  • 5. Bug: dereference of a possibly NULL value Author: Mariusz Kozlowski <m.kozlowski@tuxland.pl> tun/tap: Fix crashes if open() /dev/net/tun and then poll() it. diff --git a/drivers/net/tun.c b/drivers/net/tun.c @@ -486,12 +486,14 @@ - struct sock *sk = tun->sk; + struct sock *sk; unsigned int mask = 0; if (!tun) return POLLERR; + sk = tun->sk; 5
  • 6. Isolated problems, but these bug types can occur many times 0 xt .3 bug present ne -2.6 9 file absent ux .2 lin -2.6 8 ux .2 lin -2.6 7 ux .2 lin -2.6 6 ux .2 lin -2.6 5 ux .2 lin -2.6 4 ux .2 lin -2.6 3 ux .2 lin -2.6 2 ux .2 lin -2.6 1 ux .2 Linux lin -2.6 0 6 ux .2 lin -2.6 9 ux .1 lin -2.6 8 ux .1 lin -2.6 7 ux .1 lin -2.6 6 ux .1 lin -2.6 5 ux .1 lin -2.6 4 ux .1 lin -2.6 3 ux .1 lin -2.6 ux lin !x&y case: Defects Issue
  • 7. Goal: Find and fix bugs in C code Find once, fix everywhere. Approach: Coccinelle: http://coccinelle.lip6.fr/ Static analysis to find patterns in C code. Automatic transformation to fix bugs. User scriptable, based on patch notation (semantic patches). 7
  • 8. Bug: !x&y Author: Al Viro <viro@ZenIV.linux.org.uk> wmi: (!x & y) strikes again diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c @@ -247,7 +247,7 @@ block = &wblock->gblock; handle = wblock->handle; - if (!block->flags & ACPI_WMI_METHOD) + if (!(block->flags & ACPI_WMI_METHOD)) return AE_BAD_DATA; if (block->instance_count < instance) 8
  • 9. Finding and fixing !x&y bugs using Coccinelle @@ expression E; constant C; @@ - !E & C + !(E & C) E is an arbitrary expression. C is an arbitrary constant. 9
  • 10. Example Original code: if (!state->card-> ac97_status & CENTER_LFE_ON) val &= ~DSP_BIND_CENTER_LFE; Semantic patch: @@ expression E; constant C; @@ - !E & C + !(E & C) Generated code: if (!(state->card->ac97_status & CENTER_LFE_ON)) val &= ~DSP_BIND_CENTER_LFE; 10
  • 11. xt .3 0 ne .6 -2 ux .2 9 lin .6 -2 96 instances in Linux from 2.6.13 (August 2005) to ux .2 8 lin .6 -2 ux .2 7 lin .6 -2 ux .2 6 lin .6 -2 ux .2 5 lin .6 -2 ux .2 4 lin .6 -2 ux .2 3 lin .6 -2 ux .2 2 lin .6 -2 ux Linux 1 lin .2 .6 11 -2 ux .2 0 v2.6.28 (December 2008) lin .6 -2 ux .1 9 lin .6 -2 ux .1 8 lin .6 -2 ux .1 7 lin .6 -2 ux .1 6 lin .6 -2 ux .1 5 lin .6 -2 ux .1 4 lin .6 -2 ux .1 3 lin .6 -2 ux lin Results Defects
  • 12. Other examples: dereference of a possibly NULL value @@ type T; identifier i,fld; expression E; statement S; @@ T i = E->fld; + T i; ... when != E when != i if (E == NULL) S + i = E->fld;
  • 13. Other examples: dereference of a possibly NULL value @@ type T; identifier i,fld; expression E; statement S; @@ - T i = E->fld; + T i; ... when != E when != i if (E == NULL) S + i = E->fld; 13
  • 14. Other examples Forgetting to initialize the return value. Testing the wrong value. Forgetting to free data, unlock locks, etc. Dereferencing freed data. Double-initializing the same variable, field, etc. And many others... 14
  • 15. Conclusion A patch-like program matching and transformation language Over 1000 Coccinelle-based patches accepted into Linux Coccinelle semantic patches available in the Linux source code Used by other Linux developers Probable bugs found in gcc, postgresql, vim, amsn, pidgin, mplayer, openssl, vlc, wine http://coccinelle.lip6.fr/ 15