Reviewed By: peterogithub Differential Revision: D6903439 fbshipit-source-id: 299db8emaster
parent
4d8fdb1462
commit
4799fb6b82
@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - present Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package codetoanalyze.java.checkers;
|
||||
|
||||
import com.facebook.infer.annotation.ThreadSafe;
|
||||
|
||||
class Interprocedural {
|
||||
|
||||
static class A {
|
||||
B f = new B();
|
||||
int h = 0;
|
||||
}
|
||||
|
||||
static class B {
|
||||
int g = 0;
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
static class Field {
|
||||
private A a = new A();
|
||||
|
||||
private void destabilize() {
|
||||
B b = a.f;
|
||||
}
|
||||
|
||||
public void unstable_ok() {
|
||||
int x = 42;
|
||||
destabilize();
|
||||
synchronized (this){
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
public void stable_bad() {
|
||||
int x = 42;
|
||||
synchronized (this){
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
static class Param {
|
||||
|
||||
private void destabilize(A z) {
|
||||
B b1 = z.f;
|
||||
System.out.println(b1);
|
||||
}
|
||||
|
||||
public void unstable_ok(A a) {
|
||||
int x = 42;
|
||||
destabilize(a);
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
public void stable_bad(A a) {
|
||||
int x = 42;
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
static class Param2 {
|
||||
|
||||
private void destabilize(A z) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
public void stable_bad(A a) {
|
||||
int x = 42;
|
||||
destabilize(a); // a leaks, but shouldn't be de-stabilized because callee does nothing
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (c) 2018 - present Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*/
|
||||
|
||||
package codetoanalyze.java.checkers;
|
||||
|
||||
import com.facebook.infer.annotation.ThreadSafe;
|
||||
|
||||
class Intraprocedural {
|
||||
|
||||
static class B {
|
||||
int g = 0;
|
||||
}
|
||||
|
||||
static class A {
|
||||
B f = new B();
|
||||
int h = 0;
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
static class Field {
|
||||
private A a = new A();
|
||||
|
||||
public void unstable_ok() {
|
||||
int x = 42;
|
||||
B b = a.f; // destabilizes
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
public void stable_bad() {
|
||||
int x = 42;
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
}
|
||||
|
||||
static class Param {
|
||||
|
||||
public void unstable_ok(A a) {
|
||||
int x = 42;
|
||||
B b = a.f; // destabilizes
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
public void stable_bad(A a) {
|
||||
int x = 42;
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ThreadSafe
|
||||
static class Global {
|
||||
private static A a = new A();
|
||||
|
||||
synchronized public A getA() {
|
||||
return a;
|
||||
}
|
||||
|
||||
synchronized public void setA(A newA) {
|
||||
a = newA;
|
||||
}
|
||||
|
||||
public void unstable_ok() {
|
||||
int x = 42;
|
||||
A a = getA(); // destabilizes
|
||||
synchronized (this) {
|
||||
a.f.g = 101;
|
||||
}
|
||||
x = a.f.g;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
# Copyright (c) 2016 - present Facebook, Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# This source code is licensed under the BSD style license found in the
|
||||
# LICENSE file in the root directory of this source tree. An additional grant
|
||||
# of patent rights can be found in the PATENTS file in the same directory.
|
||||
|
||||
TESTS_DIR = ../../..
|
||||
|
||||
ANALYZER = checkers
|
||||
INFER_OPTIONS = --racerd-only --debug-exceptions --racerd-use-path-stability
|
||||
INFERPRINT_OPTIONS = --issues-tests
|
||||
SOURCES = $(wildcard *.java)
|
||||
|
||||
include $(TESTS_DIR)/javac.make
|
@ -0,0 +1,5 @@
|
||||
codetoanalyze/java/racerd_path_stability/Interprocedural.java, void Interprocedural$Field.stable_bad(), 5, THREAD_SAFETY_VIOLATION, [<Read trace>,access to `&this.codetoanalyze.java.checkers.Interprocedural$Field.a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`,<Write trace>,access to `&this.codetoanalyze.java.checkers.Interprocedural$Field.a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`]
|
||||
codetoanalyze/java/racerd_path_stability/Interprocedural.java, void Interprocedural$Param.stable_bad(Interprocedural$A), 5, THREAD_SAFETY_VIOLATION, [<Read trace>,access to `&a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`,<Write trace>,access to `&a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`]
|
||||
codetoanalyze/java/racerd_path_stability/Interprocedural.java, void Interprocedural$Param2.stable_bad(Interprocedural$A), 6, THREAD_SAFETY_VIOLATION, [<Read trace>,access to `&a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`,<Write trace>,access to `&a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`]
|
||||
codetoanalyze/java/racerd_path_stability/Intraprocedural.java, void Intraprocedural$Field.stable_bad(), 5, THREAD_SAFETY_VIOLATION, [<Read trace>,access to `&this.codetoanalyze.java.checkers.Intraprocedural$Field.a.codetoanalyze.java.checkers.Intraprocedural$A.f.codetoanalyze.java.checkers.Intraprocedural$B.g`,<Write trace>,access to `&this.codetoanalyze.java.checkers.Intraprocedural$Field.a.codetoanalyze.java.checkers.Intraprocedural$A.f.codetoanalyze.java.checkers.Intraprocedural$B.g`]
|
||||
codetoanalyze/java/racerd_path_stability/Intraprocedural.java, void Intraprocedural$Param.stable_bad(Intraprocedural$A), 5, THREAD_SAFETY_VIOLATION, [<Read trace>,access to `&a.codetoanalyze.java.checkers.Intraprocedural$A.f.codetoanalyze.java.checkers.Intraprocedural$B.g`,<Write trace>,access to `&a.codetoanalyze.java.checkers.Intraprocedural$A.f.codetoanalyze.java.checkers.Intraprocedural$B.g`]
|
Loading…
Reference in new issue