Slide 1

Slide 1 text

STATYCZNA ANALIZA KODU PHP Z PHAN / Tomasz Tybulewicz @tybulewicz

Slide 2

Slide 2 text

HISTORIA

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

OBECNIE ROZWIJANY W ETSY większość zmian autorstwa Andrew Morrisona

Slide 7

Slide 7 text

DZIAŁANIE

Slide 8

Slide 8 text

WYMAGANIA wymaga PHP 7 i rozszerzenia analizuje kod dowolnej wersji PHP php-ast

Slide 9

Slide 9 text

PRZYKŁADY ŁAPANYCH BŁĘDÓW

Slide 10

Slide 10 text

f u n c t i o n g e t N u m b e r ( ) : i n t { } / / M e t h o d \ g e t n u m b e r i s d e c l a r e d t o r e t u r n i n t b u t h a s n o r e t u r n v a l u e

Slide 11

Slide 11 text

f u n c t i o n t a i l P a r a m e t e r s R e q u i r e d ( $ p 1 = n u l l , $ p 2 ) { } / / R e q u i r e d a r g u m e n t f o l l o w s o p t i o n a l

Slide 12

Slide 12 text

f u n c t i o n o n e P a r a m e t e r ( $ i ) { } o n e P a r a m e t e r ( 1 , 2 ) ; / / C a l l w i t h 2 a r g ( s ) t o \ o n e p a r a m e t e r ( ) w h i c h o n l y t a k e s 1 a r g ( s )

Slide 13

Slide 13 text

$ a r r = f a l s e ; i f ( $ a r r [ 1 ] ) { } / / S u s p i c i o u s a r r a y a c c e s s t o b o o l

Slide 14

Slide 14 text

i f ( 4 2 = = [ 1 3 , 3 7 ] ) { } / / i n t t o a r r a y c o m p a r i s o n i f ( [ 1 3 , 3 7 ] = = ' s t r i n g ' ) { } / / a r r a y t o s t r i n g c o m p a r i s o n

Slide 15

Slide 15 text

$ v = n u l l ; i f ( $ v i n s t a n c e o f U n d e f ) { } / / C h e c k i n g i n s t a n c e o f a g a i n s t u n d e c l a r e d c l a s s \ u n d e f

Slide 16

Slide 16 text

/ * * * @ r e t u r n i n t * / f u n c t i o n v o i d R e t u r n ( ) { r e t u r n n u l l ; } / / R e t u r n i n g t y p e n u l l b u t v o i d r e t u r n ( ) i s d e c l a r e d t o r e t u r n i n t

Slide 17

Slide 17 text

/ * * * @ r e t u r n i n t [ ] * / f u n c t i o n o l d C o m m e n t ( ) { r e t u r n [ ' t o b e o r n o t t o b e ' ] ; } / / R e t u r n i n g t y p e s t r i n g [ ] b u t o l d C o m m e n t ( ) i s d e c l a r e d t o r e t u r n i n t [ ]

Slide 18

Slide 18 text

MOJE DOŚWIADCZENIA

Slide 19

Slide 19 text

TRUDNE POCZĄTKI

Slide 20

Slide 20 text

PHAN się wysypywał przy analizie Wordpressa Pomogło cofnięcie wersji do release 0.2 Master został szybko poprawiony

Slide 21

Slide 21 text

Błędy związane z klasami z rozszerzeń P r o p e r t y o f u n d e c l a r e d t y p e \ m e m c a c h e d C a l l t o m e t h o d g e t f r o m u n d e c l a r e d c l a s s \ m e m c a c h e d Moje PHP 7 nie miało wkompilowanego tego rozszerzenia, dodałem do analizy plik "nagłówkowy" z definicją interface'u.

Slide 22

Slide 22 text

Błędy z rozpoznawaniem przestrzeni nazw P h a n S i g n a t u r e M i s m a t c h D e c l a r a t i o n o f f u n c t i o n b u i l d F o r m ( \ s y m f o n y \ c o m p o n e n t \ f o r m \ f o r m b u i l d e r i n t e r f a c e $ b u i l d e r , a r r a y $ o p t i o n s b u i l d F o r m ( \ S y m f o n y \ C o m p o n e n t \ F o r m \ f o r m b u i l d e r i n t e r f a c e $ b u i l d e r , a r r a y $ o p t i o n s Problem poprawiony w 1h od zgłoszenia

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

PIERWSZA PRÓBA ' d i r e c t o r y _ l i s t ' = > [ ' s r c ' , ' v e n d o r ' , ] , ' e x c l u d e _ a n a l y s i s _ d i r e c t o r y _ l i s t ' = > [ ' v e n d o r / ' ] ,

Slide 25

Slide 25 text

PIERWSZA PRÓBA czas analizy > 30s użyta pamięć > 2GB

Slide 26

Slide 26 text

OBECNIE ' f i l e _ l i s t ' = > [ ' a p p / A p p K e r n e l . p h p ' , ' v e n d o r / d o c t r i n e / c o l l e c t i o n s / l i b / D o c t r i n e / C o m m o n / C o l l e c t i o n s / A r r a y C o l l e c t i o n / / 8 7 i n n y c h p l i k ó w z v e n d o r ' v e n d o r / s y m f o n y / s y m f o n y / s r c / S y m f o n y / C o m p o n e n t / Y a m l / Y a m l . p h p ' , ] , ' d i r e c t o r y _ l i s t ' = > [ ' s r c ' , ] , ' e x c l u d e _ a n a l y s i s _ d i r e c t o r y _ l i s t ' = > [ ' v e n d o r / ' , ] ,

Slide 27

Slide 27 text

OBECNIE czas analizy < 2s użyta pamięć - pomijalnie mało

Slide 28

Slide 28 text

UŻYCIE W NASZYM PROJEKCIE testy u mnie: 1,5 miesiąca reszta zespołu: 2 tygodnie CI: planujemy od wersji 1.0

Slide 29

Slide 29 text

UŻYCIE W ETSY od tygodnia (info z 19 lutego) działa produkcyjnie blokuje deploymenty w przypadku wykrycia błędów

Slide 30

Slide 30 text

PODSUMOWANIE

Slide 31

Slide 31 text

PLUSY aktywnie rozwijany "oryginalne" AST wykrywa problemy pomijane przez inne narzędzia analizuje PhpDoc dobry kontakt z developerami

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

MINUSY

Slide 34

Slide 34 text

ZASTOSOWANIE kolejne narzędzie do analizy kodu wykrywa błędy zanim staną się problemem wspiera podczas przeglądu kodu

Slide 35

Slide 35 text

LINKI github.com/etsy/phan Analyzing a Large Sloppy Code Base kanał na gitter

Slide 36

Slide 36 text

PYTANIA?

Slide 37

Slide 37 text

UŻYWAŁEM PHAN ZANIM TO BYŁO MODNE / Tomasz Tybulewicz @tybulewicz