8

Ich arbeite an einem Berechnungsmodul C#, und ich auf diese gestoßen:Wie wird vor möglichen arithmetischen Fehlern aufgrund von Typkonvertierung gewarnt?

double v = 4/100; 

Ich weiß, dass dies eine falsche Initialisierung ist die v = 0.0 statt v = 0.04

C# Regeln kehrt sagt, ich muss gewährleisten mindestens eines der Element ein Doppel, wie folgt aus:

double v = (double) 4/100; 
double v = 4.0/100; 

Allerdings habe ich viele viele Initialisierungen dieser Art haben, dass beinhaltet Integer-Variablen-Operationen, und ich bin faul, meinen Code Zeile für Zeile zu durchsuchen, um solche Fehler zu erkennen.

Stattdessen ist es möglich, durch den Compiler darüber gewarnt zu werden?

+0

Es hängt davon ab, welchen Compiler Sie verwenden. Die Fehlermeldungen und Warnungen sind keine integrierte Funktion der Sprache, sondern etwas, das der Compiler hinzufügt. Wenn der von Ihnen verwendete Compiler dies nicht unterstützt, dann ist dies nicht möglich. – Hoeloe

+1

Es gibt ein [Benutzervoice-Ticket] (http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2813345-add-a-warning-when-promoting-the-result-of-integer), das fragt für diese Funktion. –

+0

Ich verwende den C# -Compiler, der mit .NET 4.0 und Visual Studio 2010 bereitgestellt wird. – Larry

Antwort

4

Okay, nach einigen herumgespielt und was nicht, habe ich eine Lösung. Ich habe this article verwendet, um zu dieser Lösung zu kommen. Ich benutze StyleCop, also müssen Sie das bekommen und installieren. Dann können Sie mein C# -Projekt MathematicsAnalyzer herunterladen.

Zunächst einmal, ich habe nicht für alle Typkonversion Mismatches berücksichtigt. Tatsächlich unterhalte ich nur einen Teil.

Grundsätzlich überprüfe ich, ob die Zeile "Doppel" gefolgt von einem Leerzeichen enthält. Ich weiß, dass das zu falschen Warnungen führen könnte, weil das Ende einer Klasse doppelt sein könnte oder eine beliebige Anzahl anderer Dinge, aber ich überlasse es Ihnen, herauszufinden, wie man den Typ richtig isoliert.

Wenn eine Übereinstimmung gefunden wird, überprüfe ich, um zu sehen, dass es diese Regex passt:

double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;) 

Ist dies der Fall -not- diese Regex übereinstimmen, dann füge ich eine Verletzung. Was dieser Regex entspricht, ist einer der folgenden Punkte:

  • doppelt i = 4d/100;
  • doppelt i = 4d/100;
  • doppelt i = 4/100d;
  • doppelt i = 4/100d;
  • doppelt i = 4/100d;
  • doppelt i = 4/100d;
  • doppelt i = 4d/100;
  • doppelt i = 4/100d;
  • doppelt i = 4/100d;

Alle oben genannten werden keinen Verstoß erstellen. Wie es derzeit geschrieben wird, wird ziemlich viel, wenn ein "d" nicht verwendet wird, einen Verstoß auslösen. Sie müssen zusätzliche Logik hinzufügen, um die anderen Möglichkeiten zum expliziten Umwandeln eines Operanden zu berücksichtigen. Während ich dies schreibe, habe ich gerade festgestellt, dass ein "d" auf beiden Operanden höchstwahrscheinlich eine Ausnahme auslösen wird. Hoppla.

Und schließlich konnte ich nicht StyleCop, um meine Verletzung richtig anzuzeigen. Es gab mir einen Fehler bezüglich der Regel, die nicht existierte, und selbst mit einem zweiten Augenpaar konnten wir keine Lösung finden, also habe ich es gehackt. Der Fehler zeigt den Namen der Regel an, die Sie suchen wollten. Daher habe ich den Namen der Regel als etwas Beschreibendes angegeben und die Zeilennummer darin eingefügt.

Um die benutzerdefinierte Regel zu installieren, erstellen Sie das MathematicalAnalyzer-Projekt. Schließen Sie Visual Studio, und kopieren Sie die DLL in das StyleCop-Installationsverzeichnis. Wenn Sie Visual Studio öffnen, sollten Sie die Regel in den StyleCop-Einstellungen sehen. Schritt 5 und 6 des Artikels, den ich verwendet habe, zeigen, wo das zu tun ist.

Dies wird immer nur eine Verletzung in der gesamten Lösung, so müssen Sie die Verletzung, die es zeigt, beheben und StyleCop erneut ausführen, um die nächste zu finden. Es mag einen Weg geben, aber ich hatte keinen Saft mehr und bin hier geblieben.

Viel Spaß!

+0

Vielen Dank. Es ist nicht perfekt, aber es hilft sehr. – Larry

3

In diesem Artikel wird erläutert, wie benutzerdefinierte Codeanalyse-Regeln eingerichtet werden, die beim Ausführen von Code Analysis Warnungen anzeigen können und welche nicht.

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/

+0

Vielen Dank für diese Information. Leider wird es nicht einfach sein, eine benutzerdefinierte Regel zu implementieren, die meinen Code für diesen Typkonvertierungsfehler analysiert. – Larry

+0

verstehe ich vollständig. Ich habe darüber nachgedacht, aber es ist der einzige Weg, den ich in meinen Nachforschungen finden könnte. – seekerOfKnowledge

Verwandte Themen