SlideShare una empresa de Scribd logo
1 de 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

Más contenido relacionado

Más de 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
 

Más de 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?
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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?
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
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...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.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