Phan - analiza statyczna kodu z użyciem nowości PHP 7

37
STATYCZNA ANALIZA KODU PHP Z PHAN / Tomasz Tybulewicz @tybulewicz

Transcript of Phan - analiza statyczna kodu z użyciem nowości PHP 7

Page 1: Phan - analiza statyczna kodu z użyciem nowości PHP 7

STATYCZNA ANALIZAKODU PHP Z PHAN

/ Tomasz Tybulewicz @tybulewicz

Page 2: Phan - analiza statyczna kodu z użyciem nowości PHP 7

HISTORIA

Page 3: Phan - analiza statyczna kodu z użyciem nowości PHP 7

https://twitter.com/rasmus/status/532288201852198912

Page 4: Phan - analiza statyczna kodu z użyciem nowości PHP 7

https://twitter.com/rasmus/status/616740838102532097

Page 5: Phan - analiza statyczna kodu z użyciem nowości PHP 7

https://twitter.com/rasmus/status/671836218896736257

Page 6: Phan - analiza statyczna kodu z użyciem nowości PHP 7

OBECNIE ROZWIJANY W ETSYwiększość zmian autorstwa Andrew Morrisona

Page 7: Phan - analiza statyczna kodu z użyciem nowości PHP 7

DZIAŁANIE

Page 8: Phan - analiza statyczna kodu z użyciem nowości PHP 7

WYMAGANIAwymaga PHP 7 i rozszerzenia analizuje kod dowolnej wersji PHP

php-ast

Page 9: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PRZYKŁADY ŁAPANYCH BŁĘDÓW

Page 10: Phan - analiza statyczna kodu z użyciem nowości PHP 7

function getNumber(): int // Method \getnumber is declared to return int but has no return value

Page 11: Phan - analiza statyczna kodu z użyciem nowości PHP 7

function tailParametersRequired($p1 = null, $p2) // Required argument follows optional

Page 12: Phan - analiza statyczna kodu z użyciem nowości PHP 7

function oneParameter($i) oneParameter(1, 2); // Call with 2 arg(s) to \oneparameter() which only takes 1 arg(s)

Page 13: Phan - analiza statyczna kodu z użyciem nowości PHP 7

$arr = false;if ($arr[1]) // Suspicious array access to bool

Page 14: Phan - analiza statyczna kodu z użyciem nowości PHP 7

if (42 == [13, 37]) // int to array comparison

if ([13, 37] == 'string') // array to string comparison

Page 15: Phan - analiza statyczna kodu z użyciem nowości PHP 7

$v = null;if ($v instanceof Undef) // Checking instanceof against undeclared class \undef

Page 16: Phan - analiza statyczna kodu z użyciem nowości PHP 7

/** * @return int */function voidReturn() return null;// Returning type null but voidreturn() is declared to return int

Page 17: Phan - analiza statyczna kodu z użyciem nowości PHP 7

/** * @return int[] */function oldComment() return ['to be or not to be']; // Returning type string[] but oldComment() is declared to return int[]

Page 18: Phan - analiza statyczna kodu z użyciem nowości PHP 7

MOJE DOŚWIADCZENIA

Page 19: Phan - analiza statyczna kodu z użyciem nowości PHP 7

TRUDNE POCZĄTKI

Page 20: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PHAN się wysypywał przy analizie Wordpressa

Pomogło cofnięcie wersji do release 0.2

Master został szybko poprawiony

Page 21: Phan - analiza statyczna kodu z użyciem nowości PHP 7

Błędy związane z klasami z rozszerzeń

Property of undeclared type \memcached Call to method get from undeclared class \memcached

Moje PHP 7 nie miało wkompilowanego tego rozszerzenia,dodałem do analizy plik "nagłówkowy" z definicją interface'u.

Page 22: Phan - analiza statyczna kodu z użyciem nowości PHP 7

Błędy z rozpoznawaniem przestrzeni nazw

PhanSignatureMismatch Declaration of function buildForm(\symfony\component\form\formbuilderinterface $builder, array $optionsbuildForm(\Symfony\Component\Form\formbuilderinterface $builder, array $options

Problem poprawiony w 1h od zgłoszenia

Page 23: Phan - analiza statyczna kodu z użyciem nowości PHP 7

DOMYŚLNY PLIK KONFIGURACYJNY.phan/config.php

Przykładowa konfiguracja Phan: github.com/etsy/phan/blob/master/.phan/config.php

Pełen plik: github.com/etsy/phan/blob/master/src/Phan/Config.php

Page 24: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PIERWSZA PRÓBA'directory_list' => [ 'src', 'vendor', ],'exclude_analysis_directory_list' => [ 'vendor/' ],

Page 25: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PIERWSZA PRÓBAczas analizy > 30sużyta pamięć > 2GB

Page 26: Phan - analiza statyczna kodu z użyciem nowości PHP 7

OBECNIE'file_list' => [ 'app/AppKernel.php', 'vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php' // 87 innych plików z vendor 'vendor/symfony/symfony/src/Symfony/Component/Yaml/Yaml.php', ],'directory_list' => [ 'src',],'exclude_analysis_directory_list' => [ 'vendor/', ],

Page 27: Phan - analiza statyczna kodu z użyciem nowości PHP 7

OBECNIEczas analizy < 2sużyta pamięć - pomijalnie mało

Page 28: Phan - analiza statyczna kodu z użyciem nowości PHP 7

UŻYCIE W NASZYM PROJEKCIEtesty u mnie: 1,5 miesiącareszta zespołu: 2 tygodnieCI: planujemy od wersji 1.0

Page 29: Phan - analiza statyczna kodu z użyciem nowości PHP 7

UŻYCIE W ETSYod tygodnia (info z 19 lutego) działa produkcyjnieblokuje deploymenty w przypadku wykrycia błędów

Page 30: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PODSUMOWANIE

Page 31: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PLUSYaktywnie rozwijany"oryginalne" ASTwykrywa problemy pomijane przez inne narzędziaanalizuje PhpDocdobry kontakt z developerami

Page 32: Phan - analiza statyczna kodu z użyciem nowości PHP 7

MINUSYaktywnie rozwijanywersja z gałęzi master często nie działafalse positivesnie zgłasza problemów z @throwsdość nowy projekt - mało informacji w sieci

Page 33: Phan - analiza statyczna kodu z użyciem nowości PHP 7

MINUSY

Page 34: Phan - analiza statyczna kodu z użyciem nowości PHP 7

ZASTOSOWANIEkolejne narzędzie do analizy koduwykrywa błędy zanim staną się problememwspiera podczas przeglądu kodu

Page 36: Phan - analiza statyczna kodu z użyciem nowości PHP 7

PYTANIA?

Page 37: Phan - analiza statyczna kodu z użyciem nowości PHP 7

UŻYWAŁEM PHAN ZANIMTO BYŁO MODNE

/ Tomasz Tybulewicz @tybulewicz