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

Post on 22-Jan-2017

303 views 1 download

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

STATYCZNA ANALIZAKODU 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 ETSYwiększość zmian autorstwa Andrew Morrisona

DZIAŁANIE

WYMAGANIAwymaga 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(\symfony\component\form\formbuilderinterface $builder, array $optionsbuildForm(\Symfony\Component\Form\formbuilderinterface $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ÓBAczas analizy > 30sużyta pamięć > 2GB

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/', ],

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

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

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

PODSUMOWANIE

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

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

MINUSY

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

PYTANIA?

UŻYWAŁEM PHAN ZANIMTO BYŁO MODNE

/ Tomasz Tybulewicz @tybulewicz