SlideShare une entreprise Scribd logo
1  sur  58
Télécharger pour lire hors ligne
L'analyse statique et
ses applications
Limoges, France, 2020
Agenda
Qu'est-ce que l'analyse statique
Comment ça fonctionne en PHP
Les usages de l'analyse statique
Qui va là?
Damien Seguy
CTO chez Exakat
Moteur d'analyse en PHP
Maison de retraite pour
elePHPants
Revue de code
Reading on the IDE
Revue de code
automatique
L'analyse statique, c'est quoi?
Revue
manuelle
Abstraction
haute
Revue simple
Systématique
Processus
Conversion du texte en tokens PHP
Ajouter des connaissances
Interroger la base de données
Analyse statique
Performances
Sécurité
Migration 8.0
Conformité
 
 

Tokenization
Base de données
Source
Rapport
Une étape de plus
Cache opcode
Optimisation
Fichier texte
Tokens / syntaxe
Analyse statique
Execution
Tokens PHP
token_get_all()
Commentaires, phpDoc, spaces
Delimiteurs : ' " () {} [] `
2 tokens sur 3 sont remisés
[248] => Array
(
[0] => 382
[1] =>
[2] => 167
)
[249] => Array
(
[0] => 319
[1] => define
[2] => 167
)
[250] => (
[251] => Array
(
[0] => 323
[1] => 'EXT'
[2] => 167
)
[252] => ,
[253] => Array
(
[0] => 382
[1] =>
[2] => 167
)
<?php
//....
define('EXT', '.php');
AST
<?php
$a = 1;
echo foo($a);
function foo($b) {
  if ($b % 2) {
    return $b / 2;
  } else {
    return $b * 3 + 1;
  }
}
Abstract
syntactic
tree
Grimpons dans l'arbre
Features PHP
Variable, Fonction,
Addition, Multiplication,
Ifthen, Return
Grimpons dans l'arbre
Paramètres, Variables
Propriétés, array variable,
object variable, static
property name, global
variable, static variable
Tout est uneT_VARIABLE
Compte de paramètres
Compte de variables locales
0,00
25,00
50,00
75,00
100,00
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
Grimpons dans l'arbre
Motif locals
$a = 1 + $b;
$a = $a + 1;
$z = $a + $b + $d - $b + $e;
Assignat
ion
$a Addition
LEFT RIGHT
$b
RIGHT
1
LEFT
Motif
Analyse
Analyse
PHP is not a tree
Link definitions with usage
Definitions and usage
Function and functioncalls
class X and instantiations
define('A') or const A and A or A
$variable and their hidden definition
AST
<?php
$a = 1;
echo foo($a);
function foo($b) {
  if ($b % 2) {
    return $b / 2;
  } else {
    return $b * 3 + 1;
  }
}
Définitions et usages
Definitions et usage
Définitions de fonctions
Paramètres
Appel de fonction
Arguments
Contexte
foo($a)
DEFINITION
function
foo($b)
$a = 2 NEXT echo $a
Sequence
NEXT
BLOCK
Definitions and usage
foo($a[1])
DEFINITION
function
foo($b)
foo($b)
foo($a)
foo($a)
DEFINITION
DEFINITION
DEFINITION
Définitions de fonctions
Paramètres
Appel de fonction
Arguments
Contexte
Definitions and usage
foo($a[1])
DEFINITION
function
foo($b)
Définitions de fonctions
Paramètres
Appel de fonction
Arguments
Contexte
What is that?
Un appel de fonction?
Definition multiple?
function
foo($b)
DEFINITION
foo($a)
function
foo($b)
function
foo($b)
function
foo($b)
DEFINITION
DEFINITION
DEFINITION
Fonctions mortes
<?php
function morte($z) { }
Fonctions mortes
Une fonctions sans lien
DEFINITION
function
foo($b)
Fonction morte
<?php
function morte($z) { }
Fonction morte (dur)
<?php
function morte($z) { }
Dead Function (Hard)
La propagation linéaire de
la mort
function
foob($b)
function
fooa($b)
DEFINITION
Fonction morte (très dur)
<?php
function morte($z) { }
Fonction morte (très dur)
Fonctions récursives
function
foo($b)
foo($a)
BLOCK
DEFINITION
EXPRESSION
Sequence
Fonction morte (hyper dur)
<?php
function morte($z) { }
Fonction morte (hyper dur)
Recursive, niveau 2
Recursive, niveau 3
Recursive, niveau 4…
DEFINITION
function
foob($b)
function
fooa($b)
DEFINITION
Fonction morte (hyper dur)
Recursive, niveau 2
Recursive, niveau 3
Recursive, niveau 4…
DEFINITION
function
foob($b)
function
fooa($b)
DEFINITION
function
fooc($b)
DEFINITION
Fonctions mortes
Pas d'appel de la fonction
Fonction appelée par des fonctions mortes
Fonctions recursive sans appel
Fonctions récursive, niveaux supérieurs
Et maintenant, alors?
Appel de fonction sans
définition
bar($a)
Fonctions sans définition
PHP extensions
Components
Elevation de l'abstraction
Composants
PHP Extensions
Code PHP
Identifier les extensions
API
Fonctions, constantes
Classes, interfaces, traits, espaces de noms
Directives de configuration
Extensions natives, PECL, independantes, maison
Extensions et leur usage
Extensions supprimées
APC, posix
Extensions ajoutées
AST, libsodium
Evolution des extensions
Nouvelle classe, fonctions obsolètes, corrections…
APIExt
PHP
code
Recognizing extensions
Recognizing frameworks
Identifier un composant
Composant
Versions
Classes
Méthodes
Arguments
Identifier un composant
Dépot de
code
Versions
Analyse
statique
Compatibilité
Exakat : stubs
Compatibilité
Vérification de la version de l'API
Vérification de l'usage de l'API
Validation de l'utilisation en contexte :
error_reporting(E_ERROR | E_WARNING | E_PARSE)
Analyse de sécurité
Quels usages de l'AS
Suivi de production
Vérifications des bugs, suivi des conventions,
Veille technologique
Préparation PHP 8.0, typage fort
Documentation
Inventaires, statistiques
Personnalisation
Préférence de codage, Capitalisation
Suivi de production
/src/templates/source.phtml:1 Php/BetterRand Use random_int() rand( )
/src/controllers/Sources.php:101 Php/BetterRand Use random_int() rand( )
/src/helpers/Color.php:28 Php/BetterRand Use random_int() mt_rand(0, 255)
/src/spouts/twitter/usertimeline.php:97 Functions/HardcodedPasswords Hardcoded Passwords ['cons
/src/spouts/twitter/listtimeline.php:14 Functions/HardcodedPasswords Hardcoded Passwords $this-
/src/helpers/ContentLoader.php:328 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($thumbn
/src/helpers/ContentLoader.php:356 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($lastic
/src/helpers/ContentLoader.php:361 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($icon)
/src/helpers/ContentLoader.php:366 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($icon)
/src/helpers/ContentLoader.php:324 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($thumbn
/src/helpers/ContentLoader.php:115 Security/NoNetForXmlLoad No Net For Xml Load $spout->load(jso
/src/helpers/ContentLoader.php:405 Security/NoNetForXmlLoad No Net For Xml Load $spout->load($da
/src/spouts/rss/feed.php:80 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($id)
/src/spouts/rss/feed.php:62 Security/NoNetForXmlLoad No Net For Xml Load $this->feed->load(htmlspe
/src/spouts/reddit/reddit2.php:102 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($id)
/src/controllers/Opml/Import.php:207 Security/AvoidThoseCrypto Avoid Those Hash Functions md5($title
/src/controllers/Opml/Import.php:76 Security/NoNetForXmlLoad No Net For Xml Load simplexml_load_f
/src/controllers/Opml/Import.php:76 Security/IndirectInjection Indirect Injection simplexml_load_file(
/src/controllers/Opml/Import.php:67 Security/IndirectInjection Indirect Injection 'Unsupported file ty
/run.php:17 Security/AnchorRegex Always Anchor Regex preg_match('/(favicons|thumbnails)/', $_SER
/run.php:18 Security/DirectInjection Direct Injection 'Location: /data' . $_SERVER['REQUEST_URI']
/run.php:23 Security/DirectInjection Direct Injection 'Location: /public' . $_SERVER['REQUEST_URI
/src/daos/Sources.php:133 Security/AnchorRegex Always Anchor Regex preg_match("[A-Za-Z._b]+", $v
/src/daos/Sources.php:141 Security/AnchorRegex Always Anchor Regex preg_match("[A-Za-Z0-9._b]+",
/src/spouts/rss/golem.php:89 Security/AnchorRegex Always Anchor Regex preg_match_all('|<!--cont
/src/helpers/ViewHelper.php:52 Security/AnchorRegex Always Anchor Regex preg_match('/bwidth=(['
/src/helpers/ViewHelper.php:55 Security/AnchorRegex Always Anchor Regex preg_match('/bheight=([
/src/helpers/Image.php:154 Security/AnchorRegex Always Anchor Regex preg_match('#<svg[s>]#si', $
Format Text (format machine : xml, json, sqlite…)
Suivi de production-------------------------------------------------------
line /src/common.php
-------------------------------------------------------
221 Unresolved Instanceof
223 Unresolved Instanceof
-------------------------------------------------------
-------------------------------------------------------
line /src/spouts/twitter/usertimeline.php
-------------------------------------------------------
22 Locally Unused Property
25 Locally Unused Property
28 Locally Unused Property
143 Undefined Caught Exceptions
143 Unresolved Catch
176 Unused Methods
184 Unused Methods
192 Unused Methods
210 Unused Methods
240 Unused Methods
253 Unused Methods
263 Unused Methods
277 Unused Methods
288 Unused Methods
-------------------------------------------------------
-------------------------------------------------------
Format Perfile (lecture humaine)
Veille technologique
Format Compatibility (lecture humaine)
Veille technologique
Format Type hint suggestion (lecture humai
Documentation
Format Text (format machine : xml, json, sqlite…)
Documentation
Format HTML (format humain)
Documentation
Format HTML (format humain)
Documentation
Format Stats (format humain)
Personnalisation
Format Stats (format humain)
Personnalisation
Format php-cs-fixer config
Personnalisation
Format PHP ou JSON
Merci
@exakat / https://www.exakat.io/
Analyse statique et applications

Contenu connexe

Tendances

.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHPAbdoulaye Dieng
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPierre Faure
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Alexis Sukrieh
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaPatrick Allaert
 
Formation PHP
Formation PHPFormation PHP
Formation PHPkemenaran
 
A la recherche du code mort
A la recherche du code mortA la recherche du code mort
A la recherche du code mortDamien Seguy
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelleMICHRAFY MUSTAFA
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEMarouan OMEZZINE
 
ALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlleALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlleAlexandru Radovici
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql courszan
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scalaSOAT
 
Per lameliorer
Per lameliorerPer lameliorer
Per lameliorerTECOS
 

Tendances (20)

.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP.php1 : les fondamentaux du PHP
.php1 : les fondamentaux du PHP
 
Php 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVCPhp 2 - Approfondissement MySQL, PDO et MVC
Php 2 - Approfondissement MySQL, PDO et MVC
 
Audits php
Audits phpAudits php
Audits php
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Coat::Persistent at FPW2009
Coat::Persistent at FPW2009
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
 
Formation PHP
Formation PHPFormation PHP
Formation PHP
 
A la recherche du code mort
A la recherche du code mortA la recherche du code mort
A la recherche du code mort
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Nouveautés php 7
Nouveautés php 7Nouveautés php 7
Nouveautés php 7
 
ALF 6 - Parser Bottom-Up
ALF 6 - Parser Bottom-UpALF 6 - Parser Bottom-Up
ALF 6 - Parser Bottom-Up
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINEIntroduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
Introduction au langage PHP (1ere partie) élaborée par Marouan OMEZZINE
 
ALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlleALF 11 - Diagrame de flux de controlle
ALF 11 - Diagrame de flux de controlle
 
ALF 8 - Generation du code
ALF 8 - Generation du codeALF 8 - Generation du code
ALF 8 - Generation du code
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql cours
 
Introduction à scala
Introduction à scalaIntroduction à scala
Introduction à scala
 
Per lameliorer
Per lameliorerPer lameliorer
Per lameliorer
 

Similaire à Analyse statique et applications

Comment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerDamien Seguy
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Mickael Perraud
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLHervé Leclerc
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP EL JAOUARI Ahmed
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitementMadeline Pinthon
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend FrameworkMickael Perraud
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP NextSQLI
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un bliantareq
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilanteejug
 
Développement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfDéveloppement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfYasushiTsubakik
 

Similaire à Analyse statique et applications (20)

Comment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguerComment relire du code pourri sans se fatiguer
Comment relire du code pourri sans se fatiguer
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
Php4 Mysql
Php4 MysqlPhp4 Mysql
Php4 Mysql
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
Spring 3.0
Spring 3.0Spring 3.0
Spring 3.0
 
Les principes de base de PHP
 Les principes de base de PHP  Les principes de base de PHP
Les principes de base de PHP
 
Php cours
Php coursPhp cours
Php cours
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitement
 
Tester les applications Zend Framework
Tester les applications Zend FrameworkTester les applications Zend Framework
Tester les applications Zend Framework
 
Apprenez le jQuery
Apprenez le jQueryApprenez le jQuery
Apprenez le jQuery
 
PHP 5.3, PHP Next
PHP 5.3, PHP NextPHP 5.3, PHP Next
PHP 5.3, PHP Next
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
Java 5, un blian
Java 5, un blianJava 5, un blian
Java 5, un blian
 
Java 5, un bilan
Java 5,  un bilanJava 5,  un bilan
Java 5, un bilan
 
Services rest & jersey
Services rest & jerseyServices rest & jersey
Services rest & jersey
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Développement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdfDéveloppement Web- PHP (partie I).pdf
Développement Web- PHP (partie I).pdf
 

Plus de Damien Seguy

Strong typing @ php leeds
Strong typing  @ php leedsStrong typing  @ php leeds
Strong typing @ php leedsDamien Seguy
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationDamien Seguy
 
Top 10 pieges php afup limoges
Top 10 pieges php   afup limogesTop 10 pieges php   afup limoges
Top 10 pieges php afup limogesDamien Seguy
 
Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Damien Seguy
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confooDamien Seguy
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Damien Seguy
 
Top 10 php classic traps php serbia
Top 10 php classic traps php serbiaTop 10 php classic traps php serbia
Top 10 php classic traps php serbiaDamien Seguy
 
Top 10 php classic traps
Top 10 php classic trapsTop 10 php classic traps
Top 10 php classic trapsDamien Seguy
 
Top 10 chausse trappes
Top 10 chausse trappesTop 10 chausse trappes
Top 10 chausse trappesDamien Seguy
 
Code review workshop
Code review workshopCode review workshop
Code review workshopDamien Seguy
 
Understanding static analysis php amsterdam 2018
Understanding static analysis   php amsterdam 2018Understanding static analysis   php amsterdam 2018
Understanding static analysis php amsterdam 2018Damien Seguy
 
Review unknown code with static analysis php ce 2018
Review unknown code with static analysis   php ce 2018Review unknown code with static analysis   php ce 2018
Review unknown code with static analysis php ce 2018Damien Seguy
 
Everything new with PHP 7.3
Everything new with PHP 7.3Everything new with PHP 7.3
Everything new with PHP 7.3Damien Seguy
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)Damien Seguy
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCDamien Seguy
 
Review unknown code with static analysis php ipc 2018
Review unknown code with static analysis   php ipc 2018Review unknown code with static analysis   php ipc 2018
Review unknown code with static analysis php ipc 2018Damien Seguy
 
Code review for busy people
Code review for busy peopleCode review for busy people
Code review for busy peopleDamien Seguy
 
Static analysis saved my code tonight
Static analysis saved my code tonightStatic analysis saved my code tonight
Static analysis saved my code tonightDamien Seguy
 
Machine learning in php las vegas
Machine learning in php   las vegasMachine learning in php   las vegas
Machine learning in php las vegasDamien Seguy
 
Review unknown code with static analysis Zend con 2017
Review unknown code with static analysis  Zend con 2017Review unknown code with static analysis  Zend con 2017
Review unknown code with static analysis Zend con 2017Damien Seguy
 

Plus de Damien Seguy (20)

Strong typing @ php leeds
Strong typing  @ php leedsStrong typing  @ php leeds
Strong typing @ php leeds
 
Strong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisationStrong typing : adoption, adaptation and organisation
Strong typing : adoption, adaptation and organisation
 
Top 10 pieges php afup limoges
Top 10 pieges php   afup limogesTop 10 pieges php   afup limoges
Top 10 pieges php afup limoges
 
Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020Top 10 php classic traps DPC 2020
Top 10 php classic traps DPC 2020
 
Top 10 php classic traps confoo
Top 10 php classic traps confooTop 10 php classic traps confoo
Top 10 php classic traps confoo
 
Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4Tout pour se préparer à PHP 7.4
Tout pour se préparer à PHP 7.4
 
Top 10 php classic traps php serbia
Top 10 php classic traps php serbiaTop 10 php classic traps php serbia
Top 10 php classic traps php serbia
 
Top 10 php classic traps
Top 10 php classic trapsTop 10 php classic traps
Top 10 php classic traps
 
Top 10 chausse trappes
Top 10 chausse trappesTop 10 chausse trappes
Top 10 chausse trappes
 
Code review workshop
Code review workshopCode review workshop
Code review workshop
 
Understanding static analysis php amsterdam 2018
Understanding static analysis   php amsterdam 2018Understanding static analysis   php amsterdam 2018
Understanding static analysis php amsterdam 2018
 
Review unknown code with static analysis php ce 2018
Review unknown code with static analysis   php ce 2018Review unknown code with static analysis   php ce 2018
Review unknown code with static analysis php ce 2018
 
Everything new with PHP 7.3
Everything new with PHP 7.3Everything new with PHP 7.3
Everything new with PHP 7.3
 
Php 7.3 et ses RFC (AFUP Toulouse)
Php 7.3 et ses RFC  (AFUP Toulouse)Php 7.3 et ses RFC  (AFUP Toulouse)
Php 7.3 et ses RFC (AFUP Toulouse)
 
Tout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFCTout sur PHP 7.3 et ses RFC
Tout sur PHP 7.3 et ses RFC
 
Review unknown code with static analysis php ipc 2018
Review unknown code with static analysis   php ipc 2018Review unknown code with static analysis   php ipc 2018
Review unknown code with static analysis php ipc 2018
 
Code review for busy people
Code review for busy peopleCode review for busy people
Code review for busy people
 
Static analysis saved my code tonight
Static analysis saved my code tonightStatic analysis saved my code tonight
Static analysis saved my code tonight
 
Machine learning in php las vegas
Machine learning in php   las vegasMachine learning in php   las vegas
Machine learning in php las vegas
 
Review unknown code with static analysis Zend con 2017
Review unknown code with static analysis  Zend con 2017Review unknown code with static analysis  Zend con 2017
Review unknown code with static analysis Zend con 2017
 

Analyse statique et applications