DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis...

29
GenevaJug #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico

Transcript of DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis...

Page 1: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

GenevaJug

#sonarqube#sonarlint

DIY:Java Static Analysis

Nicolas PERU - @benzonico

Page 2: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Ego boost

● Nicolas PERU - @benzonico ○ Java developer@SonarSource○ Developer in language team○ Geneva Jug enthusiast○ Cycle around the Leman

Page 3: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Sonar Java Plugin

● Back Story

Page 4: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Challenge

Get the language.

Page 5: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Lexical Analysis

class A { int b;}

Page 6: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Syntactic Analysis

class A { int b;}

Keywords

Identifiers

punctuators

Page 7: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Syntax Tree

+

3

2 1

+

1 + 2 + 3

interface BinaryExpressionTree {

ExpressionTree leftOperand();

SyntaxToken operatorToken();

ExpressionTree rightOperand();

}

Page 8: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Semantic Analysis

class A { int b; A(int b) { this.b = b; }}

Page 9: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Your turn now : Custom rules !

Page 10: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Beyond Semantic: Symbolic Execution

Page 11: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Page 12: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#0myObject != null

Page 13: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#0myObject != null

Program State#1myObject != nulla = false

Page 14: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#0myObject != null

Program State#1myObject != nulla = false

Program State#2myObject = nulla = true

Page 15: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#2myObject = nulla = true

Program State#1myObject != nulla = false

Page 16: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#1myObject != nulla = false

Page 17: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#1myObject != nulla = false

Program State#3...

Page 18: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#1myObject != nulla = false

Program State#3...

Page 19: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#2myObject = nulla = true

Program State#1myObject != nulla = false

Page 20: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#2myObject = nulla = true

Page 21: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#2myObject = nulla = true

Page 22: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString();}

Beyond Semantic: Symbolic Execution

Program State#2myObject = nulla = true

Program State#4myObject = nulla = true

Page 23: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Object myObject = new Object();// ... if ( a ) { myObject = null; }// ... if ( !a ) { /* … */ } else { myObject.toString(); // NPE}

Beyond Semantic: Symbolic Execution

Program State#2myObject = nulla = true

Program State#4myObject = nulla = true

Page 24: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Symbolic Execution challenges

● Complex conditions

if (a + 1 < (b * 10 - 39) ) { if ( b > a / 10 + 4 ) { … } // Always true}

Page 25: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

Symbolic Execution challenges

● Complex conditions

if (a + 1 < (b * 10 - 39) ) { if ( b > a / 10 + 4 ) { … } // Always true}

● Explosion of states

Page 27: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource

What’s next ?

Taint Analysis for vulnerabilities

Page 29: DIY: #sonarlint Java Static Analysis #sonarqube · #sonarqube #sonarlint DIY: Java Static Analysis Nicolas PERU - @benzonico. Ego boost Nicolas PERU - @benzonico Java developer@SonarSource