GSoC/GCI Archive
Google Code-in 2010 Mono Project

Two (2) Gendarme rules on rules

completed by: Yuri Stuken

mentors: spouliot

Background

Gendarme is a static analysis tool to find problems in .NET software. Gendarme inspects executables and libraries that contain code in ECMA CIL format (Mono and .NET) and looks for common problems with the code, problems that compiler do not typically check or have not historically checked.

 

Task

The task is to write two Gendarme rules that implements the following logic:

(1) DoNotThrowExceptionRule

Rules should not throw exceptions since the runner cannot be certain about the state (e.g. cache corruption) once it catch the exception (i.e. can it continue? will the results only be incomplete ? or totally invalid). As such the exceptions (from the framework / rocks) are considered to be terminal (e.g. console runner) or will warn the user not to fully trust the defects (e.g. wizard runner).

(2) UseCorrectSuffixRule

Types implementing IRule should have a name that ends with 'Rule'. Other types must *not* end with 'Rule'.

Both new rules should be part of the new Gendarme.Rules.Gendarme.dll assembly.

 

Deliverables

To complete the task the student must provide:

*  the rules, written in C#. The source code must follow the Mono source code guidelines (available at http://www.mono-project.com/Coding_Guidelines). Also a 'self-check' must be done one the code (i.e. you need to run gendarme on your own code) and the defects, if any, must be fixed (in doubt please ask for guidance on IRC).

* its documentation (in-source xmldoc) that includes 'good' and 'bad' examples; and

* the unit tests (also in C# using the gendarme helpers around NUnit) proving the rule is working as intended

* a patch to fix all such issues (if any) in Gendarme rules

Once ready the files (or the patch) can be submitted to the mentor for review.

 

Hints

* In order to avoid misunderstandings you should start by writing your unit tests and ask for a review of them. That will quickly tell you if you're on the right path to solve the problem.

* Gendarme provides hundreds of rules that can be used as example, here's one

rule: https://github.com/mono/mono-tools/blob/master/gendarme/rules/Gendarme.Rules.Interoperability/PInvokeShouldNotBeVisibleRule.cs

tests: https://github.com/mono/mono-tools/blob/master/gendarme/rules/Gendarme.Rules.Interoperability/Test/PInvokeShouldNotBeVisibleTest.cs

 

Resources

* Gendarme web site: http://www.mono-project.com/Gendarme

* Mailing-list / discussions: http://groups.google.com/group/gendarme

* IRC: #gendarme on GimpNET