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