ݺߣ

ݺߣShare a Scribd company logo
STATYCZNA ANALIZA
KODU PHP Z PHAN
/Tomasz Tybulewicz @tybulewicz
HISTORIA
https://twitter.com/rasmus/status/532288201852198912
https://twitter.com/rasmus/status/616740838102532097
https://twitter.com/rasmus/status/671836218896736257
OBECNIE ROZWIJANY W ETSY
większość zmian autorstwa Andrew Morrisona
ٴܱŁ
WYMAGANIA
wymaga PHP 7 i rozszerzenia
analizuje kod dowolnej wersji PHP
php-ast
PRZYKŁADY ŁAPANYCH BŁĘDÓW
function getNumber(): int 
{
}
// Method getnumber is declared to return int but has no return value
function tailParametersRequired($p1 = null, $p2) 
{
}
// Required argument follows optional
function oneParameter($i) 
{
}
oneParameter(1, 2); 
// Call with 2 arg(s) to oneparameter() which only takes 1 arg(s)
$arr = false;
if ($arr[1]) {
}
// Suspicious array access to bool
if (42 == [13, 37]) {
}
// int to array comparison 
if ([13, 37] == 'string') { 
}
// array to string comparison
$v = null;
if ($v instanceof Undef) { 
}
// Checking instanceof against undeclared class undef
/**
 * @return int
 */
function voidReturn() { 
    return null;
}
// Returning type null but voidreturn() is declared to return int
/**
 * @return int[]
 */
function oldComment() { 
    return ['to be or not to be']; 
}
// Returning type string[] but oldComment() is declared to return int[]
MOJE DOŚWIADCZENIA
TRUDNE POCZĄTKI
PHAN się wysypywał przy analizie Wordpressa
Pomogło cofnięcie wersji do release 0.2
Master został szybko poprawiony
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.
Błędy z rozpoznawaniem przestrzeni nazw
PhanSignatureMismatch Declaration of function 
buildForm(symfonycomponentformformbuilderinterface $builder, array $options
buildForm(SymfonyComponentFormformbuilderinterface $builder, array $options
Problem poprawiony w 1h od zgłoszenia
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
PIERWSZA PRÓBA
'directory_list' => [ 
    'src',
    'vendor', 
],
'exclude_analysis_directory_list' => [ 
    'vendor/' 
],
PIERWSZA PRÓBA
czas analizy > 30s
użyta pamięć > 2GB
OBECNIE
'file_list' => [ 
    'app/AppKernel.php', 
    'vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection
    // 87 innych plików z vendor 
    'vendor/symfony/symfony/src/Symfony/Component/Yaml/Yaml.php', 
],
'directory_list' => [ 
    'src',
],
'exclude_analysis_directory_list' => [ 
    'vendor/', 
],
OBECNIE
czas analizy < 2s
użyta pamięć - pomijalnie mało
UŻYCIE W NASZYM PROJEKCIE
testy u mnie: 1,5 miesiąca
reszta zespołu: 2 tygodnie
CI: planujemy od wersji 1.0
UŻYCIE W ETSY
od tygodnia (info z 19 lutego) działa produkcyjnie
blokuje deploymenty w przypadku wykrycia błędów
PODSUMOWANIE
PLUSY
aktywnie rozwijany
"oryginalne" AST
wykrywa problemy pomijane przez inne narzędzia
analizuje PhpDoc
dobry kontakt z developerami
MINUSY
aktywnie rozwijany
wersja z gałęzi master często nie działa
false positives
nie zgłasza problemów z @throws
dość nowy projekt - mało informacji w sieci
MINUSY
ZASTOSOWANIE
kolejne narzędzie do analizy kodu
wykrywa błędy zanim staną się problemem
wspiera podczas przeglądu kodu
LINKI
github.com/etsy/phan
Analyzing a Large Sloppy Code Base
kanał na gitter
PYTANIA?
UŻYWAŁEM PHAN ZANIM
TO BYŁO MODNE
/Tomasz Tybulewicz @tybulewicz

More Related Content

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