Automatische Compiler-Erkennung des Hinzufügens derselben Objektinstanz zu einem Container in einer Schleife

StackOverflow https://stackoverflow.com/questions/1465486

Frage

Das ist ein dummer Fehler:

List<Foo> fooList = new List<Foo>();
Foo f = new Foo();
while (something.Read()) {
    f.Fill(something.GetRecord());
    fooList.Add(f);
}

Natürlich sollte ich ein neues Foo innerhalb der Schleife instanziieren.

Kann ein Compiler solche Fehler zur Kompilierungszeit erkennen?

Für naive Augen sieht es so aus, als ob es in der Lage sein sollte, dieses Verhalten zu erkennen (Füllen einer Liste mit Instanzen desselben Objekts in einer Schleife).Es sollte dann eine Warnung wie „Sie füllen einen Container mehr als einmal mit derselben Instanz“ ausgeben.

Wie naiv bin ich also?Kennen Sie eine Sprache, in der es so etwas gibt?

War es hilfreich?

Lösung

Ja, das ist möglich.

Allerdings glaube ich nicht, dass ein Tool oder Compiler selbst davor warnen würde, Sie müssten also ein Tool verwenden, das mit Ihren eigenen Analysen erweitert werden kann.Für Java, FindBugs ist so ein Werkzeug.Für C, C++ usw. gcc 4.5 erlaubt Plugins damit die Leute ihre eigenen Erweiterungen schreiben können, und klirren von LLVM ist auch dafür konzipiert.Es gibt auch Dehydra von Mozilla, wiederum für C++.Für MS-Sprachen gibt es die Phoenix-Framework.

Die Frage ist also: Wie schreibt man diese Analyse?Das ist etwas kniffliger und hängt vom Werkzeug ab.Aber grundsätzlich:

  • Sie können Schleifen ziemlich leicht erkennen (suchen Sie nach „Stark verbundene Komponenten“).
  • Die Alias-Analyse kann Ihnen sagen, ob sich eine bestimmte Variable oder ein bestimmter Parameter auf nur ein Objekt oder auf viele Objekte bezieht (suchen Sie möglicherweise nach „abstrakten Objekten“).
  • Mithilfe des statischen Typs eines Objekts oder einer Variablen können Sie den richtigen Container finden.

So können Sie einen Anruf ganz einfach erkennen List<>.append(x) in einer Schleife, wobei x nur auf ein Objekt verweisen kann.

Andere Tipps

Was ist, wenn Sie eine Liste <> mit mehreren Instanzen eines Objekts füllen möchten? Müssen Sie Ihren Code mit dekorieren #pragma Also lässt dich der Compiler in Ruhe?

Wie würden Sie überhaupt eine Klasse für solche Einschränkungen erklären? List <> ist wirklich nichts anderes als eine C# -Klasse. Sie können mscorlib.dll dekompilieren und die vollständige Implementierung sehen. Um diese Art von Wissen zu haben, müsste es irgendwo hart codiert werden. Attribute? Das wäre unglaublich einschränkend. Spezielle Methoden zur Validierung Ihres Codes? Würde Ihren Objekten Overhead hinzufügen.

Diese Art von Dingen wird niemals aus einem bestimmten Grund verwendet (und ich meine nie): die extrem geringe Anzahl von Fällen, in denen es hilfreich ist, anstatt zu behindern Framework selbst und von Ihrem Code) und Leistungshits (von überlebten Objekten, die sich so wie der GC um den Speicher bewegt haben müssen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top