<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Goanna Static Analysis by Red Lizard Software</title>
	<atom:link href="http://redlizards.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://redlizards.com/blog</link>
	<description>The Blog of the Goanna Team</description>
	<pubDate>Mon, 23 Aug 2010 03:26:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Copy control crash course</title>
		<link>http://redlizards.com/blog/development/copy-control-crash-course/</link>
		<comments>http://redlizards.com/blog/development/copy-control-crash-course/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 02:30:13 +0000</pubDate>
		<dc:creator>Dominic Gurto</dc:creator>
		
		<category><![CDATA[Better Software]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Goanna]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=529</guid>
		<description><![CDATA[As part of our efforts to expand the scope of Goanna&#8217;s C++ checks, we decided to look into copy control, since this backbone of class architecture can also cause plenty of problems. The most common bugs relating to copy control are memory leaks, which are hard to identify and track down, as they will generally [...]]]></description>
			<content:encoded><![CDATA[<p>As part of our efforts to expand the scope of Goanna&#8217;s C++ checks, we decided to look into copy control, since this backbone of class architecture can also cause plenty of problems. The most common bugs relating to copy control are memory leaks, which are hard to identify and track down, as they will generally not cause the program to crash. Therefore, they are a priority for us to find.</p>
<p>In addition to finding and warning about the most common flaws in copy control functions, we decided to take the opportunity to cover some of the rarer problems, too. Our ultimate aim was to give some kind of useful warning in any case of potential misuse of a class, since copy control is something that a lot of people can have trouble grasping.</p>
<p>While many of our copy control checks warn for convention violations rather than definite bugs, they all combine to ensure that classes follow widely-accepted best practices, to improve the overall readability and robustness of code. As a case study, I&#8217;ll demonstrate the construction of a simple class, showing the bugs and suggestions that Goanna points out along the way.</p>
<p>We&#8217;ll start with a class with an int pointer. Of course, if we want the pointer to point somewhere, we need to allocate some memory for it, so we&#8217;ll do that in a constructor.</p>
<pre>1   class MyClass {
2     public:
3       MyClass();  //constructor
4     private:
5       int* xp;
6   };
7
8   //default constructor
9   MyClass::MyClass(){
10     xp = new int[10];
11  }</pre>
<p>We all know what the problem with this is:</p>
<pre><strong>cop.cc:9: warning: Goanna[COP-dtor] Missing destructor for class `MyClass' whose
function `MyClass::MyClass()' allocates memory</strong></pre>
<pre><strong>cop.cc:9: warning: Goanna[COP-member-uninit] Not all members initialized in this
constructor</strong></pre>
<p>If there is no explicit destructor, the compiler will only call the synthesized destructor, which is a problem for our allocated memory. The synthesized destructor will release the pointer xp, but not the memory allocated to it - this is our responsibility.</p>
<p>The second warning is there because even though we have allocated memory to &#8216;xp&#8217;, we have failed to initialize the values in the array, which should really be done in the constructor.</p>
<p>Because we&#8217;re lazy, let&#8217;s define an empty destructor to make the warnings go away (because that&#8217;s what half of programming is all about). Here&#8217;s the updated class:</p>
<pre>1   class MyClass {
2     public:
3       MyClass();    //default constructor
4       ~MyClass(){}  //destructor
5     private:
6       int* xp;
7   };
8  
9   //default constructor
10  MyClass::MyClass(){
11    xp = new int[10];
12    for (int i=0; i!=10; ++i){
13      xp[i] = 0;
14    }
15  }</pre>
<p>Alas, Goanna still isn&#8217;t happy:</p>
<pre><strong>cop.cc:4: warning: Goanna[COP-dealloc-dtor] Class field `xp' has memory allocated
in a constructor that is not freed in the destructor</strong></pre>
<p>Let&#8217;s release the memory in the destructor.</p>
<pre>17  //destructor
18  MyClass::~MyClass(){
19    delete[] xp;
20  }</pre>
<p>Now our class is free from bugs. So when we run Goanna, we should get the all clear. Right?</p>
<pre><strong>cop.cc:18: warning: Goanna[COP-assign-op] Missing assignment operator for class
`MyClass' which uses dynamic memory allocation</strong></pre>
<pre><strong>cop.cc:18: warning: Goanna[COP-copy-ctor] Missing copy constructor for class
`MyClass' which uses dynamic memory allocation</strong></pre>
<p>Wrong! It seems we&#8217;re just digging ourselves deeper. The destructor is not the only thing the compiler will synthesize. In fact, for any class, it will synthesize up to 3 functions if they are not explicitly defined:</p>
<ol>
<li>Destructor - there will always be one synthesized to release stack memory</li>
<li>Copy constructor - a constructor taking in a reference of the class type</li>
<li>Assignment operator - operator=() defined for the class</li>
</ol>
<p>Even though we have defined a default constructor (with no parameters), the compiler will still synthesize a copy constructor if we have not provided one. The copy constructor is used when instances of a class are copied, for example, passed as parameters or used in containers. Surprisingly, it is also invoked when an instance of the class is initialized at its declaration. For example:</p>
<pre>MyClass a;       //default constructor
MyClass b(a);    //copy constructor
MyClass c = a;   //copy constructor
MyClass d; d=a;  //default constructor; assignment operator</pre>
<p>It can sometimes be confusing which operators or functions are being invoked, and for such reasons it is important to ensure that all functions are explicitly defined when appropriate. Basically, if a user-defined destructor is required, then an assignment operator and copy constructor will also be required. This is sometimes called the &#8216;Rule of 3&#8242;, suggesting that if one of these three is required, all probably are.</p>
<p>So let&#8217;s add our copy constructor and assignment operator to the class, and to avoid any additional warnings, we&#8217;d better make sure we allocate the memory required for xp. And while we&#8217;re at it, we should get rid of the magic number used for the array size:</p>
<pre>1   class MyClass {
2     public:
3       MyClass();                             //default constructor
4       MyClass(const MyClass&amp; other);         //copy constructor
5       void operator=(const MyClass&amp; other);  //assignment operator
6       ~MyClass();                            //destructor
7     private:
8       static const int ARR_INIT_SIZE = 10;
9       int* xp;
10  };
...
18  //copy constructor
19  MyClass::MyClass(const MyClass&amp; other){
20    xp = new int[ARR_INIT_SIZE];
21    for (int i=0; i!=ARR_INIT_SIZE; ++i){
22      xp[i] = other.xp[i];
23    }
24  }
25
26  //assignment operator
27  void MyClass::operator=(const MyClass&amp; other){
28    delete[] xp;  //reallocate the memory in case the size has changed
29    xp = new int[ARR_INIT_SIZE];
30    for (int i=0; i!=ARR_INIT_SIZE; ++i){
31      xp[i] = other.xp[i];
32    }
33  }</pre>
<p>The class is starting to get bulky, but at least we can be sure we&#8217;re helping to make it safe for any creating, copying and destroying that we might be doing. However, Goanna isn&#8217;t quite happy with the class yet:</p>
<pre><strong>cop.cc:27: warning: Goanna[COP-assign-op-ret] Assignment </strong><strong><strong>operator `MyClass::operator='
does not</strong></strong><strong> return a non-const reference to `this'</strong></pre>
<pre><strong>cop.cc:29: warning: Goanna[COP-assign-op-self] Assignment operator `MyClass::operator='
does not check for self-assignment before allocating memory to a class member</strong></pre>
<p>The first warning is there because it is the convention that an assignment operator will return a reference to the target of the assignment. Such conventions exist so that all objects can be treated like primitive types, and to give the programmer more freedom to write intuitive code. For example:</p>
<pre>MyClass a,b,c;
(a = b) = c;
(a = c).f();</pre>
<p>The problem causing the second warning, is that self-assignment is generally perfectly legal code. For example:</p>
<pre>MyClass c;
c = c;</pre>
<p>However, calling a class&#8217; assignment operator on itself will cause problems if dynamic memory allocation takes place. In our assignment operator, we free the memory allocated to &#8216;xp&#8217;, before allocating a fresh store. If the class instance called the assignment operator on itself, then the memory that being copied from in the 4th line of the operator will also be fresh. This means that self-assignment will basically lead to the object being populated with uninitialized data, which is almost certainly not the intention of the programmer. To handle this, we simply need to ensure memory manipulation only takes place if &#8216;this&#8217; and the parameter refer to different instances of the class.</p>
<p>Our assignment operator must be altered to fix these two problems:</p>
<pre>25  //assignment operator
26  MyClass&amp; MyClass::operator=(const MyClass&amp; other){
27    if (this != &amp;other){  //check for self-assignment
28      delete[] xp;  //reallocate the memory in case the size has changed
29      xp = new int[ARR_INIT_SIZE];
30      for (int i=0; i!=ARR_INIT_SIZE; ++i){
31        xp[i] = other.xp[i];
32      }
33    }
34    return *this;  //return a reference to 'this'
35  }</pre>
<p>After these changes, Goanna will not give any more warnings, and the class will be very robust. Hopefully this has provided you with some insight to some of our copy control checks, and given you a quick revision on some of the important things to keep in mind when creating classes. We&#8217;re still trying to expand our range of C++ checks further, to include checks on the proper use of iterators, containers and exception handling, and many other constructs.</p>
<p>Here is our completed class:</p>
<pre>1   class MyClass {
2     public:
3       MyClass();                                 //constructor
4       MyClass(const MyClass&amp; other);             //copy constructor
5       MyClass&amp; operator=(const MyClass&amp; other);  //assignment operator
6       ~MyClass();                                //destructor
7     private:
8       static const int ARR_INIT_SIZE = 10;
9       int* xp;
10  };
11 
12  //default constructor
13  MyClass::MyClass(){
14    xp = new int[ARR_INIT_SIZE];
15    for (int i=0; i!=ARR_INIT_SIZE; ++i){
16      xp[i] = 0;
17    }
18  }
19 
20  //copy constructor
21  MyClass::MyClass(const MyClass&amp; other){
22    xp = new int[ARR_INIT_SIZE];
23    for (int i=0; i!=ARR_INIT_SIZE; ++i){
24      xp[i] = other.xp[i];
25    }
26  }
27 
28  //assignment operator
29  MyClass&amp; MyClass::operator=(const MyClass&amp; other){
30    if (this != &amp;other){  //check for self-assignment
31      delete[] xp;  //reallocate the memory in case the size has changed
32      xp = new int[ARR_INIT_SIZE];
33      for (int i=0; i!=ARR_INIT_SIZE; ++i){
34        xp[i] = other.xp[i];
35      }
36    }
37    return *this;  //return a reference to 'this'
38  }
39 
40  //destructor
41  MyClass::~MyClass(){
42    delete[] xp;
43  }</pre>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/development/copy-control-crash-course/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Experiments with F#</title>
		<link>http://redlizards.com/blog/uncategorized/experiments-with-f/</link>
		<comments>http://redlizards.com/blog/uncategorized/experiments-with-f/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 06:43:50 +0000</pubDate>
		<dc:creator>Paul</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[F#]]></category>

		<category><![CDATA[Ocaml]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=501</guid>
		<description><![CDATA[A couple of customers have asked for a command-line tool to run Goanna over their Visual Studio projects, similar to the way the Linux command-line tool works.  The difficult bit for such a tool is to translate the information in a project file to the appropriate arguments to the core Goanna executable, goannacc.exe on [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of customers have asked for a command-line tool to run Goanna over their Visual Studio projects, similar to the way the Linux command-line tool works.  The difficult bit for such a tool is to translate the information in a project file to the appropriate arguments to the core Goanna executable, goannacc.exe on Windows.  We already have code to do just that in the Visual Studio extension.</p>
<p>The Goanna VS extensions for VS2005/2008/2010 are written in C#, because there&#8217;s a wizard that generates a simple extension in C#.  From that starting point, we (meaning I) built the current extensions.  If there hadn&#8217;t been the wizard, I would have written the extensions in F#, because I prefer the functional style of programming.   So I decided to write the command-line tool, that was an opportunity to try out F# in earnest.  I&#8217;d written a wee bit of F# before; here was a chance to try it out on production code.</p>
<p>When writing the command-line tool, my main concern was, how easy would it be to pull in the C# code that does the project-to-command-line translation.  It was very easy: just add an F# project reference to the .DLL containing the code, open the namespace, and I was good to go.  I had to make some C# classes explicitly public for visibility, but that was the only change I needed to make.</p>
<p>Programming in F# is very much like programming in OCaml, a language I&#8217;ve used off and on for maybe 15 years.  Nice thing: instead of the clumsy &#8220;delegate&#8221; syntax of C#, you can just pass a function argument to another function.   Not so nice: in VS2010, the editor does not seem to auto-format F# code, the way it does with C# code (the Ctrl-E F magic).  And the editor&#8217;s Intellisense feature does not appear to suggest variable names that are in scope.  Also: although there are surely good reasons for it, the F# list type is distinct from the C#/.Net System.Collections list type, which is slightly maddening.  Finally: I have to build the tool for the various VS versions in slightly different ways, and the conditional compilation facility works for that &#8212; but why are there no boolean operations allowed, as you have in C#?</p>
<p>Here&#8217;s an example of code that uses .Net lists instead of F# lists:</p>
<pre>
  let expandedProjs = new System.Collections.Generic.List<EnvDTE.Project>() in
  while projsIter.MoveNext() do
    expandedProjs.AddRange(ProjectUtil.expandProject(projsIter.Current :?> EnvDTE.Project))
  done;
</pre>
<p>Ooof.</p>
<p>When the command-line tool starts, it fires up an instance of Visual Studio, no GUI.  That way it can get information about solutions and projects from VS, like default include paths and configuration information, using code originally written for the extensions.  Sometimes the calls to VS fail with COM retry errors, so those calls are done in a loop containing a try-with block.  When the tool finishes, or the user hits Ctrl-C, it gracefully shuts down VS.  I often run the tool from a Cygwin shell, and I haven&#8217;t yet found a way to trap Cygwin SIGKILL signals, so that VS is still running afterwards.</p>
<p>There&#8217;s still some work to do on the command-line tool, like deciding what kind of output it should produce, but it&#8217;s basically there.  Let me know if you&#8217;d like to try it out before we make it generally available.   The tool is tentatively called &#8220;GoRun&#8221;, and its syntax is:</p>
<pre>
  GoRun sln-file [projName ...] ...
</pre>
<p>That is, you supply one or more solution files, and for each solution file, zero or more project names.  If you don&#8217;t supply project names, GoRun invokes Goanna on all the projects in the solution, otherwise only those specified.</p>
<p>A complaint: Soon after VS2010 was released, the MSDN site was updated with all-new documentation for the .Net libraries. But the only language there&#8217;s documentation for is C# (OK, sometimes J#) .  In the type signatures, there are no hyperlinks for keywords (like public, final, etc.) and types.  You can&#8217;t tell when a type is really a forall-quantified type variable.  It wouldn&#8217;t be much harder to do these pages right.</p>
<p>One last comment: programming in F# doesn&#8217;t feel all that different than programming in C#, though the code is more concise.  You definitely feel the presence of .Net every step of the way, and there&#8217;s statefulness lurking everywhere.  Functional programming for the masses &#8230; sort of!</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/uncategorized/experiments-with-f/feed/</wfw:commentRss>
		</item>
		<item>
		<title>When is a for loop like a do .. while loop?</title>
		<link>http://redlizards.com/blog/uncategorized/when-is-a-for-loop-like-a-do-while-loop/</link>
		<comments>http://redlizards.com/blog/uncategorized/when-is-a-for-loop-like-a-do-while-loop/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 04:14:48 +0000</pubDate>
		<dc:creator>Mark Bradley</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[Goanna]]></category>

		<category><![CDATA[static analysis]]></category>

		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=493</guid>
		<description><![CDATA[At Red Lizard Software, we care about providing the most accurate static analysis for your cpu cycle. Therefore, we spend a lot of our time thinking about the nature of false positives (when Goanna gives a warning about completely reasonable code) and how to avoid them.
One class of false positives we have noticed recently happens [...]]]></description>
			<content:encoded><![CDATA[<p>At Red Lizard Software, we care about providing the most accurate static analysis for your cpu cycle. Therefore, we spend a lot of our time thinking about the nature of false positives (when Goanna gives a warning about completely reasonable code) and how to avoid them.</p>
<p>One class of false positives we have noticed recently happens when you want to warn about an action that must occur on all execution paths.  These properties might be expressed as &#8220;you must initialise all variables on all paths before accessing their values&#8221; for some definitions of initialise and access.  A problem with these kinds of requirements appears when the initialisation of a variable is performed within a looping construct, and then access after the loop.  This loop is usually designed to execute at least once (thus initialising the variable at least once) and so the programmer knows that the access after the loop is perfectly valid.  Goanna has historically not been very good at identifying this false positive and will often warn anyway because there is an execution path that might not initialise the variable, the path where the condition evaluates to false.  This is probably a case where the programmer should have used a do .. while loop to convey the desired semantics of the loop, but given that do .. while loops are not as popular as for loops, Goanna needs to be able to deal with this scenario.</p>
<p>There are two steps to making Goanna more intelligent about loops.  The first step is identifying when a for or while loop should be represented as a do .. while, and the second is presenting this information to Goannas internal analysis engine.</p>
<p>In order to determine that a loop will execute at least once, it may be simpler to ask the inverse question.  When will a loop <strong>not</strong> execute at least once?  A sub question of this is when will we not know if a loop can execute at least once?  This is actually much easier to answer because it can be boiled down to a structural condition.  If the condition of the loop contains global variable references or function calls, then it is almost impossible to determine if a loop will execute only once.  So what is left?  Loops that contain only literals and local variable references.  Parameters are a trickier issue since each call to the function is potentially different.  With additional interprocedural analysis it may be possible to determine the boundaries of function parameters accurately but at present these loops can be ignored as well.  The only thing left to do is to determine the state of the variables used in the loop condition right before it is evaluated and then evaluate the condition.</p>
<p>The analysis engine of Goanna works upon what is known as a control flow graph.  This graph is created by looking at the source tree and determining which operations happen in which order.  So the best way to present this modification of a for loop is through modifications to the control flow graph.  Specifically we would like to create a copy of the control flow graph of the loops condition and wire up the rest of the graph such that there is a direct path through this path to the body of the for loop.  The graph must also go into this new condition instead of into the old condition in order for the modification to be complete.</p>
<p>After implementing this change we have noticed that there is a small drop in the number of certain types of false positives, specifically in the SPC-uninit-var-some, with no impact on the runtime performance of the Goanna analysis engine.  We hope to roll this improvement into the next release of the Goanna static analysis product line.</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/uncategorized/when-is-a-for-loop-like-a-do-while-loop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goanna Command Style</title>
		<link>http://redlizards.com/blog/uncategorized/goanna-command-style/</link>
		<comments>http://redlizards.com/blog/uncategorized/goanna-command-style/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 03:40:57 +0000</pubDate>
		<dc:creator>Ansgar</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[General]]></category>

		<category><![CDATA[cmd line]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=481</guid>
		<description><![CDATA[Most users will use Goanna integrated into their development environment, either Visual Studio or Eclipse. However, we also have a command line version called Goanna Central. Since I am mostly working on the analysis engine this is the version I use most often.  And part of this entails to find open source projects and [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Most users will use Goanna integrated into their development environment, either Visual Studio or Eclipse. However, we also have a command line version called Goanna Central. Since I am mostly working on the analysis engine this is the version I use most often.  And part of this entails to find open source projects and run Goanna over it. So, if you have an open source project, we might be watching you :)</p>
<p align="justify">Most open source projects provide configure scripts to generate makefiles. If that is the case using Goanna is a matter of configuring it with Goanna. There are two executables, <tt>goannacc</tt> and <tt>goannac++</tt>, that behave like <tt>gcc</tt> and <tt>g++</tt>. Configuring then just means to execute:</p>
<blockquote><p><tt>goanna@KITTYHAWK:~$ ./configure CC=goannacc CXX=goannac++</tt></p></blockquote>
<p>After this you can <tt>make</tt> you project as you are used to, with the difference that you will get feedback from Goanna.</p>
<p align="justify">Sometimes open source project do not provide a configure script. Last week I got my hands on an open source model checker - it is always some guilty pleasure to model check a model checker - and this project only included a makefile. Once all the necessary libraries were installed - the once provided were incompatible with my machine - such that the project could be build with <tt>g++</tt>, all that remained was to edit the <tt>makefile</tt>. It is always exciting to edit a file that says right at the top: <tt>Automatically-generated file. Do not edit!</tt>. To use Goanna required to find all occurrences of, in this case, <tt>g++</tt> and replace them with <tt>goannac++</tt>. And then to <tt>make</tt> the project.</p>
<p align="justify">The output looks like this:</p>
<blockquote><p><tt>Building file: ../src/Ned.cpp<br />
Invoking: GCC C++ Compiler<br />
goannac++ -DDEBUG -I../include -O0 -g3 -Wall  -c -fmessage-length=0 -Wextra -MMD -MP -MF&#8221;src/Ned.d&#8221;<br />
Goanna - analyzing file ../src/Ned.cpp<br />
Number of functions: 3<br />
../src/Ned.cpp:28: warning: Goanna[COP-assign-op] Missing assignment operator for class `Ned&#8217; which uses dynamic memory allocation<br />
../src/Ned.cpp:28: warning: Goanna[COP-copy-ctor] Missing copy constructor for class `Ned&#8217; which uses dynamic memory allocation<br />
Total runtime : 6.65 seconds</tt></p></blockquote>
<p>That was about all it took. BTW: Kittyhawk is the name of my machine, and it is aptly named.</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/uncategorized/goanna-command-style/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goanna Studio 2.0</title>
		<link>http://redlizards.com/blog/uncategorized/goanna-studio-20/</link>
		<comments>http://redlizards.com/blog/uncategorized/goanna-studio-20/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 03:48:47 +0000</pubDate>
		<dc:creator>Ralf</dc:creator>
		
		<category><![CDATA[General]]></category>

		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Goanna]]></category>

		<category><![CDATA[static analysis]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=436</guid>
		<description><![CDATA[It is out! We just released a major upgrade to Goanna Studio version 2.0. There has been a lot of work going into the new version and some of the new key features include:

Full (whole program) interprocedural analysis to track effects across functions and files
Incremental analysis to minimize time for reanalyzing files/projects
Around 100 classes of [...]]]></description>
			<content:encoded><![CDATA[<p>It is out! We just released a major upgrade to Goanna Studio version 2.0. There has been a lot of work going into the new version and some of the new key features include:</p>
<ul>
<li>Full (whole program) interprocedural analysis to track effects across functions and files</li>
<li>Incremental analysis to minimize time for reanalyzing files/projects</li>
<li>Around 100 classes of checks, up almost 70% compared to the previous release</li>
<li>Much improved precision and elimination of some existing false positives</li>
<li>Improved Path Simulator to display error traces</li>
<li>New project reporting mechanism and export facilities</li>
</ul>
<p>For existing customers:</p>
<ul>
<li>We are also happy to announce that all existing customers have the possibility to upgrade to 2.0 free of charge!</li>
<li>If you were a trial user in the past and need a trial extension visit: <a href="http://redlizards.com/trial-extension">http://redlizards.com/trial-extension</a></li>
</ul>
<p>Overall, the new version is another leap forward and enables to  detect more and deeper critical issues early in the development cycle.</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/uncategorized/goanna-studio-20/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goanna 1.4 release</title>
		<link>http://redlizards.com/blog/uncategorized/goanna-14-release/</link>
		<comments>http://redlizards.com/blog/uncategorized/goanna-14-release/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 06:10:58 +0000</pubDate>
		<dc:creator>Ralf</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=428</guid>
		<description><![CDATA[We are happy to announce a new release of our Goanna static analysis solution. After a previous release for Visual Studio 2010 we are now bringing new technology with new benefits to all our products:
Some of the advances include:

up to 300% speed improvement through improved core analysis engine
even less false positives due to improved check [...]]]></description>
			<content:encoded><![CDATA[<p>We are happy to announce a new release of our Goanna static analysis solution. After a previous release for Visual Studio 2010 we are now bringing new technology with new benefits to all our products:</p>
<p>Some of the advances include:</p>
<ul>
<li>up to 300% speed improvement through improved core analysis engine</li>
<li>even less false positives due to improved check accuracy</li>
<li>updated output format to easier identify critical issues</li>
<li>32-/64-bit cross-compilation support in Visual Studio</li>
<li>support of Visual Studio property sheets</li>
<li>initial support of new C++0x standard (&#8221;auto&#8221; and other features)</li>
</ul>
<p>If you like to test the new features and require a 30 day Trial Extension for your current Goanna version please complete this <a href="/trial-extension">trial extension request  form</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/uncategorized/goanna-14-release/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goanna 1.2 released</title>
		<link>http://redlizards.com/blog/development/goanna-12-released/</link>
		<comments>http://redlizards.com/blog/development/goanna-12-released/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 10:50:09 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[cmd line]]></category>

		<category><![CDATA[gcc]]></category>

		<category><![CDATA[Goanna]]></category>

		<category><![CDATA[static analysis]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=420</guid>
		<description><![CDATA[Goanna version 1.2 has been released. Download it now.
The major change is More Checks, in fact 40% more than were previously available in v1.1. Over the next few months we will continue to add new checks with each release. You can expect to see up to 100 additional high quality checks within the coming 6 [...]]]></description>
			<content:encoded><![CDATA[<p>Goanna version 1.2 has been released. <a href="http://redlizards.com/download.html">Download</a> it now.</p>
<p>The major change is More Checks, in fact 40% more than were previously available in v1.1. Over the next few months we will continue to add new checks with each release. You can expect to see up to 100 additional high quality checks within the coming 6 months, which as usual will be free for all existing customers. Additionally, should you require a 30 day Trial Extension for your version 1.2 update please complete this <a href="http://redlizards.com/trial-extension">trial extension request form</a>.</p>
<p>We are also very pleased to announce the Beta release of <a href="http://redlizards.com/download.html">Goanna for Command Line</a>. This new command line version enables more flexibility and freedom for those wishing to integrate our powerful C/C++ static analyzer into their own development process. The Beta is currently available for Linux users and a version for Windows users is scheduled to be available in May. Linux users can now access a fully gcc-compatible solution integrated with over 60 classes of flow-sensitive quality checks to detect critical bugs as early as possible in the development cycle.</p>
<p>Inter-procedural analysis is also well under way, so stay tuned for a public Beta release soon!</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/development/goanna-12-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Visual Studio 2010</title>
		<link>http://redlizards.com/blog/development/visual-studio-2010/</link>
		<comments>http://redlizards.com/blog/development/visual-studio-2010/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 01:42:10 +0000</pubDate>
		<dc:creator>James</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[2010]]></category>

		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Goanna]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[static analysis]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=411</guid>
		<description><![CDATA[We&#8217;re proud to have been selected for simultaneous shipment of our Goanna static analysis extension with Microsoft Visual Studio 2010. Here is a short introductory video demonstrating our Visual Studio 2010 integration, and we&#8217;re on schedule for April release:

We have some further news regarding recent developments (more high quality checks being one) and we&#8217;ll be [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re proud to have been selected for simultaneous shipment of our Goanna static analysis extension with Microsoft Visual Studio 2010. Here is a short introductory video demonstrating our Visual Studio 2010 integration, and we&#8217;re on schedule for April release:</p>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/o_9etnSDJws&#038;hl=en_US&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/o_9etnSDJws&#038;hl=en_US&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
<p>We have some further news regarding recent developments (more high quality checks being one) and we&#8217;ll be posting more information next week.</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/development/visual-studio-2010/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goanna 1.1 release</title>
		<link>http://redlizards.com/blog/development/goanna-11-release/</link>
		<comments>http://redlizards.com/blog/development/goanna-11-release/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 03:52:44 +0000</pubDate>
		<dc:creator>David Crawshaw</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[C/C++]]></category>

		<category><![CDATA[Goanna]]></category>

		<category><![CDATA[static analysis]]></category>

		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=382</guid>
		<description><![CDATA[Goanna for Visual Studio 1.1 has been released. Download  it now. Changes include:
Fixed a constructor initialization false positive.
Fixed several unused variable false positives related to complex types in C++.
Include paths can now end in a backslash.
Accelerator keys: Alt+F1 (run Goanna on the Solution) and Alt+F2 (Run Goanna on the active project).
Several new checks, including:
Comparison never [...]]]></description>
			<content:encoded><![CDATA[<p>Goanna for Visual Studio 1.1 has been released. <a href="http://redlizards.com/download.html">Download</a>  it now. Changes include:</p>
<p style="PADDING-LEFT: 30px">Fixed a constructor initialization false positive.</p>
<p style="PADDING-LEFT: 30px">Fixed several unused variable false positives related to complex types in C++.</p>
<p style="PADDING-LEFT: 30px">Include paths can now end in a backslash.</p>
<p style="PADDING-LEFT: 30px">Accelerator keys: Alt+F1 (run Goanna on the Solution) and Alt+F2 (Run Goanna on the active project).</p>
<p style="PADDING-LEFT: 30px">Several new checks, including:</p>
<p style="PADDING-LEFT: 60px">Comparison never holds</p>
<p style="PADDING-LEFT: 60px">Comparison always holds</p>
<p style="PADDING-LEFT: 60px">Switch case is unreachable</p>
<p style="PADDING-LEFT: 60px">Expanded the interval analysis.</p>
<p style="PADDING-LEFT: 30px">Checks are now organized by category in the settings dialog.</p>
<p style="PADDING-LEFT: 30px">Underlining (&#8221;Squiggles&#8221;) of warning-relevant code in the Visual Studio text editor.</p>
<p style="PADDING-LEFT: 30px">Statistics page for monitoring Goanna&#8217;s progress.</p>
<p style="PADDING-LEFT: 30px">Analysis of assert() statements for variable bounds.</p>
<p style="PADDING-LEFT: 30px">Improved traces.</p>
<p>Much more internal work has been done, laying the groundwork for inter-procedural analysis and user-defined checks. Visual Studio 2010 support is well underway.</p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/development/goanna-11-release/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Goanna statistics</title>
		<link>http://redlizards.com/blog/uncategorized/goanna-statistics/</link>
		<comments>http://redlizards.com/blog/uncategorized/goanna-statistics/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 23:20:25 +0000</pubDate>
		<dc:creator>David Crawshaw</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://redlizards.com/blog/?p=374</guid>
		<description><![CDATA[Another new Goanna feature is operational feedback. While Goanna is analyzing your source files, you can check to see exactly what is being done. Just select the new Goanna Statistics button from the Tool menu:

]]></description>
			<content:encoded><![CDATA[<p>Another new Goanna feature is operational feedback. While Goanna is analyzing your source files, you can check to see exactly what is being done. Just select the new <b>Goanna Statistics</b> button from the Tool menu:</p>
<p><img src="http://redlizards.com/blog/wp-content/uploads/2009/10/goanna-statistics1.png" alt="Goanna Statistics Panel" title="Goanna Statistics Panel" width="532" height="681" class="alignnone size-full wp-image-377" /></p>
]]></content:encoded>
			<wfw:commentRss>http://redlizards.com/blog/uncategorized/goanna-statistics/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
