Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Statická analýza v PHP

Statická analýza v PHP

Ondřej Mirtes

June 06, 2013
Tweet

More Decks by Ondřej Mirtes

Other Decks in Programming

Transcript

  1. Díky kontrole veškerého kódu při kompilaci nedovolí Java aplikaci s

    chybou vůbec spustit. V testech se tak lze zaměřit na business logiku a nemusíte se zabývat “wiringem”.
  2. PHP is used by 80.1% of all the websites whose

    server-side programming language we know. w3techs.com Webové aplikace v Javě ale nemají na růžích ustláno - méně rozvinutý ekosystém knihoven a frameworků, malá komunita, nepohodlný vývoj kvůli dlouhým deploymentům při každé změně kódu.
  3. Současné aplikace v PHP ale vypadají prakticky stejně jako ty

    v Javě - sice si musíme občas vypomoct komentářem, ale ve většině případů dokážeme přesný typ každé proměnné také určit. Co kdybych se pokusil o podobnou statickou analýzu?
  4. array(14)  {    [0]  =>  T_ECHO    [1]  =>  T_WHITESPACE

       [2]  =>  T_VARIABLE    [3]  =>  T_OBJECT_OPERATOR    [4]  =>  T_STRING    [5]  =>  string(1)  "("    [6]  =>  T_NEW    [7]  =>  T_WHITESPACE    [8]  =>  T_STRING    [9]  =>  string(1)  "("    [10]  =>  string(1)  ")"    [11]  =>  string(1)  ")"    [12]  =>  string(1)  ";" } token_get_all() echo  $this-­‐>getNextBusinessDay(new  DateTime()); První překážka - funkce token_get_all vrací jednoduché pole se sekvencí tokenů kódu - nedá se z něj snadno pochopit význam.
  5. object(PHPParser_Node_Stmt_Echo)  {  =>    object(PHPParser_Node_Expr_MethodCall)  {  =>      

     ["var"]  =>            object(PHPParser_Node_Expr_Variable)            ["name"]  =>  string(4)  "this"        ["name"]=>            string(18)  "getNextBusinessDay"        ["args"]=>            object(PHPParser_Node_Arg)  =>                ["value"]  =>                    object(PHPParser_Node_Expr_New)                      ... PHP-Parser echo  $this-­‐>getNextBusinessDay(new  DateTime()); Tato knihovna vrací strom objektů reprezentující spouštěný kód - půlka práce hotová! https://github.com/nikic/PHP-Parser
  6. Emulates the PHP reflection model using the tokenized PHP source.

    PHP Token Reflection Kdybych pro analýzu využíval interní reflexi v PHP, tak by můj nástroj padal na výskytech parse errorů, duplicitních tříd apod., což si nelze dovolit. Token Reflection reimplementuje reflexi po svém, takže PHP proces na chybách nespadne.
  7. Vývoj šel jako po másle, takže jsem se divil, že

    s takovým nástrojem někdo už dávno nepřišel...
  8. >  composer  create-­‐project  \ scrutinizer/php-­‐analyzer:dev-­‐master >  phpalizer  run  project-­‐dir https://github.com/scrutinizer-ci/php-analyzer

    https://scrutinizer-ci.com/ PHP Analyzer dělá přesně to, co jsem si kladl za cíl. Kromě hledání chyb v kódu dokáže detekovat i nepoužité proměnné, nedosažitelné příkazy (za returnem) atd. Využívá k tomu PHP- Parser, reflexi si naimplementoval po svém.
  9. Jak na analyzovatelný kód? • Dodržovat předávané interfaces • Minimalizovat

    používání __call, __set, __get apod. • Nepoužívat $container->get('service'), $this['form'] apod. • Dynamický kód - reflexe, $$varName, new $class • call_user_func
  10. qafoolabs.github.io/php-refactoring-browser >  php  refactor.phar  extract-­‐method  \ <file>  <line-­‐range>  <new-­‐method> Nástroj

    na refaktoring využívající PHP-Parser, TokenReflection a PHP Analyzer. Autoři chystají podporu pro Vim, podpora do IDEček snad bude jednou taky.
  11. Tokenises PHP files and detects violations of a defined set

    of coding standards. PHP_CodeSniffer Kontrola jednotného coding standardu, ale i prevence chyb - např. vynucení ===. Pracuje vždy pouze v rámci jednoho souboru, takže k analýze kódu je nevhodný.
  12. It takes a given PHP source code base and look

    for several potential problems within that source. PHP Mess Detector Kontrola metrik kódu - délka a komplexita metod, nepoužité proměnné... Opět pouze v rámci jednoho souboru.
  13. Projekt Facebooku - přepsané PHP pro kompilaci do C, nyní

    do bytecodu pro VM alá Java. Typehinting skalárních parametrů, typová pole, statická analýza. Nyní pouze pro PHP 5.2, ale jednou snad bude použitelný namísto oficiální implementace.
  14. Continuous integration server - jednotné prostředí pro vývojáře, kde se

    na každém commitu provádí kontroly pomocí uvedených nástrojů a spouští testy.