35 Stimmen

Werkzeug zum Auffinden von C-Style Casts

Kennt jemand ein Tool, das ich verwenden kann, um explizite C-Stil Casts in Code zu finden? Ich bin refactoring einige C++-Code und wollen C-Stil Casts ersetzen, wo immer möglich.

Ein Beispiel für einen C-Style-Cast wäre:

Foo foo = (Foo) bar;

Im Gegensatz dazu wären Beispiele für C++-artige Casts:

Foo foo = static_cast<Foo>(bar);
Foo foo = reinterpret_cast<Foo>(bar);
Foo foo = const_cast<Foo>(bar);

1 Stimmen

Ein Typ in Klammern, z. B. (int)f

0 Stimmen

Oh, ok - er kontrastiert mit dem C++-Stil. Ich weiß so gut wie nichts über C++, außer dem, was ich über C weiß.

37voto

jonner Punkte 5933

Wenn Sie gcc/g++ verwenden, aktivieren Sie einfach eine Warnung für C-ähnliche Casts:

g++ -Wold-style-cast ...

5 Stimmen

+1 Verwenden Sie das beste Werkzeug und den einfachsten Ansatz für die Aufgabe ... wenn das funktioniert.

2 Stimmen

9voto

sth Punkte 210180

Suche nach dem regulären Ausdruck \)\w liefert überraschend gute Ergebnisse.

4 Stimmen

Das funktioniert nur, wenn Sie die Besetzung neben die Variable setzen... was Sie immer tun SOLLTEN, aber nicht jeder tut es.

1 Stimmen

Ich habe mit \(\w+ ?\*?\) ?\w aber Vorsicht vor falsch positiven Ergebnissen.

1 Stimmen

(?<!Copyright )\(\w+ ?\*?\) ?\w - fand dies nützlicher.

8voto

Die Tatsache, dass die Suche nach solchen Gussformen so schwierig ist, ist einer der Gründe, warum die neuen Gussformen überhaupt erst eingeführt wurden. Und wenn Ihr Code funktioniert, scheint dies ein ziemlich sinnloses Stück Refactoring zu sein - ich würde sie einfach zu new-style casts ändern, wenn ich den umgebenden Code ändere.

Abgesehen davon würde die Tatsache, dass Sie überhaupt C-artige Casts in C++-Code haben, auf Probleme mit dem Code hinweisen, die behoben werden sollten - ich würde nicht einfach eine globale Substitution vornehmen, selbst wenn das möglich wäre.

1 Stimmen

Ich muss mich an die Kodierungsrichtlinien halten :)

0 Stimmen

Meistens sind diese Leitlinien für neu eingegebenen Code. Alter Code wird nur überarbeitet, wenn Änderungen erforderlich sind. Zum Beispiel eine Korrektur. Refactoring nur um des Refactorings willen kostet nur Zeit (und Geld) und bringt keinen Nutzen.

0 Stimmen

+1 Beheben Sie sie, wenn Sie den umgebenden Code bearbeiten/refaktorisieren (und vermutlich erneut testen).

6voto

grrussel Punkte 7171

El C++-Compiler entlasten unterstützt Optionen, um solche Casts als Kompilierzeitfehler zu melden und die Semantik solcher Casts auf eine sicherere Äquivalenz mit static_cast zu beschränken.

Die entsprechenden Optionen sind:

-cp_nocstylecasts   

Der Compiler gibt bei allen C-ähnlichen Casts einen Fehler aus. Casts im C-Stil in C++-Code können potenziell unsicher sein und zu unerwünschtem oder undefiniertem Verhalten führen (z. B. Casting von Zeigern auf nicht verwandte Struktur-/Klassentypen). Diese Option ist nützlich für das Refactoring, um alle diese Casts zu finden und sie durch sicherere C++-Casts wie static_cast zu ersetzen.

-cp_c2staticcasts   

Der Compiler wendet die eingeschränktere Semantik von C++ static_cast auf C-artige Casts an. Das Kompilieren von Code mit dieser Option gewährleistet, dass C-style casts mindestens so sicher sind wie C++ static_casts

Diese Option ist nützlich, wenn vorhandener Code eine große Anzahl von C-ähnlichen Casts enthält und die Umstrukturierung jedes Casts in C++-Casts zu viel Aufwand bedeuten würde.

0 Stimmen

Sehr schön! Endlich mal ein richtiger Parser :)

1voto

Ira Baxter Punkte 91118

Ein Werkzeug, das den C++-Quellcode genau analysieren und automatisierte benutzerdefinierte Änderungen (z. B. die Ersetzung Ihres Casts) durchführen kann, ist das DMS-Software-Reengineering-Werkzeugsatz .

DMS verfügt über einen vollständigen C++-Parser, erstellt ASTs und Symboltabellen und kann so durch Ihren Code navigieren, um zuverlässig C-Stil-Casts zu finden. Durch die Verwendung von Pattern-directed Matches und Rewrites können Sie eine Reihe von Regeln bereitstellen, die alle derartigen C-Style Casts in die gewünschten C++-Äquivalente umwandeln.

DMS wurde zur Durchführung umfangreicher automatisierter C++-Reengineering-Aufgaben für Boeing und General Dynamics eingesetzt, die jeweils Tausende von Dateien umfassten.

8 Stimmen

Sie sollten von vornherein klarstellen, wann Sie für Ihr eigenes Produkt werben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X