Sparse a Short Overview

Sparse a Short Overview

Sparse a short overview Nicholas Mc Guire <[email protected]> March 5, 2019 History static code testing in Linux Sparse a short overview Formal methods in the Linux kernel start early with the Nicholas Mc Stanford checker Guire <[email protected]> Proprietry ? Nop - secret ! Later commercialized by Coverity as SWAT Context Quite a nice number of bugs were found though What to do about this situation ? Sit down and write your own tool - Linus Torvalds writes sparse (2002) By now it is well established in the kernel and maintained by Luc Van Oostenryck Current version 0.6.0 - Copyright OSADL eG, 2018, CC-BY-SA-4.0 Short profile Sparse a short overview SPARSE CHECKER Nicholas Mc Maintainer: Luc Van Oostenryck <[email protected]> Guire List : [email protected] <[email protected]> Web page : https://sparse.wiki.kernel.org/ Tree/type : git git://git.kernel.org/pub/scm/devel/sparse/sparse.git Context Status : Maintained Files : include/linux/compiler.h Sparse really is two things A generic parse tree library A tool handling Linux kernel specifics For both we simply refer to "sparse" Copyright OSADL eG, 2018, CC-BY-SA-4.0 What is sparse Sparse What its not a short It is not a compiler or preprocessor overview Its not a tokenizer nor a context-free parser Nicholas Mc Guire What is is <[email protected]> Sparse is a context/type aware semantic source parser Context -> what the types are that the grouping implies Mission: create a semantic parse tree (abstract syntax tree (AST) of a C program)suitable for arbitrary further analysis Do one thing do it well: Emmit the full parse tree - done. but it does have functionality specifically tailored to check Linux kernel patterns A set of simple clients that are a good starting point for new checkers (see obfuscate.c, test-inspect.c, compile.c) See the README in the sparse sources for details of phases and flow. Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse Goals of sparse Sparse a short overview Nicholas Mc Enable static checking in mainline kernel Guire <[email protected]> Mandate it's use (i.e. by linux-next building with sparse) Continuously update it when new pitfalls emerge (though Context changrate is slow by now) Provide a reliable parser useful to build other tools around (e.g. smatch) Use these checkers to catch the common problems that happen during development Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse Installation and Usage Sparse a short $ git clone \ overview git://git.kernel.org/pub/scm/devel/sparse/sparse.git Nicholas Mc Guire <[email protected]> Context $ make $ make install $ cd linux $ make -j4 C=1 $ make -j4 C=2 Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse Constraints of sparse Sparse a short overview Your functions MUST have types - no KR style default int! Nicholas Mc Guire It does NOT cover all possible extensions to C - it does <[email protected]> cover everything the kernel needs though (GNU and C99) Context You get most out of it if you look at the output before/after change - THATs where it will tell you what you messed up most precisely. If unsure - get on the mailinglist linux-sparsevger.kernel.org Integrate sparse into your build-env so that you use it continuously - if you wait until you are done - then it will take you out. Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse What sparse can detect Sparse a short overview Nicholas Mc address space missmatch Guire <[email protected]> tuple missmatches (i.e. -Wbitwise) Context bad casting (i.e. -Wcast truncate) lock context (i.e. -Wcontext) portability warning (i.e. -Wdefault bitfield sign) big-constants warnings (missing size suffix e.g. LL) use man sparse for (a lot) more. Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse Example: address space Sparse a short overview __attribute__((address_space(num))) Nicholas Mc Guire __user (1) <[email protected]> __iomem (2) __kernel (default) Context If code is mixing pointers to different address spaces then you will get a warning. (linux/compile.h) override with __attribute__((force)) If you are converting between address spaces deliberately (i.e. power management does this). Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse Example: lock context checks Sparse a short overview Nicholas Mc Guire <[email protected]> __context__(expression, in_value, out_value) __acquires(x) __attribute__((context(x,1,0))) Context __releases(x) __attribtue__((context(x,0,1))) i.e. LOCK uses this to check if spin lock actually is setting a lock to 1 but never sets it back to 0 (that is aquireing a lock, but not releasing it) Copyright OSADL eG, 2018, CC-BY-SA-4.0 sparse Example: running trivial client Sparse $ cd sparse a short $ ./compile compile.c overview .file "compile.c" Nicholas Mc .text Guire .type clean_up_symbols, @function <[email protected]> ... Context jmp .L2 # 'break'; go to loop bottom .L4: # end if .L7: # loop top ... .L13: # loop bottom movl $0, %eax # return jmp .L12 .L12: addl $164, %esp ret .size main, .-main .ident "sparse silly x86 backend (version v0.5.2)" Copyright OSADL eG, 2018, CC-BY-SA-4.0.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    11 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us