Smokey 1.2 - assembly analyzer
Jesse Jones <[email protected]> Mon, 19 May 2008 23:45:55 -0700
| Newsgroups | gmane.comp.gnome.mono.announce |
|---|---|
| Message-ID | <[email protected]> |
Smokey is a command line tool used to analyze assemblies and report problems. Problems include buggy code (e.g. infinite recursion, null deref, malformed format string), performance issues (e.g. string concatenation in loops, excessive boxing, large structs), violations of the .NET design guidelines (e.g. inheriting from ApplicationException or ICloneable, naming, and swallowing exceptions), and miscellaneous rules like misspelled words in string literals. You can download Smokey from the web site: <http://code.google.com/p/smokey/>. The web site also has an html report for one of the System assemblies and a list of all of Smokey's rules. This release of Smokey has 212 rules which is more than FxCop and twice as many as Gendarme. I've also moved the project to googlecode and added some additional documentation on the associated wiki. Changes from Smokey 1.1.0.0: * Added 34 new rules: ArithmeticButNoEquals, a type overloads the addition and subtraction operators, but does not override Equals(object). AvoidIsAlive, System.WeakReference::IsAlive was used. BadExplicitImplementation, explicit interface implementation has no alternative method. DisposeDoesStaticRemove, Dispose does a remove from a static collection. DoubleCheckedLocking, wrong or inefficient double checked locking code. FloatZeroDivide, floating point divide by zero. FormatProvider, call the overload with an IFormatProvider. InconsistentNamespace, a type's namespace matches a sibling directory name. InconsistentProperty, trivial property uses one field for getter and a different one for the setter. IntZeroDivide, integer divide by zero. NewVersion, newer version of Smokey is available. NonLocalizedGui, selected gui method was called with a string literal. NoStaticRemove, elements are never removed from a static collection. NotSealed, class can be sealed but isn't. ObjectDisposedException, IDisposable but doesn't throw ObjectDisposedException. PreferMonitor1, prefer monitor pattern to events. PreferMonitor2, prefer monitor pattern to mutex and semaphore. PublicImplementation, methods in an implementation class should be private instead of public. RecursiveLock1, lock was used recursively. RecursiveLock2, delegate or event was called while a lock was held. SealedProtected, a sealed type declares a new protected member. StringUri1, add an overload that takes a Uri. StringUri2, use Uri instead of string for the property. StringUri3, use Uri instead of string for the method result. StringUriOverload, string method should call the uri overload. UnprotectedEvent, event is fired without checking to see if it's null. UnusualMonitor1, System.Monitor.Wait was called without looping. UnusualMonitor2, System.Monitor.Wait was called without looping. UnusedField, internal field is never used. UseEmpty, a type with a public Empty field was default constructed UseEmptyTypes, a zero length array of System.Type was created. ValidateArgs, externally visible method doesn't check an arg for null. VisiblePInvoke, p/invoke method is externally visible. ZeroSleep, Sleep was called with a zero duration. * Added support for a -profile command line switch. These act like named sets of command line options. Currently the only supported profile is "system" which sets a bunch of options suitable for analyzing system assemblies. Custom profiles may be added via the config file. See the wiki on googlecode for details. * Added a -not-localized command line switch to disable a handful of rules if the assembly is not localized. * Added -include-check, -include-name, -include-breaking, and - include-localized command line switches to enable profile options to be overridden. * ignoreList config setting is now deprecated: use the new dictionary setting instead which supports multiple user dictionaries. * User dictionaries are now handled by aspell and words-with-dashes are split on the dashes before spell checking. Any words with dashes should be removed from user dictionaries. * The SysIgnore.txt dictionary is now a Smokey resource and can be accessed with a path like "/resources/SysIgnore.txt". * tar destfile's include the version number so that they unpack to a reasonable directory name. * install.sh won't overwrite smokey.exe.config if it already exists. * MonoNamingRule complains if fields start with m_, s_, or ms_. * EqualityOperatorRule ignores private structs. * UnusedMethodRule ignores ctors if one of the types in the declaring type's hierarchy has disabled UnusedClassRule. * Made ClassPrefixRule and HungarianRule nitpicks. * IgnoredReturnRule skips some more system methods. * Compiler generated types are now processed. Among other things this means that we don't report methods as unused if they are only used from anonymous methods. * ExitCodeRule works with local variables returned by the main entry point. * ClassPrefixRule ignores classes that start with "I". * Fixed a silly bug that sometimes kept UnusedMethodRule from reporting the results. * UseBaseTypesRule ignores parameters with generic types (they aren't handled quite right by the rule). * UseBaseTypesRule special cases base types that start with _, notably _Exception and _Type. * Main no longer returns negative ints. -- Jesse _______________________________________________ Mono-announce-list maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-announce-list