Tool zum Auffinden von C-Style-Casts

Lesezeit: 5 Minuten

Wafflemans Benutzeravatar
Waffelmann

Kennt jemand ein Tool, mit dem ich explizite Umwandlungen im C-Stil im Code finden kann? Ich überarbeite C++-Code und möchte Umwandlungen im C-Stil ersetzen, wo immer dies möglich ist.

Ein Beispiel für eine Umwandlung im C-Stil wäre:

Foo foo = (Foo) bar;

Im Gegensatz dazu wären Beispiele für Umwandlungen im C++-Stil:

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

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

    – Ashleys Gehirn

    7. April 2010 um 14:16 Uhr

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

    – Mattball

    7. April 2010 um 14:58 Uhr

Wenn Sie gcc/g++ verwenden, aktivieren Sie einfach eine Warnung für Umwandlungen im C-Stil:

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

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

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

    – Platin Azur

    7. April 2010 um 17:56 Uhr

  • Ich habe verwendet \(\w+ ?\*?\) ?\waber hüten Sie sich vor Fehlalarmen.

    – März 2377

    24. Oktober 2019 um 6:18 Uhr

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

    – März 2377

    24. Oktober 2019 um 7:28 Uhr

Die Tatsache, dass solche Abdrücke so schwer zu finden sind, ist einer der Gründe, warum Abdrücke neuen Stils überhaupt eingeführt wurden. Und wenn Ihr Code funktioniert, scheint dies ein ziemlich sinnloses Refactoring zu sein – ich würde sie einfach in Casts im neuen Stil ändern, wenn ich den umgebenden Code ändere.

Allerdings würde die Tatsache, dass Sie überhaupt Umwandlungen im C-Stil in C++-Code haben, auf Probleme mit dem Code hinweisen, die behoben werden sollten – ich würde nicht nur eine globale Ersetzung vornehmen, selbst wenn dies möglich wäre.

  • Ich muss mich an die Codierungsrichtlinien halten 🙂

    – Waffelmann

    7. April 2010 um 14:17 Uhr

  • Meistens gelten diese Richtlinien für neu eingegebenen Code. Alter Code wird nur umgestaltet, wenn Änderungen erforderlich sind. Zum Beispiel eine Korrektur. Refactoring nur für Refactoring kostet nur Zeit (und Geld) ohne Nutzen.

    – RvdK

    7. April 2010 um 14:57 Uhr

  • +1 Beheben Sie sie, wenn Sie am umgebenden Code arbeiten / ihn umgestalten (und vermutlich erneut testen).

    – Markus B

    7. April 2010 um 15:15 Uhr

  • @waffleman: Solange niemand sieht die Abgüsse, niemand wird etwas dagegen haben, dass sie nicht Ihren Richtlinien entsprechen. Reparieren Sie sie also, wenn Sie (oder jemand anderes) sie finden. Es scheint Zeitverschwendung, aktiv nach ihnen zu suchen. Nur nicht schreiben mehr von ihnen, und reparieren Sie die alten, sobald sie Ihnen auffallen.

    – jalf

    7. April 2010 um 16:18 Uhr

Das Entladen Sie den C++-Compiler unterstützt Optionen, um alle diese Umwandlungen als Kompilierzeitfehler zu melden und die Semantik solcher Umwandlungen auf eine sicherere Äquivalenz mit static_cast zu beschränken.

Die relevanten Optionen sind:

-cp_nocstylecasts   

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

-cp_c2staticcasts   

Der Compiler wendet die eingeschränktere Semantik von C++ static_cast auf Umwandlungen im C-Stil an. Das Kompilieren von Code mit dieser aktivierten Option stellt sicher, dass Umwandlungen im C-Stil mindestens so sicher sind wie statische_Umwandlungen in C++

Diese Option ist nützlich, wenn vorhandener Code eine große Anzahl von Umwandlungen im C-Stil enthält und das Refactoring jeder Umwandlung in C++-Umwandlungen zu aufwändig wäre.

Ein Tool, das den C++-Quellcode genau analysieren und automatisierte benutzerdefinierte Änderungen (z. B. Ihren Cast-Ersatz) durchführen kann, ist das DMS-Software-Reengineering-Toolkit.

DMS verfügt über einen vollständigen C++-Parser, erstellt ASTs und Symboltabellen und kann so durch Ihren Code navigieren, um Umwandlungen im C-Stil zuverlässig zu finden. Durch die Verwendung von mustergesteuerten Übereinstimmungen und Umschreibungen können Sie eine Reihe von Regeln bereitstellen, die alle derartigen Umwandlungen im C-Stil in Ihre gewünschten C++-Äquivalente konvertieren würden.

DMS wurde verwendet, um umfangreiche automatisierte C++-Reengineering-Aufgaben für Boeing und General Dynamics durchzuführen, die jeweils Tausende von Dateien umfassten.

  • Sie sollten im Voraus klarstellen, wann Sie Ihr eigenes Produkt anschließen.

    – Matthäus Flaschen

    7. April 2010 um 14:38 Uhr


Benutzeravatar von Alex Martelli
Alex Martell

Ein Problem bei Umwandlungen im C-Stil ist, dass sie nicht einfach zu erkennen sind, da sie auf stark überladenen Klammern beruhen. Dennoch eine Regex wie (z. B. in Python-Syntax):

r'\(\s*\w+\s*\)'

ist ein Anfang – es entspricht einem einzelnen Bezeichner in Klammern mit optionalem Leerzeichen innerhalb der Klammern. Aber das fängt natürlich nicht an, z. (void*) casts — um auch abschließende Sternchen zu erhalten,

r'\(\s*\w+[\s*]*\)'

Sie können auch mit einem optionalen beginnen const das Netz noch weiter zu verbreitern usw. usw.

Sobald Sie ein gutes RE haben, können viele Tools (von grep zu vimaus awk zu sedPlus perl, python, rubyusw.) können Sie es anwenden, um alle Übereinstimmungen in Ihrer Quelle zu identifizieren.

  • Sie sollten im Voraus klarstellen, wann Sie Ihr eigenes Produkt anschließen.

    – Matthäus Flaschen

    7. April 2010 um 14:38 Uhr


Benutzeravatar von Frunsi
Frunsi

Wenn Sie eine Notation im ungarischen Stil verwenden (z iInteger, pPointer usw.), dann können Sie z )p und ) p usw.

Es sollte möglich sein, all diese Stellen in angemessener Zeit selbst für eine große Codebasis zu finden.

1387330cookie-checkTool zum Auffinden von C-Style-Casts

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy