Vraag Tool voor het vinden van C-style Casts


Weet iemand van een tool die ik kan gebruiken om expliciete C-stijlcasts in code te vinden? Ik ben bezig met het herwerken van een C ++-code en wil C-style casts waar mogelijk vervangen.

Een voorbeeld van een C-stijl cast zou zijn:

Foo foo = (Foo) bar;

In tegenstelling kunnen voorbeelden van C ++ -stijlcasts zijn:

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

24
2018-04-07 14:12


oorsprong


antwoorden:


Als je gcc / g ++ gebruikt, schakel dan gewoon een waarschuwing in voor casts in C-stijl:

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

29
2018-04-07 14:59



Het feit dat dergelijke casts zo moeilijk te vinden zijn, is een van de redenen waarom in de eerste plaats nieuwe casts werden geïntroduceerd. En als je code werkt, lijkt dit een nogal zinloos stukje refactoring - ik zou ze eenvoudig veranderen naar nieuwe stijlcasts wanneer ik de omringende code heb aangepast.

Dat gezegd hebbende, het feit dat je C-stijl casts hebt in C ++ -code, wijst op problemen met de code die moet worden opgelost - ik zou niet alleen een globale vervanging doen, zelfs als dat mogelijk was.


8
2018-04-07 14:16



De Offload C ++ compiler ondersteunt opties om al deze casts te rapporteren als een compile time error en om de semantiek van dergelijke casts te beperken tot een veiligere equivalentie met static_cast.

De relevante opties zijn:

-cp_nocstylecasts   

De compiler geeft een foutmelding bij alle casts in C-stijl. Casting in C-stijl in C ++ -code kan mogelijk onveilig zijn en leiden tot ongewenst of ongedefinieerd gedrag (bijvoorbeeld casting-pointers naar niet-verwante struct / klassentypen). Deze optie is nuttig voor het refactoring om al die afgietsels te vinden en ze te vervangen door veiligere C ++ -casts zoals static_cast.

-cp_c2staticcasts   

De compiler past de meer beperkte semantiek van C ++ static_cast toe op casts in C-stijl. Het compileren van de code met deze optie ingeschakeld zorgt ervoor dat C-stijl casts minstens zo veilig zijn als C ++ static_casts

Deze optie is handig als bestaande code een groot aantal C-achtige casts heeft en het opnieuw casten van elke cast in C ++ casts zou te veel moeite kosten.


6
2018-04-07 14:32



Zoeken naar de reguliere expressie \)\w geeft verrassend goede resultaten.


5
2018-04-07 14:19



Een tool die C ++ - broncode nauwkeurig kan analyseren en geautomatiseerde aangepaste wijzigingen kan uitvoeren (bijvoorbeeld uw castvervanging) is de DMS Software Reengineering Toolkit.

DMS heeft een volledige C ++ -parser, bouwt AST's en symbooltabellen en kan dus door uw code navigeren om op betrouwbare wijze C-stijlcasts te vinden. Door patroongerichte overeenkomsten en herschrijvingen te gebruiken, kunt u een reeks regels opgeven die al dergelijke C-stijlcasts naar uw gewenste C ++ -equivalenten zouden converteren.

DMS is gebruikt voor het uitvoeren van omvangrijke geautomatiseerde C ++ reengineering-taken voor Boeing en General Dynamics, elk met duizenden bestanden.


1
2018-04-07 14:22



Een probleem met casts in C-stijl is dat ze, omdat ze gebaseerd zijn op haakjes die overbelast zijn, niet triviaal zijn om te herkennen. Nog steeds, een regex zoals (bijvoorbeeld in Python-syntaxis):

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

is een begin - het komt overeen met een enkele identifier tussen haakjes met optionele witruimte tussen de haakjes. Maar dat zal natuurlijk niet vangen, bijvoorbeeld (void*) casts - om ook achterliggende sterretjes te krijgen,

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

Je zou ook kunnen beginnen met een optionele const om het net nog verder te verbreden, enz. enz.

Als je eenmaal een goede RE hebt, veel tools (uit grep naar vim, van awk naar sed, plus perl, python, ruby, enz.) kunt u het toepassen om alle overeenkomsten in uw bron te identificeren.


0
2018-04-07 14:20



Als u een soort van Hongaarse stijlnotatie gebruikt (bijv. iInteger, pPointer enz.) dan kunt u zoeken naar b.v. )p en ) p enzovoort.

Het zou mogelijk moeten zijn om al die plaatsen binnen een redelijke tijd te vinden, zelfs voor een grote codebasis.


0
2018-04-07 14:21



Ik heb al een keer geantwoord met een beschrijving van een tool die zal vinden en verandering alle casts als je dat wilt.

Als alles wat je wilt doen is vind Dergelijke casts, er is een andere tool die dit gemakkelijk zal doen, en in feite is het de extreme generalisatie van alle suggesties voor 'reguliere expressie' die hier zijn gemaakt. Dat is de Zoekmachine voor SD-broncode. Met dit hulpmiddel kunt u grote codebases doorzoeken op basis van de taalelementen waaruit elke taal bestaat. Het biedt een GUI waarmee u query's kunt invoeren, individuele hits kunt zien en de bestandstekst op het hitpunt kunt weergeven met één muisklik. Nog een klik en je kunt in een editor [voor veel editors] in een bestand zijn. De tool zal ook een lijst met hits in de context opnemen, zodat u ze later opnieuw kunt bekijken.

In uw geval krijgt de volgende zoekopdracht in zoekmachines waarschijnlijk de meeste casts:

'(' I ')'  | '(' I ... '*' ')'

wat betekent dat je een reeks tokens vindt, eerst zijnde (waarbij de tweede eender welke identifier is, de derde is ')', of een vergelijkbare sequentie met betrekking tot iets dat eindigt op '*'.

U specificeert geen witruimtebeheer, aangezien de tool de taalregels interpreteert; het zal zelfs een opmerking negeren in het midden van een cast en nog steeds overeenkomen met het bovenstaande.

[Ik ben de CTO van het bedrijf dat dit levert.]


0
2018-04-07 17:51



Ik gebruikte deze reguliere expressie in Visual Studio (2010) Zoeken in bestanden zoekvak: :i\):i

Dank aan sth voor de inspiratie (zijn functie)


-1
2018-04-25 14:35