SlideShare une entreprise Scribd logo
1  sur  28
Télécharger pour lire hors ligne
Static Checking of Safety
Critical Java Annotations
Daniel Tang, Ales Plsek, Jan Vitek
http://www.ovmj.net/oscj/
S3 Lab, Purdue University
oSCJOpen Safety-Critical Java
Wednesday, September 15, 2010
API Visibility
public abstract class PeriodicEventHandler
extends ManagedEventHandler
implements Runnable {
public PeriodicEventHandler(...) ...
public ReleaseParameters getReleaseParameters() ...
public final void run() {...}
Wednesday, September 15, 2010
API Visibility
@SCJAllowed(LEVEL_0, members=true)
class M extends CyclicExecutive {
public void initialize() {
PEH p = new PEH(...);
p.run();
...
@SCJAllowed(LEVEL_0, members=true)
class PEH extends PeriodicEventHandler {
public ReleaseParameters getReleaseParameters(){
public void handleEvent() {...} ...
}
Wednesday, September 15, 2010
API Visibility
@SCJAllowed(LEVEL_0)
public abstract class PeriodicEventHandler
extends ManagedEventHandler
implements Runnable {
public PeriodicEventHandler(...) ...
@SCJAllowed(LEVEL_2)
public ReleaseParameters getReleaseParameters() ...
@SCJAllowed(INFRASTRUCTURE)
public final void run() {}
Wednesday, September 15, 2010
Level Compliance Annotations
parameter
s
values
@SCJAllowed
value
LEVEL_0
@SCJAllowed
value
LEVEL_1
@SCJAllowed
value
LEVEL_2
@SCJAllowed
value
SUPPORT
@SCJAllowed
value
INFRASTRUCTURE
@SCJAllowed
value
HIDDEN (default)
@SCJAllowed
members
TRUE
@SCJAllowed
members
FALSE (default)
Wednesday, September 15, 2010
Phase Restrictions
USER CODE
Wednesday, September 15, 2010
Phase Restrictions
USER CODE
class M extends CyclicExecutive {
public void setUp() {...}
public void tearDown() {...}
}
Wednesday, September 15, 2010
Phase Restrictions
USER CODE
class M extends CyclicExecutive {
public void setUp() {...}
public void tearDown() {...}
}
@SCJAllowed(LEVEL_0, members=true)
class PEH extends
PeriodicEventHandler {
public void handleEvent() {
new PEH(...);
...
getCurrentMission().tearDown();
Wednesday, September 15, 2010
Phase Restrictions
USER CODE
Wednesday, September 15, 2010
Phase Restrictions
USER CODE
class M extends CyclicExecutive {
...
@SCJRestricted(INITIALIZATION)
public void setUp() {...}
@SCJRestricted(CLEANUP)
public void tearDown() {...}
}
Wednesday, September 15, 2010
Phase Restrictions
USER CODE
class M extends CyclicExecutive {
...
@SCJRestricted(INITIALIZATION)
public void setUp() {...}
@SCJRestricted(CLEANUP)
public void tearDown() {...}
}
@SCJAllowed(LEVEL_0, members=true)
class PEH extends PeriodicEventHandler {
SCJRestricted(EXECUTION)
public void handleEvent() {
new PEH(...);
...
getCurrentMission().tearDown();
...
Wednesday, September 15, 2010
Phase Annotations
•
parameters values
@SCJRestricted
value
INITIALIZATION
@SCJRestricted
value RUN
@SCJRestricted
value
CLEANUP
@SCJRestricted
value
ALL (default)
Wednesday, September 15, 2010
Behavior Restrictions
@SCJAllowed(LEVEL_1)
public class IH extends InterruptHandler{
@SCJRestricted(mayAllocate=false,
maySelfSuspend=false)
protected void handleInterrupt() {
foo();
}
protected void foo() {
new PEH(...);
sleep(); ...
Wednesday, September 15, 2010
Behavior Restrictions
@SCJAllowed(LEVEL_1)
public class IH extends InterruptHandler{
@SCJRestricted(mayAllocate=false,
maySelfSuspend=false)
protected void handleInterrupt() {
foo();
}
@SCJRestricted(mayAllocate=false,
maySelfSuspend=false)
protected void foo() {
new PEH(...);
sleep();
Wednesday, September 15, 2010
Behavior Restrictions
parameters values
@SCJRestricted
mayAllocate
TRUE (default)
@SCJRestricted
mayAllocate
FALSE
@SCJRestricted
maySelfSuspend
TRUE
@SCJRestricted
maySelfSuspend
FALSE (default)
Wednesday, September 15, 2010
Memory Safety
class PEH extends PeriodicEventHandler {
Data data;
public void handleEvent() {
R r = new R(this);
ManagedMemory.getCurrentManagedMemory().
enterPrivateMemory(3000, r); ...
class R implements Runnable {
PEH p;
public void run() { p.data = new Data(); }
}
class Data { ... }
Wednesday, September 15, 2010
Memory Safety
class PEH extends PeriodicEventHandler {
Data data;
public void handleEvent() {
R r = new R(this);
ManagedMemory.getCurrentManagedMemory().
enterPrivateMemory(3000, r); ...
class R implements Runnable {
PEH p;
public void run() { p.data = new Data(); }
}
class Data { ... }
Wednesday, September 15, 2010
Memory Safety
class PEH extends PeriodicEventHandler {
Data data;
R r = new R(this);
enterPrivateMemory(r); ...
class R implements Runnable {
PEH p;
pp.data = new Data(); }
}
class Data
data
new Data()
PEHMission
Memory
PEH
Memory
Runnable
Memory
Wednesday, September 15, 2010
Memory Safety
@Scope("M") @RunsIn("PEH")
class PEH extends PeriodicEventHandler {
Data data;
public void handleEvent() {
@DefineScope(name="R", parent="PEH")
R r = new R(this);
ManagedMemory.getCurrentManagedMemory().
enterPrivateMemory(3000, r); ...
@Scope("PEH") @RunsIn("R")
class R implements Runnable {
PEH p;
public void run() { p.data = new Data(); }
}
@Scope("R") class Data { ... }
Wednesday, September 15, 2010
Memory Safety
@Scope("M") @RunsIn("PEH")
class PEH extends PeriodicEventHandler {
Data data;
public void handleEvent() {
@DefineScope(name="R", parent="PEH")
R r = new R(this);
ManagedMemory.getCurrentManagedMemory().
enterPrivateMemory(3000, r); ...
@Scope("PEH") @RunsIn("R")
class R implements Runnable {
PEH p;
public void run() { p.data = new Data(); }
}
@Scope("R") class Data { ... }
Wednesday, September 15, 2010
Memory Safety Annotations
parameters values
@DefineScope
name a name of newly defined scope
@DefineScope
parent a parenting scope of a new scope
@Scope name a name of scope in which the object is allocated
@RunsIn name name of scope where a method will allocate
Wednesday, September 15, 2010
@Scope
@Scope("M") @RunsIn("PEH")
class PEH extends PeriodicEventHandler {
... new Data() ....
}
@Scope("PEH") @RunsIn("R")
class R implements Runnable {
... new Data() ...
}
@Scope("R") class Data { ... }
Wednesday, September 15, 2010
Objects with no @Scope
@Scope("M") @RunsIn("PEH")
class PEH extends PeriodicEventHandler {
... new Data() ....
}
@Scope("PEH") @RunsIn("R")
class R implements Runnable {
... new Data() ...
}
class Data { ... }
Wednesday, September 15, 2010
Class and Fields
@Scope("M") @RunsIn("PEH")
class Clazz {
Field f;
Data d;
@RunsIn("R")
public void foo(Data d) {
this.d = d; d may not reside in immortal
}
}
@Scope("R") class Field { ... }
class Data { ... } no @Scope annotation
Field must be in the same or
parent scope
Wednesday, September 15, 2010
Class Casting
@Scope("PEH") @RunsIn("R")
class R implements Runnable {
... Foo f = (Foo) new Data() ...
}
class Foo { ... }
@Scope("R") class Data extends Foo { ... }
Wednesday, September 15, 2010
Enter Child Scope
@Scope("M") @RunsIn("PEH")
class PEH
...
@DefineScope(name="R", parent="PEH")
R r = new R(this);
ManagedMemory.getCurrentManagedMemory().
enterPrivateMemory(3000, r); ...
@DefineScope(name="R2", parent="PEH")
R r2 = new R(this); ....
@Scope("PEH") @RunsIn("R")
class R implements Runnable { ...}
Wednesday, September 15, 2010
Conclusion
• Checker Implementation
• Java 7 Checker Framework
• Compile-time checking (Eclipse plugin coming soon)
• Evaluation
• miniCDj benchmark Case Study
• ~100 annotations, ~100 examples in the Checker distribution
• @SCJAllowed and @SCJRestricted easy to use
• Memory safety annotations
• Sometimes overly restrictive, resulting in class duplication
Wednesday, September 15, 2010
Safety Critical Java
• High level story: Java for safety critical systems
• Safety critical systems may cause harm to persons if they fail, so they require
vigorous certifications
• SCJ compliance levels
• Java annotations may help the certification process
• A mechanism for adding metadata to Java constructs for compile-time or
run-time processing
• Java annotations preserved in the bytecode as well
• Enhanced in Java 7 by allowing use in more constructs, enabling
construction of pluggable type systems in Java
Wednesday, September 15, 2010

Contenu connexe

En vedette

Soleil: A Component Framework for RTSJ
Soleil: A Component Framework for RTSJSoleil: A Component Framework for RTSJ
Soleil: A Component Framework for RTSJ
Aleš Plšek
 
Crash presentation for class
Crash presentation for classCrash presentation for class
Crash presentation for class
abdul khan
 

En vedette (10)

balashsa
balashsabalashsa
balashsa
 
Watching
WatchingWatching
Watching
 
Open Safety-Critical Java
Open Safety-Critical JavaOpen Safety-Critical Java
Open Safety-Critical Java
 
Soleil: A Component Framework for RTSJ
Soleil: A Component Framework for RTSJSoleil: A Component Framework for RTSJ
Soleil: A Component Framework for RTSJ
 
Crash presentation for class
Crash presentation for classCrash presentation for class
Crash presentation for class
 
People On The Move
People On The MovePeople On The Move
People On The Move
 
Sumer
SumerSumer
Sumer
 
Real-time Programming in Java
Real-time Programming in JavaReal-time Programming in Java
Real-time Programming in Java
 
The World of Google: US Vs. Europe
The World of Google: US Vs. EuropeThe World of Google: US Vs. Europe
The World of Google: US Vs. Europe
 
Beyond 10 Blue Links: The Future of Ranking
Beyond 10 Blue Links: The Future of RankingBeyond 10 Blue Links: The Future of Ranking
Beyond 10 Blue Links: The Future of Ranking
 

Similaire à Static Checker for Safety-Critical Java Annotations

CDI do básico ao avançado
CDI do básico ao avançadoCDI do básico ao avançado
CDI do básico ao avançado
Alberto Souza
 
Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요
Chang W. Doh
 
Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good code
Giordano Scalzo
 

Similaire à Static Checker for Safety-Critical Java Annotations (20)

How to Start Test-Driven Development in Legacy Code
How to Start Test-Driven Development in Legacy CodeHow to Start Test-Driven Development in Legacy Code
How to Start Test-Driven Development in Legacy Code
 
JUnit 5
JUnit 5JUnit 5
JUnit 5
 
Java Class Design
Java Class DesignJava Class Design
Java Class Design
 
[PL] O klasycznej, programistycznej elegancji
[PL] O klasycznej, programistycznej elegancji[PL] O klasycznej, programistycznej elegancji
[PL] O klasycznej, programistycznej elegancji
 
Migrating to JUnit 5
Migrating to JUnit 5Migrating to JUnit 5
Migrating to JUnit 5
 
Generic Types in Java (for ArtClub @ArtBrains Software)
Generic Types in Java (for ArtClub @ArtBrains Software)Generic Types in Java (for ArtClub @ArtBrains Software)
Generic Types in Java (for ArtClub @ArtBrains Software)
 
CDI do básico ao avançado
CDI do básico ao avançadoCDI do básico ao avançado
CDI do básico ao avançado
 
So how do I test my Sling application?
 So how do I test my Sling application? So how do I test my Sling application?
So how do I test my Sling application?
 
OOP Lab Report.docx
OOP Lab Report.docxOOP Lab Report.docx
OOP Lab Report.docx
 
Java generics
Java genericsJava generics
Java generics
 
In kor we Trust
In kor we TrustIn kor we Trust
In kor we Trust
 
Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요Kotlin, 어떻게 동작하나요
Kotlin, 어떻게 동작하나요
 
Static keyword.pptx
Static keyword.pptxStatic keyword.pptx
Static keyword.pptx
 
Functional Programming You Already Know - Kevlin Henney - Codemotion Rome 2015
Functional Programming You Already Know - Kevlin Henney - Codemotion Rome 2015Functional Programming You Already Know - Kevlin Henney - Codemotion Rome 2015
Functional Programming You Already Know - Kevlin Henney - Codemotion Rome 2015
 
Retour sur la Microsoft //Build 2018
Retour sur la Microsoft //Build 2018Retour sur la Microsoft //Build 2018
Retour sur la Microsoft //Build 2018
 
Dev Day Andreas Roth.pdf
Dev Day Andreas Roth.pdfDev Day Andreas Roth.pdf
Dev Day Andreas Roth.pdf
 
Oop objects_classes
Oop objects_classesOop objects_classes
Oop objects_classes
 
Better Software: introduction to good code
Better Software: introduction to good codeBetter Software: introduction to good code
Better Software: introduction to good code
 
Effective java-3rd-edition-ch4
Effective java-3rd-edition-ch4Effective java-3rd-edition-ch4
Effective java-3rd-edition-ch4
 
Paradigmas de linguagens de programacao - aula#9
Paradigmas de linguagens de programacao - aula#9Paradigmas de linguagens de programacao - aula#9
Paradigmas de linguagens de programacao - aula#9
 

Static Checker for Safety-Critical Java Annotations

  • 1. Static Checking of Safety Critical Java Annotations Daniel Tang, Ales Plsek, Jan Vitek http://www.ovmj.net/oscj/ S3 Lab, Purdue University oSCJOpen Safety-Critical Java Wednesday, September 15, 2010
  • 2. API Visibility public abstract class PeriodicEventHandler extends ManagedEventHandler implements Runnable { public PeriodicEventHandler(...) ... public ReleaseParameters getReleaseParameters() ... public final void run() {...} Wednesday, September 15, 2010
  • 3. API Visibility @SCJAllowed(LEVEL_0, members=true) class M extends CyclicExecutive { public void initialize() { PEH p = new PEH(...); p.run(); ... @SCJAllowed(LEVEL_0, members=true) class PEH extends PeriodicEventHandler { public ReleaseParameters getReleaseParameters(){ public void handleEvent() {...} ... } Wednesday, September 15, 2010
  • 4. API Visibility @SCJAllowed(LEVEL_0) public abstract class PeriodicEventHandler extends ManagedEventHandler implements Runnable { public PeriodicEventHandler(...) ... @SCJAllowed(LEVEL_2) public ReleaseParameters getReleaseParameters() ... @SCJAllowed(INFRASTRUCTURE) public final void run() {} Wednesday, September 15, 2010
  • 7. Phase Restrictions USER CODE class M extends CyclicExecutive { public void setUp() {...} public void tearDown() {...} } Wednesday, September 15, 2010
  • 8. Phase Restrictions USER CODE class M extends CyclicExecutive { public void setUp() {...} public void tearDown() {...} } @SCJAllowed(LEVEL_0, members=true) class PEH extends PeriodicEventHandler { public void handleEvent() { new PEH(...); ... getCurrentMission().tearDown(); Wednesday, September 15, 2010
  • 10. Phase Restrictions USER CODE class M extends CyclicExecutive { ... @SCJRestricted(INITIALIZATION) public void setUp() {...} @SCJRestricted(CLEANUP) public void tearDown() {...} } Wednesday, September 15, 2010
  • 11. Phase Restrictions USER CODE class M extends CyclicExecutive { ... @SCJRestricted(INITIALIZATION) public void setUp() {...} @SCJRestricted(CLEANUP) public void tearDown() {...} } @SCJAllowed(LEVEL_0, members=true) class PEH extends PeriodicEventHandler { SCJRestricted(EXECUTION) public void handleEvent() { new PEH(...); ... getCurrentMission().tearDown(); ... Wednesday, September 15, 2010
  • 12. Phase Annotations • parameters values @SCJRestricted value INITIALIZATION @SCJRestricted value RUN @SCJRestricted value CLEANUP @SCJRestricted value ALL (default) Wednesday, September 15, 2010
  • 13. Behavior Restrictions @SCJAllowed(LEVEL_1) public class IH extends InterruptHandler{ @SCJRestricted(mayAllocate=false, maySelfSuspend=false) protected void handleInterrupt() { foo(); } protected void foo() { new PEH(...); sleep(); ... Wednesday, September 15, 2010
  • 14. Behavior Restrictions @SCJAllowed(LEVEL_1) public class IH extends InterruptHandler{ @SCJRestricted(mayAllocate=false, maySelfSuspend=false) protected void handleInterrupt() { foo(); } @SCJRestricted(mayAllocate=false, maySelfSuspend=false) protected void foo() { new PEH(...); sleep(); Wednesday, September 15, 2010
  • 15. Behavior Restrictions parameters values @SCJRestricted mayAllocate TRUE (default) @SCJRestricted mayAllocate FALSE @SCJRestricted maySelfSuspend TRUE @SCJRestricted maySelfSuspend FALSE (default) Wednesday, September 15, 2010
  • 16. Memory Safety class PEH extends PeriodicEventHandler { Data data; public void handleEvent() { R r = new R(this); ManagedMemory.getCurrentManagedMemory(). enterPrivateMemory(3000, r); ... class R implements Runnable { PEH p; public void run() { p.data = new Data(); } } class Data { ... } Wednesday, September 15, 2010
  • 17. Memory Safety class PEH extends PeriodicEventHandler { Data data; public void handleEvent() { R r = new R(this); ManagedMemory.getCurrentManagedMemory(). enterPrivateMemory(3000, r); ... class R implements Runnable { PEH p; public void run() { p.data = new Data(); } } class Data { ... } Wednesday, September 15, 2010
  • 18. Memory Safety class PEH extends PeriodicEventHandler { Data data; R r = new R(this); enterPrivateMemory(r); ... class R implements Runnable { PEH p; pp.data = new Data(); } } class Data data new Data() PEHMission Memory PEH Memory Runnable Memory Wednesday, September 15, 2010
  • 19. Memory Safety @Scope("M") @RunsIn("PEH") class PEH extends PeriodicEventHandler { Data data; public void handleEvent() { @DefineScope(name="R", parent="PEH") R r = new R(this); ManagedMemory.getCurrentManagedMemory(). enterPrivateMemory(3000, r); ... @Scope("PEH") @RunsIn("R") class R implements Runnable { PEH p; public void run() { p.data = new Data(); } } @Scope("R") class Data { ... } Wednesday, September 15, 2010
  • 20. Memory Safety @Scope("M") @RunsIn("PEH") class PEH extends PeriodicEventHandler { Data data; public void handleEvent() { @DefineScope(name="R", parent="PEH") R r = new R(this); ManagedMemory.getCurrentManagedMemory(). enterPrivateMemory(3000, r); ... @Scope("PEH") @RunsIn("R") class R implements Runnable { PEH p; public void run() { p.data = new Data(); } } @Scope("R") class Data { ... } Wednesday, September 15, 2010
  • 21. Memory Safety Annotations parameters values @DefineScope name a name of newly defined scope @DefineScope parent a parenting scope of a new scope @Scope name a name of scope in which the object is allocated @RunsIn name name of scope where a method will allocate Wednesday, September 15, 2010
  • 22. @Scope @Scope("M") @RunsIn("PEH") class PEH extends PeriodicEventHandler { ... new Data() .... } @Scope("PEH") @RunsIn("R") class R implements Runnable { ... new Data() ... } @Scope("R") class Data { ... } Wednesday, September 15, 2010
  • 23. Objects with no @Scope @Scope("M") @RunsIn("PEH") class PEH extends PeriodicEventHandler { ... new Data() .... } @Scope("PEH") @RunsIn("R") class R implements Runnable { ... new Data() ... } class Data { ... } Wednesday, September 15, 2010
  • 24. Class and Fields @Scope("M") @RunsIn("PEH") class Clazz { Field f; Data d; @RunsIn("R") public void foo(Data d) { this.d = d; d may not reside in immortal } } @Scope("R") class Field { ... } class Data { ... } no @Scope annotation Field must be in the same or parent scope Wednesday, September 15, 2010
  • 25. Class Casting @Scope("PEH") @RunsIn("R") class R implements Runnable { ... Foo f = (Foo) new Data() ... } class Foo { ... } @Scope("R") class Data extends Foo { ... } Wednesday, September 15, 2010
  • 26. Enter Child Scope @Scope("M") @RunsIn("PEH") class PEH ... @DefineScope(name="R", parent="PEH") R r = new R(this); ManagedMemory.getCurrentManagedMemory(). enterPrivateMemory(3000, r); ... @DefineScope(name="R2", parent="PEH") R r2 = new R(this); .... @Scope("PEH") @RunsIn("R") class R implements Runnable { ...} Wednesday, September 15, 2010
  • 27. Conclusion • Checker Implementation • Java 7 Checker Framework • Compile-time checking (Eclipse plugin coming soon) • Evaluation • miniCDj benchmark Case Study • ~100 annotations, ~100 examples in the Checker distribution • @SCJAllowed and @SCJRestricted easy to use • Memory safety annotations • Sometimes overly restrictive, resulting in class duplication Wednesday, September 15, 2010
  • 28. Safety Critical Java • High level story: Java for safety critical systems • Safety critical systems may cause harm to persons if they fail, so they require vigorous certifications • SCJ compliance levels • Java annotations may help the certification process • A mechanism for adding metadata to Java constructs for compile-time or run-time processing • Java annotations preserved in the bytecode as well • Enhanced in Java 7 by allowing use in more constructs, enabling construction of pluggable type systems in Java Wednesday, September 15, 2010