index.html revision 5a9bd1169347783112b1fb472a2d8a177529ba73
1591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek "http://www.w3.org/TR/html4/strict.dtd"> 3591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<html> 4591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<head> 5591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <title>Clang Static Analyzer</title> 65a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek <link type="text/css" rel="stylesheet" href="/content.css" /> 75a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek <link type="text/css" rel="stylesheet" href="/menu.css" /> 85a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek <link type="text/javascript" rel="javascript" href="/menu.css"/> 9591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</head> 10591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<body> 11591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 12591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<!--#include virtual="menu.html.incl"--> 13591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 14591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<div id="content"> 155a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<table style="margin-top:-10px; padding:5px" border=0> 165a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<tr><td> 175a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<h1>Clang Static Analyzer</h1> 18591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>The Clang Static Analyzer consists of both a source code analysis framework 19591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekand a standalone tool that finds bugs in C and Objective-C programs. The 20591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekstandalone tool is invoked from the command-line, and is intended to run in 21591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenektandem with a build of a project or code base.</p> 22591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 23591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>Both are 100% open source and are part of the <a 24591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekhref="http://clang.llvm.org">Clang</a> project.</p> 2551667ee4bf2c6df038bc8e1b7cc79a0d2d0d950fTed Kremenek 26591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<!-- Generated from: http://www.spiffycorners.com/index.php --> 27591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 28591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<style type="text/css"> 29591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy{display:block} 30591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy *{ 31591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek display:block; 32591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek height:1px; 33591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek overflow:hidden; 34591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek font-size:.01em; 35591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek background:#EBF0FA} 36591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy1{ 37591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin-left:3px; 38591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin-right:3px; 39591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek padding-left:1px; 40591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek padding-right:1px; 41591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-left:1px solid #f6f8fc; 42591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-right:1px solid #f6f8fc; 43591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek background:#f0f3fb} 44591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy2{ 45591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin-left:1px; 46591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin-right:1px; 47591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek padding-right:1px; 48591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek padding-left:1px; 49591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-left:1px solid #fdfdfe; 50591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-right:1px solid #fdfdfe; 51591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek background:#eef2fa} 52591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy3{ 53591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin-left:1px; 54591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin-right:1px; 55591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-left:1px solid #eef2fa; 56591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-right:1px solid #eef2fa;} 57591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy4{ 58591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-left:1px solid #f6f8fc; 59591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-right:1px solid #f6f8fc} 60591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffy5{ 61591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-left:1px solid #f0f3fb; 62591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek border-right:1px solid #f0f3fb} 63591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffyfg{ 64591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek background:#EBF0FA} 65591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 66591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek.spiffyfg h2 { 67591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek margin:0px; padding:10px; 68591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek} 69591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</style> 70591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 71591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<style type="text/css"> 72591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek #left { float:left; } 73591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek #left h2 { margin:1px; padding-top:0px; } 74591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek #right { float:left; margin-left:20px; margin-right:20px; padding:0px ;} 75591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek #right h2 { padding:0px; margin:0px; } 76591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek #wrappedcontent { padding:15px;} 77591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</style> 78591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 795a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<div style="margin-left:25px; margin-right:25px; padding:0px; font-size: 80%"> 80591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy"> 81591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy1"><b></b></b> 82591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy2"><b></b></b> 83591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy3"></b> 84591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy4"></b> 85591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy5"></b></b> 86591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <div class="spiffyfg"> 87591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <div style="padding:15px"> 88591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <h2 style="padding:0px; margin:0px">Download</h2> 89591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <h3 style="margin-top:5px">Mac OS X</h3> 90591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <ul> 91591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <li>Latest build (Universal binary, 10.5+): 92591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <!--#include virtual="latest_checker.html.incl"--> 93591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek </li> 94591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <li><a href="/installation.html">Installation</a> and <a 95591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek href="/scan-build.html">usage</a></li> 96591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek </ul> 97591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <h3>Other Platforms</h3> 98591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <p>For other platforms, please follow the instructions for <a 99591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek href="/installation#OtherPlatforms">building the analyzer</a> from 100591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek source code.<p> 101591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek </div> 102591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek </div> 103591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy"> 104591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy5"></b> 105591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy4"></b> 106591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy3"></b> 107591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy2"><b></b></b> 108591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek <b class="spiffy1"><b></b></b></b> 109591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</div> 110591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 111591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h2 id="StaticAnalysis">What is Static Analysis?</h2> 112591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 113591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>The term "static analysis" is conflated, but here we use it to mean 114591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremeneka collection of algorithms and techniques used to analyze source code in order 115591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekto automatically find bugs. The idea is similar in spirit to compiler warnings 116591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek(which can be useful for finding coding errors) but to take that idea a step 117591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekfurther and find bugs that are traditionally found using run-time debugging 118591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenektechniques such as testing.</p> 119591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 120591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>Static analysis bug-finding tools have evolved over the last several decades 121591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekfrom basic syntactic checkers to those that find deep bugs by reasoning about 122591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekthe semantics of code. The goal of the Clang Static Analyzer is to provide a 123591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekindustrial-quality static analysis framework for analyzing C and Objective-C 124591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekprograms that is freely available, extensible, and has a high quality of 125591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekimplementation.</p> 126591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 1275a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek 1285a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek 1295a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek 1305a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek</td><td> 1315a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<a href="images/analyzer_xcode.png"><img src="images/analyzer_xcode.png" width="450x"></a> 1325a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<center><b>Viewing static analyzer results in Xcode 3.2</b></center> 1335a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<a href="images/analyzer_html.png"><img src="images/analyzer_html.png" width="450px"></a> 1345a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek<center><b>Viewing static analyzer results in web browser</b></center> 1355a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek</td></tr></table> 1365a9bd1169347783112b1fb472a2d8a177529ba73Ted Kremenek 137591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h3 id="Clang">Part of Clang and LLVM</h3> 138591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 139591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>As its name implies, the Clang Static Analyzer is built on top of <a 140591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekhref="http://clang.llvm.org">Clang</a> and <a href="http://llvm.org">LLVM</a>. 141591b907b3b29efa4047fc0aba042fdc81b45d5dcTed KremenekStrictly speaking, the analyzer is part of Clang, as Clang consists of a set of 142591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekreusable C++ libraries for building powerful source-level tools. The static 143591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekanalysis engine used by the Clang Static Analyzer is a Clang library, and has 144591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekthe capability to be reused in different contexts and by different clients.</p> 145591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 146591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h2>Important Points to Consider</h2> 147591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 148591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>While we believe that the static analyzer is already very useful for finding 149591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekbugs, we ask you to bear in mind a few points when using it.</p> 150591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 151591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h3>Work-in-Progress</h3> 152591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 153591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>The analyzer is a continuous work-in-progress. 154591b907b3b29efa4047fc0aba042fdc81b45d5dcTed KremenekThere are many planned enhancements to improve both the precision and scope of 155591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekits analysis algorithms as well as the kinds bugs it will find. While there are 156591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekfundamental limitations to what static analysis can do, we have a long way to go 157591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekbefore hitting that wall.</p> 158591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 159591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h3>Slower than Compilation</h3> 160591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 161591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>Operationally, using static analysis to 162591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekautomatically find deep program bugs is about trading CPU time for the hardening 163591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekof code. Because of the deep analysis performed by state-of-the-art static 164591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekanalysis tools, static analysis can be much slower than compilation.</p> 165591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 166591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>While the Clang Static Analyzer is being designed to be as fast and 167591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremeneklight-weight as possible, please do not expect it to be as fast as compiling a 168591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekprogram (even with optimizations enabled). Some of the algorithms needed to find 169591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekbugs require in the worst case exponential time.</p> 170591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 171591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>The Clang Static Analyzer runs in a reasonable amount of time by both 172591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekbounding the amount of checking work it will do as well as using clever 173591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekalgorithms to reduce the amount of work it must do to find bugs.</p></li> 174591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 175591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h3>False Positives</h3> 176591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 177591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>Static analysis is not perfect. It can falsely flag bugs in a program where 178591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekthe code behaves correctly. Because some code checks require more analysis 179591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekprecision than others, the frequency of false positives can vary widely between 180591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekdifferent checks. Our long-term goal is to have the analyzer have a low false 181591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekpositive rate for most code on all checks.</p> 182591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 183591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<p>Please help us in this endeavor by <a href="filing_bugs.html">reporting false 184591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekpositives</a>. False positives cannot be addressed unless we know about 185591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenekthem.</p> 186591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 187591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek<h3>More Checks</h3> 188591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 1890c3a16d5da555c6a78ece6cb6e8eab46aa0ed010Zhongxing Xu<p>Static analysis is not magic; a static analyzer can only find bugs that it 1900c3a16d5da555c6a78ece6cb6e8eab46aa0ed010Zhongxing Xuhas been specifically engineered to find. If there are specific kinds of bugs 1910c3a16d5da555c6a78ece6cb6e8eab46aa0ed010Zhongxing Xuyou would like the Clang Static Analyzer to find, please feel free to 1920c3a16d5da555c6a78ece6cb6e8eab46aa0ed010Zhongxing Xufile <a href="filing_bugs.html">feature requests</a> or contribute your own 1930c3a16d5da555c6a78ece6cb6e8eab46aa0ed010Zhongxing Xupatches.</p> 194591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 195591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</div> 196591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</body> 197591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek</html> 198591b907b3b29efa4047fc0aba042fdc81b45d5dcTed Kremenek 199