Java Code Coverage Mechanics. by Evgeny Mandrikov at EclipseCon Europe 2017

Similar documents
Java Code Coverage Mechanics Evgeny Mandrikov Marc Hoffmann #JokerConf 2017, Saint-Petersburg

Java Code Coverage Mechanics

The Future of Code Coverage for Eclipse

AP COMPUTER SCIENCE JAVA CONCEPTS IV: RESERVED WORDS

Are You Covered? Keith D Gregory Philly JUG 14 October 2009

Chapter 12 Exception Handling and Text IO. Liang, Introduction to Java Programming, Tenth Edition, Global Edition. Pearson Education Limited

Java Instrumentation for Dynamic Analysis

Implement detection of duplicate test coverage for Java applications

Space Exploration EECS /25

CS159. Nathan Sprague

Let s make some Marc R. Hoffmann Eclipse Summit Europe

CSE P 501 Compilers. Java Implementation JVMs, JITs &c Hal Perkins Winter /11/ Hal Perkins & UW CSE V-1

JVML Instruction Set. How to get more than 256 local variables! Method Calls. Example. Method Calls

CS2110 Fall 2011 Lecture 25. Under the Hood: The Java Virtual Machine, Part II

Motivations. Chapter 12 Exceptions and File Input/Output

Exception Handling. Sometimes when the computer tries to execute a statement something goes wrong:

Exception Handling. Run-time Errors. Methods Failure. Sometimes when the computer tries to execute a statement something goes wrong:

Agenda. CSE P 501 Compilers. Java Implementation Overview. JVM Architecture. JVM Runtime Data Areas (1) JVM Data Types. CSE P 501 Su04 T-1

Under the Hood: The Java Virtual Machine. Lecture 23 CS2110 Fall 2008

Java Security. Compiler. Compiler. Hardware. Interpreter. The virtual machine principle: Abstract Machine Code. Source Code

Shared Mutable State SWEN-220

301AA - Advanced Programming [AP-2017]

Java Errors and Exceptions. Because Murphy s Law never fails

Programming II (CS300)

Class, Variable, Constructor, Object, Method Questions

CSCE 314 Programming Languages

Programming II (CS300)

Compiling Techniques

CS/B.TECH/CSE(New)/SEM-5/CS-504D/ OBJECT ORIENTED PROGRAMMING. Time Allotted : 3 Hours Full Marks : 70 GROUP A. (Multiple Choice Type Question)

Exceptions. What exceptional things might our programs run in to?

Problem: Too Many Platforms!

Program Dynamic Analysis. Overview

3/15/18. Overview. Program Dynamic Analysis. What is dynamic analysis? [3] Why dynamic analysis? Why dynamic analysis? [3]

Getting started with Java

Chapter 9. Exception Handling. Copyright 2016 Pearson Inc. All rights reserved.

SECTION-1 Q.1.Which two code fragments are most likely to cause a StackOverflowError? (Choose two.)

More on Exception Handling

02 B The Java Virtual Machine

Multitasking Multitasking allows several activities to occur concurrently on the computer. A distinction is usually made between: Process-based multit

More on Exception Handling

Course Overview. PART I: overview material. PART II: inside a compiler. PART III: conclusion

Vendor: Oracle. Exam Code: 1Z Exam Name: Java SE 8 Programmer. Version: Demo

Vendor: Oracle. Exam Code: 1Z Exam Name: Java Certified Programmer. Version: Demo

Deriving Code Coverage Information from Profiling Data Recorded for a Trace-based Just-in-time Compiler

Improving Java Code Performance. Make your Java/Dalvik VM happier

Improving Java Performance

Chapter 12 Exception Handling

Assoc. Prof. Marenglen Biba. (C) 2010 Pearson Education, Inc. All rights reserved.

1 Shyam sir JAVA Notes

Compilation 2012 Code Generation

Chapter 3 Java Exception

Dynamic Class Loading

Compiler construction 2009

Java language. Part 1. Java fundamentals. Yevhen Berkunskyi, NUoS

Introduction Basic elements of Java

Living in the Matrix with Bytecode Manipulation

What is software testing? Software testing is designing, executing and evaluating test cases in order to detect faults.

BBM 102 Introduction to Programming II Spring Exceptions

Programming with assertions Oracle guidelines

Compiling for Different Platforms. Problem: Too Many Platforms! Dream: Platform Independence. Java Platform 5/3/2011

Nu: Towards a Flexible and Dynamic Aspect- Oriented Intermediate Language Model

Note: Answer any five questions. Sun micro system officially describes java with a list of buzz words

Code Profiling. CSE260, Computer Science B: Honors Stony Brook University

Lecture 28. Exceptions and Inner Classes. Goals. We are going to talk in more detail about two advanced Java features:

Module 4 - 异常和断言 一 选择题 :

CMSC 433 Section 0101 Fall 2012 Midterm Exam #1

Compiling Faster, Compiling Better with Falcon. Iván

20 Most Important Java Programming Interview Questions. Powered by

COE318 Lecture Notes Week 10 (Nov 7, 2011)

COMP3131/9102: Programming Languages and Compilers

Under the Hood: The Java Virtual Machine. Problem: Too Many Platforms! Compiling for Different Platforms. Compiling for Different Platforms

Selected Questions from by Nageshwara Rao

Over-view. CSc Java programs. Java programs. Logging on, and logging o. Slides by Michael Weeks Copyright Unix basics. javac.

CS 3 Introduction to Software Engineering. 3: Exceptions

Static Analysis of Dynamic Languages. Jennifer Strater

ITI Introduction to Computing II

CS/ENGRD 2110 SPRING Lecture 2: Objects and classes in Java

What are Exceptions?

Chapter 1: Introduction to Computers, Programs, and Java

Inheritance. SOTE notebook. November 06, n Unidirectional association. Inheritance ("extends") Use relationship

The Java Language Implementation

COMP6700/2140 JDK Tools

ITI Introduction to Computing II

A Third Look At Java. Chapter Seventeen Modern Programming Languages, 2nd ed. 1

MethodHandlesArrayElementGetterBench.testCreate Analysis. Copyright 2016, Oracle and/or its affiliates. All rights reserved.

SOFTWARE ARCHITECTURE 7. JAVA VIRTUAL MACHINE

Learning objectives. The Java Environment. Java timeline (cont d) Java timeline. Understand the basic features of Java

Lecture 1: Overview of Java

Chapter 13 Exception Handling

G51PGP Programming Paradigms. Lecture 009 Concurrency, exceptions

Introduction to Java

Bytecode Manipulation with a Java Agent and Byte Buddy. Koichi Sakata PONOS Corporation

CSC Java Programming, Fall Java Data Types and Control Constructs

What is Groovy? Almost as cool as me!

Exception-Handling Overview

Index COPYRIGHTED MATERIAL

Conversions and Casting

Nested Classes in Java. Slides by: Alon Mishne Edited by: Eran Gilad, Eyal Moscovici April 2013

The design of an ADT should evolve naturally during the problem-solving process Questions to ask when designing an ADT

public class Test { static int age; public static void main (String args []) { age = age + 1; System.out.println("The age is " + age); }

Transcription:

Java Code Coverage Mechanics by Evgeny Mandrikov at EclipseCon Europe 2017

Evgeny Mandrikov @_Godin_ Godin Marc Hoffmann @marcandsweep marchof JaCoCo and Eclipse EclEmma Project Leads

/* TODO Don't forget to add huge disclaimer that * all opinions hereinbelow are our own and not * our employers. * * They can only dream that they own them. */

Java Code Coverage Mechanics

Java Code Coverage Mechanics

Java Code Coverage Mechanics

Java Code Coverage Mechanics

Real Disclaimer Blood and guts of JVM Strong language - bytecode Intense violence for brain Implementation details!!!

JaCoCo EMMA EclEmma Eclipse Community Awards

Observer Effect In physics, the term observer effect refers to changes that the act of observation will make on a phenomenon being observed. This is often the result of instruments that, by necessity, alter the state of what they measure in some manner. Wikipedia

Code Coverage

JaCoCo works on class files only *.class *.exec

As easy as setting an arg for the JVM java -javaagent:jacocoagent.jar[=options] Application class PreMain { public static void premain( String options, Instrumentation instrumentation ) throws Exception { instrumentation.addtransformer( );

Java Byte Code Instrumentation

Probe Strategies

JaCoCo Validation Test Suite

Tested on 5 major JDK versions

Not only issues in JaCoCo...

Probe Minimal runtime overhead No side effects on application code Thread safe Record execution Identification probes[id] = true; ALOADx probes xpush id ICONST_1 BASTORE

Bytecode of Assertions class Fun { void fun(boolean x) { assert x; // javap -c Fun L: getstatic $assertionsdisabled ifne L iload_1 ifne L new java/lang/assertionerror dup invokespecial <init>()v athrow return

Bytecode of Assertions class Fun { static final synthetic boolean $assertionsdisabled = Fun.class.desiredAssertionStatus(); void fun(boolean x) { if (! $assertionsdisabled) if (! x) throw new AssertionError();

Nice idea! class Fun { static final synthetic boolean[] $jacocodata = ; void fun() { boolean[] probes = $jacocodata; probes[0] = true; probes[ ] = true;

Bridge Methods class Outer { private int counter; class Inner { void inc() { counter++; // javap -v Outer synthetic static private int access$008(outer o) { return o.counter++; // javap -c Outer$Inner synthetic final Outer this$0; void inc() { Outer.access$008(this$0)

Methods in Enums enum Fun { C // javap -v Fun synthetic static Fun valueof(java.lang.string); synthetic static Fun[] values();

Lambdas class Fun { void exec(runnable task) { task.run(); void fun() { exec(() -> { ); // javap -c -p -l Fun private static synthetic lambda$fun$0() {

ASM // javac -version java version "9-ea" // javac Fun.java // javap -version 1.7.0_80 new ClassReader(classBytes) // IllegalArgumentException return downgrade(classbytes)? upgrade(transform(classbytes)) : transform(classbytes); // javap -v Fun major version: 53 // javap -c -XDdetails -cp bin:src Example

class Base { static { new Child().someMethod(); Bad Cycle class Child extends Base { static final synthetic boolean $assertionsdisabled static { $assertionsdisabled = Child.class.get void somemethod() { assert 1 == 2; public static void main(string[] args) { new Child();

Bad Cycles in JaCoCo class Fun { static final synthetic boolean[] $jacocodata = ; void fun() { boolean[] probes = $jacocodata; probes[0] = true; // NullPointerException probes[ ] = true;

Bad Cycle - Solution class Fun { static final synthetic boolean[] $jacocodata; static synthetic boolean[] $jacocoinit() { if ($jacocodata == null) $jacocodata = ; return $jacocodata; void fun() { boolean[] probes = $jacocoinit();

Bad Cycle - Solution? class Fun { static final synthetic boolean[] $jacocodata; static synthetic boolean[] $jacocoinit() { if ($jacocodata == null) $jacocodata = ; return $jacocodata; void fun() { boolean[] probes = $jacocoinit();

Java Virtual Machine Specification 6.5. putstatic if the field is final, it must be declared in the current class, and the instruction must occur in the <clinit> method of the current class. Otherwise, an IllegalAccessError is thrown Checked since JDK 9 EA b127 for class files version 53.

Bad Cycle - Correct Solution class Fun { static final synthetic boolean[] $jacocodata; static synthetic boolean[] $jacocoinit() { if ($jacocodata == null) $jacocodata = ; return $jacocodata; void fun() { boolean[] probes = $jacocoinit();

Interfaces interface Fun { static final Object field static { field = ; interface Fun { default method() { // oups???

Java Language Specification 12.4.1. When Initialization Occurs A class or interface type T will be initialized immediately before the first occurrence of any one of the following: an instance of T is created static method declared by T is invoked When a class is initialized, its superclasses are initialized, as well as any superinterfaces that declare any default methods. Initialization of an interface does not, of itself, cause initialization of any of its superinterfaces.

Bad Cycle with Interfaces interface Base { Object o = new Child(){.fun(); default void base() { // JLS 12.4.1 interface Child extends Base { Object o = new Object() { { println( clinit ); ; default Object fun() { throw new RuntimeException(); public static void main(string[] args) { new Child() { ; // or Child.fun();

Bad Cycle with Interfaces base clinit child method child clinit < JDK 8u40 <= class: child clinit base clinit child method + crash because of exception static: base clinit child method child clinit < JDK 8u152 EA <= child clinit base clinit child method

Bad Cycle with Interfaces - Solution interface Fun { static final synthetic boolean[] $jacocodata = $jacocoinit(); static synthetic boolean[] $jacocoinit() { return $jacocodata == null? // slow path without assignment for JDK < 8u152 : $jacocodata ; default void fun() { boolean[] probes = $jacocoinit();

Runtime Access class RestrictiveClassLoader extends ClassLoader { protected Class<?> loadclass(string name, boolean resolve) throws ClassNotFoundException { if (!name.startswith("java/") &&!name.startswith("org/sonarsource/")) throw new ClassNotFoundException(); return super.loadclass(name, resolve);

Runtime Access (Problem) boolean[] probes =??? ; // Oups // can use only classes // java/**

Runtime Access (Solution) Object access = java.util.uuid.$jacocoaccess; // created at agent startup Object[] args = new Object[] { classid, // Long classname, // String probescount // Integer ; access.equals(args); boolean[] probes = (boolean[]) args[0];

Get Involved and Have Fun https://jdk9.java.net/download/ https://groups.google.com/forum/#!forum/jacoco StackOverflow https://github.com/eclipse/eclemma https://github.com/jacoco/jacoco