abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také ve variantách s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    dnes 04:44 | Nová verze

    Po roce vývoje od vydání verze 1.24.0 byla vydána nová stabilní verze 1.26.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.26.

    Ladislav Hagara | Komentářů: 0
    dnes 04:33 | Nová verze

    Byla vydána nová verze 6.2 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 13.0.14.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána nová verze 30.0.0 frameworku pro vývoj multiplatformních desktopových aplikací pomocí JavaScriptu, HTML a CSS Electron (Wikipedie, GitHub). Chromium bylo aktualizováno na verzi 124.0.6367.49, V8 na verzi 12.4 a Node.js na verzi 20.11.1. Electron byl původně vyvíjen pro editor Atom pod názvem Atom Shell. Dnes je na Electronu postavena celá řada dalších aplikací.

    Ladislav Hagara | Komentářů: 0
    dnes 04:11 | Nová verze

    Byla vydána nová verze 9.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 220 vývojářů. Provedeno bylo více než 2 700 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    včera 23:22 | IT novinky

    Evropský parlament dnes přijal směrnici týkající se tzv. práva spotřebitele na opravu. Poslanci ji podpořili 584 hlasy (3 bylo proti a 14 se zdrželo hlasování). Směrnice ujasňuje povinnosti výrobců opravovat zboží a motivovat spotřebitele k tomu, aby si výrobky nechávali opravit a prodloužili tak jejich životnost.

    Ladislav Hagara | Komentářů: 2
    včera 16:11 | Nová verze

    Bylo oznámeno (cs) vydání Fedora Linuxu 40. Přehled novinek ve Fedora Workstation 40 a Fedora KDE 40 na stránkách Fedora Magazinu. Současně byl oznámen notebook Slimbook Fedora 2.

    Ladislav Hagara | Komentářů: 13
    včera 13:44 | Upozornění

    ČTK (Česká tisková kancelář) upozorňuje (X), že na jejím zpravodajském webu České noviny byly dnes dopoledne neznámým útočníkem umístěny dva smyšlené texty, které nepocházejí z její produkce. Jde o text s titulkem „BIS zabránila pokusu o atentát na nově zvoleného slovenského prezidenta Petra Pelligriniho“ a o údajné mimořádné prohlášení ministra Lipavského k témuž. Tyto dezinformace byly útočníky zveřejněny i s příslušnými notifikacemi v mobilní aplikaci Českých novin. ČTK ve svém zpravodajském servisu žádnou informaci v tomto znění nevydala.

    Ladislav Hagara | Komentářů: 25
    včera 13:33 | Komunita

    Byla založena nadace Open Home Foundation zastřešující více než 240 projektů, standardů, ovladačů a knihoven (Home Assistant, ESPHome, Zigpy, Piper, Improv Wi-Fi, Wyoming, …) pro otevřenou chytrou domácnost s důrazem na soukromí, možnost výběru a udržitelnost.

    Ladislav Hagara | Komentářů: 0
    včera 13:00 | Nová verze

    Společnost Meta otevírá svůj operační systém Meta Horizon OS pro headsety pro virtuální a rozšířenou realitu. Vedle Meta Quest se bude používat i v připravovaných headsetech od Asusu a Lenova.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (72%)
     (9%)
     (2%)
     (17%)
    Celkem 708 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Sémantické patchování pomocí nástroje Coccinelle

    25. 2. 2009 | Jirka Bourek | Programování | 3334×

    Všichni jsme to zažili: hledáte nějakou ošklivou chybu a najednou s hrůzou zjistíte, že musíte úplně změnit enormní kus kódu, abyste ji mohli opravit. Spustíte rychlý grep nad základnou kódu a orosíte se: stovky řádků kódu, které je potřeba změnit! A změna je příliš složitá na to, aby se dala udělat skriptem, protože závisí na kontextu, ve kterém je volána, nebo vyžaduje do každého volajícího přidat novou proměnnou.

    Originál tohoto článku napsala Valerie Aurora (dříve Henson), vyšel na LWN.net.

    To se mi stalo minulý měsíc, když jsem přidávala podporu pro 64bitové souborové systémy do e2fsprogs. Myslela jsem si, že jsem skoro hotová, když jsem zjistila, že potřebuji napsat (další) nové rozhraní a konvertovat podle něj (dalších) několik set řádek kódu. Změny byly dostatečně komplexní na to, aby je nebylo možné provést skriptem, ale dostatečně jednoduché, že jsem si chtěla vydrápat oči kvůli té duši ubíjející nudě při ručních úpravách. V tu chvíli správce, Theodore Ts'o, navrhl, abych se podívala na Coccinelle (též známé jako spatch).

    Coccinelle

    Coccinelle (vyslovováno kok'-si:-nel) je nástroj pro automatickou analýzu a přepis C kódu, ve francouzštině toto slovo znamená "slunéčko sedmitečné"; jméno je zvoleno proto, že slunéčko požírá jiné brouky [bug]. Nejde pouze o další skriptovací jazyk; Coccinelle si je vědom struktury jazyka C a je schopno provádět komplexnější změny, než je možné čistým zpracováním řetězců. Například může danou změnu provést jenom u funkcí, které jsou spojeny s ukazatelem na funkci v konkrétním typu pole - řekněme člena create struktury struct inode_operations.

    Vstupem pro tento nástroj je soubor(y), který se má měnit, a "sémantický patch" napsaný v SmPL [Semantic Patch Language, jazyk pro sémantické patche]. SmPL vypadá jako unifikovaný [unified] diff (patch), do kterého jsou zamíchány nějaké céčkové deklarace. Zde je příklad:

    @@
    expression E;
    identifier fld;
    @@
    
    - !E && !E->fld
    + !E || !E->fld

    Tento sémantický patch opravuje chybu, kde je ukazatel testován na nulovost - a dereferencován, pokud je nulový. Příklad chyby, kterou tento sémantický patch našel v linuxovém jádře (a automaticky vygeneroval opravu):

     --- a/drivers/pci/hotplug/cpqphp_ctrl.c
     +++ b/drivers/pci/hotplug/cpqphp_ctrl.c
     @@ -1139,7 +1139,7 @@ static u8 set_controller_speed(struct controller
     *ctrl, u8 adapter_speed, u8 hp_
             for(slot = ctrl->slot; slot; slot = slot->next) {
                     if (slot->device == (hp_slot + ctrl->slot_device_offset))
                                continue;
     -               if (!slot->hotplug_slot && !slot->hotplug_slot->info)
     +               if (!slot->hotplug_slot || !slot->hotplug_slot->info)
                             continue;
                     if (slot->hotplug_slot->info->adapter_status == 0)
                             continue;

    (Více o formátu sémantického patche je popsáno později.)

    Coccinelle navrhli, napsali a spravují Julie LawallKatedry počítačových věd Univerzity v Kodani, Gilles MullerYoann Padioleau z Ecole des Mines de Nantes a René Rydhof Hansen z Katedry počítačových věd Univerzity v Aalborg. Je distribuován pod licencí GPL, nicméně je napsán v OCamlu, takže potenciální základna vývojářů je poněkud omezená.

    Původním cílem Coccinelle bylo co nejvíce automatizovat úkol udržovat ovladače aktuální s nejnovějšími rozhraními v jádře. Konečný výsledek nicméně umí mnohem více než to, včetně vyhledávání a opravování chyb a nepravidelností ve stylu psaní kódu. Do linuxového jádra bylo dosud akceptováno přes 180 patchů vytvořených pomocí Coccinelle.

    Rychlý úvod do Coccinelle

    Jako mnoho jazyků, i SmPL se lze nejlépe naučit pomocí příkladů. Pro začátek si projdeme jeden jednoduchý, poté můžeme na webové stránce Coccinelle najít nějakou dokumentaci a přehršel příkladů.

    Nejprve Coccinelle stáhněte a nainstalujte. Já jsem místo kterékoliv předkompilované volby použila verzi ze zdrojových kódů. Binárka Coccinelle se nazývá spatch.

    V našem příkladu řekněme, že máme program, který často volá alloca(), a my bychom tato volání chtěli nahradit malloc(). Funkce alloca() alokuje prostor na zásobníku a může být efektivnější a vhodnější než malloc(), ale je také závislá na překladači, nestandardní, snadno se použije nesprávně a při selhání má nedefinované chování. (Nahrazení alloca() malloc() není dostatečné, také musíme testovat návratovou hodnotu - ale o tom později.)

    Zde je C soubor, se kterým pracujeme:

    #include <alloca.h>
    
    int
    main(int argc, char *argv[])
    {
            unsigned int bytes = 1024 * 1024;
            char *buf;
    
            /* allocate memory */
            buf = alloca(bytes);
    
            return 0;
    }

    Mohli bychom nahrazení zařídit skriptovacím jazykem jako je sed:

    $ sed -i 's/alloca/malloc/g' test.c

    To ale nahradí řetězec "alloca", kdekoliv se objeví. Výsledný diff:

    --- test.c
    +++ /tmp/test.c
    @@ -1,4 +1,4 @@
    -#include <alloca.h>
    +#include <malloc.h>
    
     int
     main(int argc, char *argv[])
    @@ -6,8 +6,8 @@
             unsigned int bytes = 1024 * 1024;
             char *buf;
    
    -        /* allocate memory */
    -        buf = alloca(bytes);
    +        /* mallocte memory */
    +        buf = malloc(bytes);
    
             return 0;
     }

    Tento skript můžeme vyladit tak, aby řešil 90 % případů:

    $ sed -i 's/alloca(/malloc(/g' test.c

    Úprava ale neřeší případ, kdy má jméno druhé funkce jako příponu jméno první, závisí na stylu psaní kódu, kde mezi otevírající závorkou a jménem funkce není žádný bílý znak, atd., atd. Touhle dobou už je náš jednoduchý skript pro sed stoznakové monstrum. Lze ho vytvořit, ale je to problematické.

    V Coccinelle bychom použili následující sémantický patch:

    @@ expression E; @@
    
    -alloca(E)
    +malloc(E)

    C soubor nechť je test.c, sémantický patch uložíme do test.cocci a spustíme patchování:

    $ spatch -sp_file test.cocci test.c

    Měl by být vytvořen takovýto diff:

    --- test.c
    +++ /tmp/cocci-output-17416-b5450d-test.c
    @@ -7,7 +7,7 @@ main(int argc, char *argv[])
             char *buf;
     
             /* allocate memory */
    -        buf = alloca(bytes);
    +        buf = malloc(bytes);
     
             return 0;
     }

    Nyní se podívejme na sémantický patch řádek po řádku.

    @@ expression E; @@

    Tento řádek deklaruje "metaproměnnou" E jako proměnnou, která může odpovídat kterémukoliv výrazu - například 1 + 2, sizeof(x), strlen(name) + sizeof(x) * 72. Když spatch zpracovává vstup, nastaví hodnotu E na argument alloca(). Syntaxe @@ @@ je zvolena tak, aby připomínala řádek v unifikovaném diffu popisující řádky, které se budou patchovat. Osobně tuto podobnost nepovažuji za příliš užitečnou, ale záměr je zvolen dobře.

    -alloca(E)

    Tento řádek říká, že se má odstranit jakékoliv volání funkce alloca() a jeho argument uložit do metaproměnné E.

    +malloc(E)

    A tento řádek říká, že se volání alloca() má nahradit voláním malloc() a použít hodnotu metaproměnné E jako argument.

    Nyní bychom také chtěli testovat návratovou hodnotu malloc() a vrátit chybu, pokud selhalo. To můžeme udělat také:

    @@
    expression E;
    identifier ptr;
    @@
    
    -ptr = alloca(E);
    +ptr = malloc(E);
    +if (ptr == NULL)
    +        return 1;

    Výsledný diff:

    --- test.c
    +++ /tmp/cocci-output-17494-22a573-test.c
    @@ -7,7 +7,8 @@ main(int argc, char *argv[])
             char *buf;
     
             /* allocate memory */
    -        buf = alloca(bytes);
    +        buf = malloc(bytes);
    +        if (buf == NULL)
    +                return 1;
     
             return 0;
     }

    Sémantické patche mohou být mnohem komplexnější. Jedním z mých oblíbených příkladů je přesun počítání referencí struktury Scsi_Host mimo ovladače. Tato změna vyžadovala přidání argumentu signatuře funkce a odstranění deklarace a několika dalších řádek z funkce proc_info každého SCSI ovladače. Sémantický patch, který je detailně popsán ve slidech OLS 2007 [PPT] [ODP], toto všechno udělá automaticky. Doporučuji přečíst si tento příklad několikrát, dokud si ho neosvojíte.

    Zkušenosti

    Moje první zkušenost s Coccinelle byla smíšená. Teoreticky Coccinelle dělá přesně to, co chci - automatizuje komplexní změny v kódu - ale praktická implementace má kvalitu betaverze. Úspěšně jsem použila Coccinelle ke změnám v rozsahu několika stovek řádků s méně než sto řádky sémantických patchů, ale až po přímé spolupráci s vývojáři na opravování chyb a zjišťování vlastností SmPL. Coccinelle je jeden z těch schizofrenních projektů umístěných na hranici mezi akademickým výzkumem a vývojem softwaru.

    První překážku, kterou jsem musela překonat, bylo poučit Coccinelle o makrech ve svém kódu. Coccinelle si sám musí zajistit veškeré parsování a preprocessing - není možné prostě prohnat C kód přes cpp, protože pak by bylo potřeba mapovat výstup preprocesoru zpět na původní kód. Makro je občas natolik matoucí, že Coccinelle vzdá procházení funkce do místa, kde narazí na další bezpečný gramatický počáteční bod (tj. na další funkci) - což může znamenat, že nezpracuje většinu souboru. Abyste toto obešli, můžete vytvořit seznam maker a vložit je do spatch s volbou -macro_file. (Ano, to je jedna pomlčka - jedna z věcí, která mě na Coccinelle štve, je nestandardní styl voleb příkazové řádky.) Zde je například několik řádek z makro souboru, který jsem použila pro e2fsprogs:

    #define EXT2FS_ATTR(a)
    #define _INLINE_ inline
    #define ATTR(a)

    Seznam maker lze vytvořit ručně, ale spatch má volbu, která je vyhledává automaticky. Volba -parse_c způsobí, že spatch vypíše deset nejčastějších chyb, které budou zahrnovat jméno makra. Zde je například část výstupu z spatch -parse_c na e2fsprogs:

    EXT2FS_ATTR: present in 85 parsing errors
    example:
    
          static int check_and_change_inodes(ext2_ino_t dir,
                                      int entry EXT2FS_ATTR((unused)),
                                      struct ext2_dir_entry *dirent, int
                                      offset,
                                      int  blocksize EXT2FS_ATTR((unused)),

    V těchto několika týdnech bylo Coccinelle významně vylepšen. Vydání 0.1.2 mělo mnoho chyb, kvůli kterým byl pro mě spatch nepoužitelný. Další vydání (0.1.3) tyto chyby opravilo a s ním jsem byla schopna vytvořit praktické patche pro skutečný svět. Vydání 0.1.4 přijde brzy. Vývojáři napsali a uvolnili více dokumentace, včetně popisu všech voleb pro příkazovou řádku [PDF] a gramatiky SmPL. K dispozici je mnohem více příkladových skriptů pro spatch. Nejlepším zdrojem pro výuku Coccinelle jsou stále slidy z OLS 2007 a s nimi spojené pojednání [PDF]. Práce s bílými znaky se zlepšuje; Coccinelle se původně příliš o bílé znaky nestaral a často poškodil transformace, které je obsahovaly; což je problém, když se pokoušíte o automatizaci editace, která se dříve dělala pouze ručně. Jeden z mých sémantických patchů zanechal uprostřed kódu středník; vývojáři mi poslali opravu během několika dní.

    Jednou věcí jsem si naprosto jistá: naučit se Coccinelle a psaní sémantických patchů bylo mnohem zábavnější než dělat změny ručně nebo s použitím regulárních výrazů. Také mám větší důvěru v to, že moje změny byly správné; je pozoruhodně příjemné, když změníte několik set řádků kódu a výsledek se na první pokus zkompiluje a projde testy na regrese.

    Příbuzná práce

    Jestliže opravdu chcete, můžete dělat všechno, co umí Coccinelee, pomocí vlastních skriptů - koneckonců kód je kód. Musíte se ale vypořádat se všemi okrajovými případy - pro C jsou například všechny bílé znaky obecně stejné, ale regulární výrazy považují mezeru, tabulátor a nový řádek za různé věci. Pro úkol použijte správný nástroj - jestliže jenom měníte jméno proměnné a váš první skript funguje, skvěle. Jestliže měníte konvenci volání nebo přesouváte alokaci a uvolňování objektu do jiného kontextu, zkuste Coccinelle nebo podobný nástroj.

    Co se výkonu a flexibility týče, Coccinelle je podobný nástroji Stanford compiler checker [PDF] (komericializován firmou Coverity). I když je tento nástroj dospělejší a průběh analýzy a procházení kódu je lepší, Coccinele umí generovat kód, který opravuje nalezení chyby. A co je nejdůležitější, Coccinelle je open source, takže vývojáři mohou hledat a opravovat chyby sami.

    Některé IDE obsahují nástroje pro automatické přepisování kódu (refactor), což je jeden aspekt toho, co dělá Coccinelle. Osobně jsem nikdy žádný z těchto nástrojů nevyzkoušela a s Coccinelle je porovnat nemůžu, ale mí přátelé, kteří ano, hlásili, že jejich stabilita má své rezervy. Xrefactory je přepisovací nástroj pro *NIX platformy, který je plně integrován s Emacsem a XEmacsem. Není open source a vyžaduje zakoupení licence, i když k dispozici je jedna verze zdarma.

    Závěr

    Coccinelle je nástroj s otevřeným zdrojovým kódem, který umí analyzovat a měnit zdrojový kód v C podle specifikovaných pravidel či sémantických patchů. Sémantické patche jsou mnohem mocnější než běžné patche nebo regulární výrazy. Momentálně má kvalitu betaverze, ale je použitelný pro praktické účely a vývojáři reagují poměrně rychle. Pro každého vývojáře, který provádí netriviální změny rozhraní, stojí za to naučit se ho používat.

           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    25.2.2009 00:27 jos
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle

    nějak se vám sem vloudil celej další článek ))

    25.2.2009 00:55 Robert Krátký | skóre: 94 | blog: Robertův bloček
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    Oops... opraveno, dík.
    dayvee avatar 25.2.2009 03:58 dayvee | skóre: 4 | Praha
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    wow tak tohle vypada zajimave. diky :)
    debian was first announced on my 3rd birthday :)
    25.2.2009 08:48 digri | skóre: 12 | blog: digri
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    Zajímavej článek, akorát v tom vzorovým případě s náhradou alloca lze použít úplně jednoduchej regexp.
    sed 's/\<alloca\>/malloc/g' test.c
    Pavel Vymetálek avatar 25.2.2009 10:38 Pavel Vymetálek | skóre: 15 | Náchod
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    Ale už tam takhle jednoduše nepřïdáte ten test na výsledek volání funkce.
    25.2.2009 12:35 Miloslav Ponkrác | blog: miloslavponkrac
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle

    Já myslím, že Coccinelle je ukázka kam až může zajít opovrhování různými IDE.

    Každé dobré IDE (než začnete argumentovat různými IDE ve stylu hračky pro děti přečtěte si ještě jednou to slovo dobré) má slušné nástroje refaktorizaci, což je v zásadě to, co programátor při změnách na 99,999% potřebuje.

    Ale jinak dobře pojatý článek, autor má talent.

    25.2.2009 14:02 b*d
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle

    Refactoring je ale věcí OOP. Toto je pokus překonat jeden z problémů, které odstraňuje OO jazyk.

    Jinak se nedá než nesouhlasit - dokonce bych založil hnutí osvěty na školách, kde studenty nutí psát v obyčejném textovém editoru. Výsledek je jenom ten, že jsou znechucení chybami jako jsou překlepy a složitostí vývoje. Člověk se totiž neučí celkovým počtem pokusů nýbrž jenom počtem těch, které jsou správně.

    25.2.2009 14:50 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    Refactoring je ale věcí OOP.
    Proč? Nebo jsem zaspal, když se měnil význam slova refaktoring (automatizované zlepšování existujícího kódu)?
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    25.2.2009 19:37 b*d
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle

    Můžete mi prosím uvést nějaký nástroj stejných nebo lepších kvalit, než Eclipse nebo RR pro ne OO jazyk a se 100% úspěšností pro "automatizované zlepšování existujícího kódu"?

    25.2.2009 20:10 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    Nemůžu, protože žádný takový jazyk nepoužívám a ty nástroje neznám. Nicméně přítomný článek dokazuje, že i pro Céčko se ty nástroje dají napsat. Jeho gramatika je sice odporný hnus, což je výrazná komplikace, ale lze to. Mimochodem pokud jde o Javu, nejlepší refaktoring má jednoznačně IDEA ;-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    25.2.2009 21:27 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    gramatika Cecka zase neni takovy hnus... resp. nevidim tam zadnou vetsi krpu.... horsi je to se semantikou...

    prvni vec, ktera rapidne komplikuje refaktorizaci je preprocesor. dalsi veci, ktera refaktorizaci moc nepomaha je ,,mnohoznacnost'' hodnot... z toho, ze neco muze byt napr. soucasne pointer, cislo, pole... musi mit takovy nastroj urcite ohromnou radost...
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    25.2.2009 22:48 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    No, to je právě to. Gramatika je tak hnusná, že pro parsování jsou potřeba sémantické informace. Klasický příklad s a*b :-) A navíc ten preprocesor, to je pravda. Ale před pár dny jsem trochu četl něco o Clangu a tam si udržují informace o původní podobě zdrojáku až do hodně pozdních fází překladu, takže něco takového asi taky jde.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    26.2.2009 11:33 Ivan
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle

    Ten priklad a*b je jeste brnkacka. V C++ muzete videt i tohle:

    v1 = a.b();

    v2 = a->c();

    A co ted? Je "a" instance tridy anebo pointer? Navic trida "a" nema zadnou metodu "c". Po tom co jsem prisel o nekolik hodin zivota jsem prisel na to, ze "a" ma vnorenou tridu "x", ktera je potomkem "y" a "y" ma metodu "c". Navic trida "a" ma pretizeny operator "->" ktery umoznuje "pretypovani" na y.

     

    1.3.2009 21:15 9x0
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle

    Java refactoring v Eclipse rozhodne nefunguje na 100 %. Eclipse som sice len skusal, ale uz pri operacii Extract method nastali problemy a bola zmenena semantiku kodu (ale aspon ma IDE o tom informovalo). Mozno sa to uz zmenilo, no nie je to az tak davno, co som to skusal.

    Gilhad avatar 26.2.2009 21:58 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    IMHO je Refaktoring zlepsovani existujiciho kodu (aspon to tak tvrdi Martin Fowler ve sve knize), takze refaktorovat lze v podstate jakykoli kod v tarka jakemkoli jazyce. Samozrejme nektere veci se daji refaktorizovat snaz, nektere hur. Pro nektere jazyky existuji klikaci udelatka, pro jine nikoli. Ale rict ze refaktorovani = automatizovana oprava ciste OO jazyka je podle me naproste nepochopeni podstaty :)
    26.2.2009 22:04 Filip Jirsák | skóre: 68 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    Myslím, že v této debatě se refaktoringem myslí refaktorign s výraznou podporou nějakého nástroje. Upravit existující kód ručně je samozřejmě možné vždy a v jakémkoli jazyce, ale důvodů, proč se tomu chce každý programátor vyhnout, je v samotném článku popsáno dost.

    PS: ostřílení programátoři by refaktoring asi popsali spíš jako nahrazování starých chyb novými chybami.
    Gilhad avatar 27.2.2009 18:49 Gilhad | skóre: 20 | blog: gilhadoviny
    Rozbalit Rozbalit vše Re: Sémantické patchování pomocí nástroje Coccinelle
    To zni jako z praxe :)

    Spravne by refaktoring mel zachovat vsechny stavajici chyby, nepridat zadne nove a jenom zmenit vzhled zapisu zdrojaku na neco, co se bude udrzovat ponekud snaz a v cem ty chyby budou opravitelnejsi :)
    25.2.2009 14:06 Ivan
    Rozbalit Rozbalit vše OT: Re: Sémantické patchování pomocí nástroje Coccinelle

    Rozhodne nechci hajit Javu, napsal jsem v ni vsehovsudy pouze jeden program, ale prave refactioring v Eclipse me utvrdil v tom, ze gcc zaostava. Eclipse ma integrovany kompilator a ten do prostredi dodava vsechny potrebne informace pro pochopeni kodu a nasledny refactoring. Takovy refactoring je uspesny ve 100% pripadu. Vubec se to neda srovnat s nastroji jako cscope nebo ctags. Nikde nenarazite na milion maker, ktera jsou do sebe zanorena do sebe takovym zpusobem ze nikdo nedokaze odhadnout co z nich vlastne vypadne - viz treba mozilla nebo alokace pameti v openldapu.

     

    25.2.2009 17:13 Filip Jirsák | skóre: 68 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: OT: Re: Sémantické patchování pomocí nástroje Coccinelle
    Jenom doplním, že k refaktoringu nepotřebujete celý kompilátor, stačí analyzátor kódu. V tomhle má Java velkou výhodu, protože je to tak jednoduchý jazyk. Není problém analyzovat k, zjistit co se kde jak volá atd., ale pořád si pamatovat, kde přesně je to ve zdrojovém kódu. U těch 100 % bych také nějakou tu setinku ubral -- on ten eclipsí kompilátor taky není úplně v pořádku (resp. třeba nepřeloží kód, který Sunovský kompilátor přeloží nebo opačně -- a podle mne správně bylo chování Sunovského kompilátoru).

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.