SlideShare a Scribd company logo
C
    Ruby 1.9 trunk
          @ikegami_ _
@ikegami_ _

•   2003

•   2003-2010

    •              Haskell

    •   C

        •   10/27 - 11/10    2

•   Ruby/Mathematica, Ruby/Ming, RushCheck, Karatsuba
C言語静的解析ツールと Ruby 1.9 trunk
1/2
•                       C++

    •   BLAST

    •   Frama-C

        •
            •
            •
            •     CIL         GCC
2/2
•
                     ←
•
    • cppcheck         C C++

     • Emacs + Flymake
     • Vim +
       • Vim + QuickFix + errormaker
Emacs + Flymake + cppcheck




                    →
•
    • cppcheck
    • splint
•
    • BLAST
    • Frama-C
•               -Wall

•
    •
        •
            •
•
•   division by zero   •   assert

•             unroll
                       •
                           assertion
•   if


•
•
•   Call flow graph

•
cppcheck
•      written in C++

• C/C++
  •
  • Tokenize
  • Run all checks - pattern matching of the tokens
           http://sourceforge.net/apps/trac/cppcheck/
cppcheck                 ruby

•   ruby-1.9 trunk revision 33685 (2011-11-09   )

    •   compile.c      77 files   2:01:02.55

        •   error        6

    •   compile.c   54:46.94s

•
cppcheck                       Ruby
                   6

[hash.c:2351]: (error) Memory leak: str
[io.c:5264]: (error) fflush() called on input stream "stdin" may
result in undefined behaviour
[regcomp.c:5524]: (error) Memory leak: new_reg
[vm_dump.c:831]: (error) Possible null pointer dereference: vm -
otherwise it is redundant to check if vm is null at line 778
[vm_dump.c:834]: (error) Possible null pointer dereference: vm -
otherwise it is redundant to check if vm is null at line 778
[vm_dump.c:835]: (error) Possible null pointer dereference: vm -
otherwise it is redundant to check if vm is null at line 778
hash.c
           [hash.c:2351]: (error) Memory leak: str

2351 } /*              ruby_setenv         */
2303             str = malloc(len += strlen(value) + 2);

                 str     free

                  2287 #elif defined __sun

       Solaris
io.c
   [io.c:5264]: (error) fflush() called on input stream
   "stdin" may result in undefined behaviour

5264        fflush(stdin);          /* is it really needed? */

Q. How can I flush pending input so that a user's
typeahead isn't read at the next prompt? Will
fflush(stdin) work?
A. fflush is defined only for output streams. (omit)
               comp.lang.c FAQ list · Question 12.26a
splint
•                        written in C

•
•                              annotation

•   cppcheck

•
    •   cont.c gc.c random.c thread_pthread.h

                                   http://www.splint.org/
splint hash.c
•   ruby-1.9 trunk revision 33685 (2011-11-09   )

•   397

•   header

    •   Solaris        Solaris       configure



        •   cppcheck             hash.c
            x86
splint regcomp.c

•   ruby-1.9 trunk revision 33685 (2011-11-09   )

•   737

    •
        •
splint regcomp.c
regcomp.c:180:10: Only storage uslist->us->target
(type struct _Node *) derived from released storage is not
released (memory      leak): uslist->us
(omit)

 176     static void
 177     unset_addr_list_end(UnsetAddrList* uslist)
 178     {
 179       if (IS_NOT_NULL(uslist->us))
 180         xfree(uslist->us);
 181     }
176   static void
177   unset_addr_list_end(UnsetAddrList* uslist)
178   {
179     if (IS_NOT_NULL(uslist->us))
180       xfree(uslist->us);
                             typedef struct {
181   }                        int       offset;
                               struct _Node* target;
                             } UnsetAddr;
  uslist->us->target
                             typedef struct {
  free                         int     num;
                               int     alloc;
                               UnsetAddr* us;
                             } UnsetAddrList;
183   static int
184   unset_addr_list_add(UnsetAddrList* uslist, int offset, struct _Node* node)
185   {
186     UnsetAddr* p;
187     int size;
188
189       if (uslist->num >= uslist->alloc) {
190         size = uslist->alloc * 2;
191         p = (UnsetAddr* )xrealloc(uslist->us, sizeof(UnsetAddr) * size);
192         CHECK_NULL_RETURN_MEMERR(p);
193         uslist->alloc = size;
194         uslist->us = p;
195       }
196
197       uslist->us[uslist->num].offset = offset;
198       uslist->us[uslist->num].target = node;
199       uslist->num++;
200       return 0;                ↑ free
201   }
false positive
BLAST
 • with CIL                 OCaml

 •
   •            assert()

   •
   • assert
http://mtc.epfl.ch/software-tools/blast/index-epfl.php
escape
#include <assert.h>
int watched; /* a global variable */
void foo(int i) { watched = i; }     ←
void bar()
{
  int j;

  foo(j);
  assert(j == watched);
  /* assert(j != watched); */
}
   % gcc -E -I ${BLAST_INCLUDE} -main bar target.c
   % pblast.opt target.i -main bar
                                  :-)
#include <assert.h>
int *watched;

void foo(int *p) { watched = p; }

void bar()
{
  int i, *j;
  i = 1;
  j = &i;
  foo(j);
  assert(j == watched);
  /* assert(j != watched); */
}
   % gcc -E -I ${BLAST_INCLUDE} -main bar target.c
   % pblast.opt target.i -main bar
                                  :-)
ruby 1.9 trunk

• for   while

• if
  •
•
  •
  •
Frama-C
• with CIL               OCaml

•C
 •
 •
   • value plug-in   ←
   • users plug-in
                          http://frama-c.com/
division by zero
void foo(int x, int y)
{
  int z = x / y; /* y should not be zero */
  return;
}

int main(int argc, char **argv)
{
  int x = 1, y = 0;
  foo(x, y);
  return 0;
}
Frama-C value plug-in

% frama-c -val foo.c
[value] Analyzing a complete application starting at main

foo.c:3:[kernel] warning: division by zero: assert y ≢ 0;
division by zero
 • ruby trunk revision no. 33685
  • bignum.c
    • 1044 ds[k] = (BDIGIT)(num / hbase);
  • util.c
    •
      • 331 n = (r - l + size) / size;
Frama-C value plugin
Frama-C users plug-in


•       callee

    •
void foo(void) {}
void bar(void) {foo();}

int main(void)
{
  bar();
  return 0;
}
          % frama-c -users foo.c
          [kernel] preprocessing with "gcc -C -E -I. foo.c"

         [users] ====== DISPLAYING USERS ======
              bar: foo
              main: foo bar
              ====== END OF USERS ==========
ruby            string.c
callee
http://sovmoess.tumblr.com/
post/12364993205/frama-c-ruby-1-9-string-c-callee
                  @ikegami_ _
•
    •   false positive

    •
    •                                 CPU

•          annotation

    •                    annotation

    •   Frama-C + jessie plug-in → Coq
•2          C

  • ruby-1.9 trunk revision 33685
•      cppcheck/splint

  • escape
• BLAST/Frama-C
  •

More Related Content

PPTX
Scope and closures
DOCX
Miblagh (2)
PDF
Go Go Gadget! - An Intro to Return Oriented Programming (ROP)
PDF
lldb – Debugger auf Abwegen
PDF
R/C++ talk at earl 2014
PDF
Rcpp11 useR2014
PDF
Radare2 @ ndh2k15 : First r2babies steps
Scope and closures
Miblagh (2)
Go Go Gadget! - An Intro to Return Oriented Programming (ROP)
lldb – Debugger auf Abwegen
R/C++ talk at earl 2014
Rcpp11 useR2014
Radare2 @ ndh2k15 : First r2babies steps

What's hot (19)

PPTX
Understand more about C
PDF
Tiramisu をちょっと、味見してみました。
PDF
Rcpp11 genentech
PDF
Application of Radare2 Illustrated by Shylock and Snakso.A Analysis
PDF
All I know about rsc.io/c2go
PPTX
Protecting C++
PDF
TVM VTA (TSIM)
PDF
Web 2 . .3 Development Services
PDF
When RV Meets CEP (RV 2016 Tutorial)
PDF
Basicsof c make and git for a hello qt application
PDF
Why my Go program is slow?
PDF
"A 1,500 line (!!) switch statement powers your Python!" - Allison Kaptur, !!...
DOCX
Codigo fuente
PDF
Bytes in the Machine: Inside the CPython interpreter
PDF
Swift core
PDF
Roots of a quadratic equation1
PDF
Powered by Python - PyCon Germany 2016
PDF
深入淺出C語言
PDF
Cluj.py Meetup: Extending Python in C
Understand more about C
Tiramisu をちょっと、味見してみました。
Rcpp11 genentech
Application of Radare2 Illustrated by Shylock and Snakso.A Analysis
All I know about rsc.io/c2go
Protecting C++
TVM VTA (TSIM)
Web 2 . .3 Development Services
When RV Meets CEP (RV 2016 Tutorial)
Basicsof c make and git for a hello qt application
Why my Go program is slow?
"A 1,500 line (!!) switch statement powers your Python!" - Allison Kaptur, !!...
Codigo fuente
Bytes in the Machine: Inside the CPython interpreter
Swift core
Roots of a quadratic equation1
Powered by Python - PyCon Germany 2016
深入淺出C語言
Cluj.py Meetup: Extending Python in C
Ad

Similar to C言語静的解析ツールと Ruby 1.9 trunk (20)

PDF
Boosting Developer Productivity with Clang
PPTX
C Programming Training in Ambala ! Batra Computer Centre
PDF
GoFFIng around with Ruby #RubyConfPH
PDF
C++ amp on linux
PPTX
PDF
シェル芸でライフハック(特論)
KEY
Objective-Cひとめぐり
PDF
Tales from the dark side: developing SDKs at scale
PDF
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
PPTX
Chp7_C++_Functions_Part1_Built-in functions.pptx
PPTX
What has to be paid attention when reviewing code of the library you develop
PPTX
Java Jit. Compilation and optimization by Andrey Kovalenko
PDF
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
PDF
Diving into HHVM Extensions (php[tek] 2016)
PDF
start_printf: dev/ic/com.c comstart()
PDF
Vim Script Programming
PDF
Crash_Report_Mechanism_In_Tizen
PDF
LCU14 302- How to port OP-TEE to another platform
PDF
Secure Programming Practices in C++ (NDC Oslo 2018)
Boosting Developer Productivity with Clang
C Programming Training in Ambala ! Batra Computer Centre
GoFFIng around with Ruby #RubyConfPH
C++ amp on linux
シェル芸でライフハック(特論)
Objective-Cひとめぐり
Tales from the dark side: developing SDKs at scale
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
Chp7_C++_Functions_Part1_Built-in functions.pptx
What has to be paid attention when reviewing code of the library you develop
Java Jit. Compilation and optimization by Andrey Kovalenko
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
Diving into HHVM Extensions (php[tek] 2016)
start_printf: dev/ic/com.c comstart()
Vim Script Programming
Crash_Report_Mechanism_In_Tizen
LCU14 302- How to port OP-TEE to another platform
Secure Programming Practices in C++ (NDC Oslo 2018)
Ad

More from ikegami__ (6)

PDF
Agda 入門@ProofSummit 2011
PDF
Mac Laptop で Gentoo
PDF
Lightening Talk at Open Source Conference 2007
PDF
Introduction to Haskell games in Open Source Conference 2007 Hokkaido
PDF
Advanced Topics in Haskell
PDF
Introduction to Haskell@Open Source Conference 2007 Hokkaido
Agda 入門@ProofSummit 2011
Mac Laptop で Gentoo
Lightening Talk at Open Source Conference 2007
Introduction to Haskell games in Open Source Conference 2007 Hokkaido
Advanced Topics in Haskell
Introduction to Haskell@Open Source Conference 2007 Hokkaido

Recently uploaded (20)

PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
Big Data Technologies - Introduction.pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Spectroscopy.pptx food analysis technology
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Machine Learning_overview_presentation.pptx
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
A comparative analysis of optical character recognition models for extracting...
PPTX
1. Introduction to Computer Programming.pptx
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Big Data Technologies - Introduction.pptx
Spectral efficient network and resource selection model in 5G networks
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Spectroscopy.pptx food analysis technology
Mobile App Security Testing_ A Comprehensive Guide.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Building Integrated photovoltaic BIPV_UPV.pdf
Machine Learning_overview_presentation.pptx
Group 1 Presentation -Planning and Decision Making .pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
Dropbox Q2 2025 Financial Results & Investor Presentation
A comparative analysis of optical character recognition models for extracting...
1. Introduction to Computer Programming.pptx
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Per capita expenditure prediction using model stacking based on satellite ima...

C言語静的解析ツールと Ruby 1.9 trunk

  • 1. C Ruby 1.9 trunk @ikegami_ _
  • 2. @ikegami_ _ • 2003 • 2003-2010 • Haskell • C • 10/27 - 11/10 2 • Ruby/Mathematica, Ruby/Ming, RushCheck, Karatsuba
  • 4. 1/2 • C++ • BLAST • Frama-C • • • • CIL GCC
  • 5. 2/2 • ← • • cppcheck C C++ • Emacs + Flymake • Vim + • Vim + QuickFix + errormaker
  • 6. Emacs + Flymake + cppcheck →
  • 7. • cppcheck • splint • • BLAST • Frama-C
  • 8. -Wall • • • • •
  • 9. division by zero • assert • unroll • assertion • if • • • Call flow graph •
  • 10. cppcheck • written in C++ • C/C++ • • Tokenize • Run all checks - pattern matching of the tokens http://sourceforge.net/apps/trac/cppcheck/
  • 11. cppcheck ruby • ruby-1.9 trunk revision 33685 (2011-11-09 ) • compile.c 77 files 2:01:02.55 • error 6 • compile.c 54:46.94s •
  • 12. cppcheck Ruby 6 [hash.c:2351]: (error) Memory leak: str [io.c:5264]: (error) fflush() called on input stream "stdin" may result in undefined behaviour [regcomp.c:5524]: (error) Memory leak: new_reg [vm_dump.c:831]: (error) Possible null pointer dereference: vm - otherwise it is redundant to check if vm is null at line 778 [vm_dump.c:834]: (error) Possible null pointer dereference: vm - otherwise it is redundant to check if vm is null at line 778 [vm_dump.c:835]: (error) Possible null pointer dereference: vm - otherwise it is redundant to check if vm is null at line 778
  • 13. hash.c [hash.c:2351]: (error) Memory leak: str 2351 } /* ruby_setenv */ 2303 str = malloc(len += strlen(value) + 2); str free 2287 #elif defined __sun Solaris
  • 14. io.c [io.c:5264]: (error) fflush() called on input stream "stdin" may result in undefined behaviour 5264 fflush(stdin); /* is it really needed? */ Q. How can I flush pending input so that a user's typeahead isn't read at the next prompt? Will fflush(stdin) work? A. fflush is defined only for output streams. (omit) comp.lang.c FAQ list · Question 12.26a
  • 15. splint • written in C • • annotation • cppcheck • • cont.c gc.c random.c thread_pthread.h http://www.splint.org/
  • 16. splint hash.c • ruby-1.9 trunk revision 33685 (2011-11-09 ) • 397 • header • Solaris Solaris configure • cppcheck hash.c x86
  • 17. splint regcomp.c • ruby-1.9 trunk revision 33685 (2011-11-09 ) • 737 • •
  • 18. splint regcomp.c regcomp.c:180:10: Only storage uslist->us->target (type struct _Node *) derived from released storage is not released (memory leak): uslist->us (omit) 176 static void 177 unset_addr_list_end(UnsetAddrList* uslist) 178 { 179 if (IS_NOT_NULL(uslist->us)) 180 xfree(uslist->us); 181 }
  • 19. 176 static void 177 unset_addr_list_end(UnsetAddrList* uslist) 178 { 179 if (IS_NOT_NULL(uslist->us)) 180 xfree(uslist->us); typedef struct { 181 } int offset; struct _Node* target; } UnsetAddr; uslist->us->target typedef struct { free int num; int alloc; UnsetAddr* us; } UnsetAddrList;
  • 20. 183 static int 184 unset_addr_list_add(UnsetAddrList* uslist, int offset, struct _Node* node) 185 { 186 UnsetAddr* p; 187 int size; 188 189 if (uslist->num >= uslist->alloc) { 190 size = uslist->alloc * 2; 191 p = (UnsetAddr* )xrealloc(uslist->us, sizeof(UnsetAddr) * size); 192 CHECK_NULL_RETURN_MEMERR(p); 193 uslist->alloc = size; 194 uslist->us = p; 195 } 196 197 uslist->us[uslist->num].offset = offset; 198 uslist->us[uslist->num].target = node; 199 uslist->num++; 200 return 0; ↑ free 201 }
  • 22. BLAST • with CIL OCaml • • assert() • • assert http://mtc.epfl.ch/software-tools/blast/index-epfl.php
  • 24. #include <assert.h> int watched; /* a global variable */ void foo(int i) { watched = i; } ← void bar() {   int j;   foo(j);   assert(j == watched);   /* assert(j != watched); */ } % gcc -E -I ${BLAST_INCLUDE} -main bar target.c % pblast.opt target.i -main bar :-)
  • 25. #include <assert.h> int *watched; void foo(int *p) { watched = p; } void bar() {   int i, *j;   i = 1;   j = &i;   foo(j);   assert(j == watched);   /* assert(j != watched); */ } % gcc -E -I ${BLAST_INCLUDE} -main bar target.c % pblast.opt target.i -main bar :-)
  • 26. ruby 1.9 trunk • for while • if • • • •
  • 27. Frama-C • with CIL OCaml •C • • • value plug-in ← • users plug-in http://frama-c.com/
  • 28. division by zero void foo(int x, int y) { int z = x / y; /* y should not be zero */ return; } int main(int argc, char **argv) { int x = 1, y = 0; foo(x, y); return 0; }
  • 29. Frama-C value plug-in % frama-c -val foo.c [value] Analyzing a complete application starting at main foo.c:3:[kernel] warning: division by zero: assert y ≢ 0;
  • 30. division by zero • ruby trunk revision no. 33685 • bignum.c • 1044 ds[k] = (BDIGIT)(num / hbase); • util.c • • 331 n = (r - l + size) / size; Frama-C value plugin
  • 32. void foo(void) {} void bar(void) {foo();} int main(void) { bar(); return 0; } % frama-c -users foo.c [kernel] preprocessing with "gcc -C -E -I. foo.c" [users] ====== DISPLAYING USERS ====== bar: foo main: foo bar ====== END OF USERS ==========
  • 33. ruby string.c callee http://sovmoess.tumblr.com/ post/12364993205/frama-c-ruby-1-9-string-c-callee @ikegami_ _
  • 34. • false positive • • CPU • annotation • annotation • Frama-C + jessie plug-in → Coq
  • 35. •2 C • ruby-1.9 trunk revision 33685 • cppcheck/splint • escape • BLAST/Frama-C •