Der PVS-Studio-Analysator wird regelmäßig mit neuen Diagnoseregeln aktualisiert. Interessanterweise erkennt die Diagnose häufig verdächtige Codefragmente vor dem Ende aller Arbeiten. Zum Beispiel beim Testen von Open-Source-Projekten. Eine dieser interessanten 'Funde' möchte ich heute mit Ihnen teilen.
Wie oben erwähnt, besteht eine der Phasen des Testens einer Diagnoseregel darin, ihren Betrieb auf einer realen Codebasis zu überprüfen. Hierzu wird eine Reihe ausgewählter Open-Source-Projekte verwendet, für die die Analyse durchgeführt wird. Der offensichtliche Vorteil dieses Ansatzes ist die Fähigkeit zu sehen, wie sich die Diagnoseregel unter "realen Bedingungen" verhält. Weniger offensichtlich - manchmal ist etwas so interessant, dass es keine Sünde ist, eine Notiz darüber zu schreiben.
Also schlage ich vor, den Code aus dem C # -Projekt von Bouncy Castle zu betrachten und einen Fehler darin zu finden:
public static string ToString(object[] a)
{
StringBuilder sb = new StringBuilder('[');
if (a.Length > 0)
{
sb.Append(a[0]);
for (int index = 1; index < a.Length; ++index)
{
sb.Append(", ").Append(a[index]);
}
}
sb.Append(']');
return sb.ToString();
}
Für diejenigen, die gerne neugierig sind, habe ich ein Bild hinzugefügt, um die Intrigen zu bewahren.
Ich bin sicher, dass viele den Fehler nicht finden konnten, ohne die IDE oder Dokumentation für die StringBuilder- Klasse zu öffnen . Der Fehler wurde beim Aufrufen des Konstruktors gemacht:
StringBuilder sb = new StringBuilder('[');
, PVS-Studio: V3165 Character literal '[' is passed as an argument of the 'Int32' type whereas similar overload with the string parameter exists. Perhaps, a string literal should be used instead. Arrays.cs 193.
StringBuilder, '['. - 91 , .
- , , :
....
public StringBuilder(int capacity);
public StringBuilder(string? value);
....
'[' int (91 Unicode). int, . , .
(.. "[", '['), .
, . , , char, , , .
, , PVS-Studio 7.11. V3165, C, C++, C# Java.
, . - Krypt Habr. - !
P.S. . , - , .
, : Valery Komarov. C# Programmer, It's Time to Test Yourself and Find Error.