Reviewed By: ngorogiannis Differential Revision: D5512595 fbshipit-source-id: b47cc08master
							parent
							
								
									854b8f30bd
								
							
						
					
					
						commit
						c6ee53de50
					
				@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2017 - 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.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					import javax.annotation.concurrent.ThreadSafe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Test may_alias treatment of arrays
 | 
				
			||||||
 | 
					// two arrays of types in a subtype relation may alias, and race
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@ThreadSafe
 | 
				
			||||||
 | 
					class Parent {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@ThreadSafe
 | 
				
			||||||
 | 
					class Child extends Parent {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@ThreadSafe
 | 
				
			||||||
 | 
					class Arrays {
 | 
				
			||||||
 | 
					  Child[] childArr = new Child[5];
 | 
				
			||||||
 | 
					  Parent[] parentArr = childArr; // actual aliasing not required, but for documentation
 | 
				
			||||||
 | 
					  final String[] strArr1 = new String[5];
 | 
				
			||||||
 | 
					  final String[] strArr2 = new String[5];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void arrayParameterWriteBad(int[] name1) {
 | 
				
			||||||
 | 
					    name1[2] = 4;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // we'll report this because name1 and name2 may alias
 | 
				
			||||||
 | 
					  int arrayParameterReadBad(int[] name2) {
 | 
				
			||||||
 | 
					    return name2[2];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int arrayParameterLiteralReadOk() {
 | 
				
			||||||
 | 
					    return (new int[] { 2, 3})[1];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public void writeWriteRaceBad(String s) {
 | 
				
			||||||
 | 
					    strArr1[2] = s;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // same array
 | 
				
			||||||
 | 
					  public String readWriteRaceBad(String s) {
 | 
				
			||||||
 | 
					    synchronized (this) {
 | 
				
			||||||
 | 
					      strArr1[2] = s;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return strArr1[2];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // arrays are same type, but can't alias
 | 
				
			||||||
 | 
					  public String notReadWriteRace1Ok(String s) {
 | 
				
			||||||
 | 
					    synchronized (this) {
 | 
				
			||||||
 | 
					      strArr1[0] = s;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return strArr2[0];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // arrays are compatible types and can alias
 | 
				
			||||||
 | 
					  public Child FN_readWriteAliasRaceBad() {
 | 
				
			||||||
 | 
					    synchronized(this) {
 | 
				
			||||||
 | 
					      parentArr[3] = null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return childArr[3];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  String[] type1Arr[];
 | 
				
			||||||
 | 
					  Parent[] type2Arr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // arrays are different types and thus cannot alias
 | 
				
			||||||
 | 
					  public Parent noRaceOk() {
 | 
				
			||||||
 | 
					    synchronized(this) {
 | 
				
			||||||
 | 
					      type1Arr[3] = null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return type2Arr[3];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,42 +0,0 @@
 | 
				
			|||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 2017 - 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.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
import javax.annotation.concurrent.ThreadSafe;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Test may_alias treatment of arrays
 | 
					 | 
				
			||||||
// two arrays of types in a subtype relation may alias, and race
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ThreadSafe
 | 
					 | 
				
			||||||
class Parent {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ThreadSafe
 | 
					 | 
				
			||||||
class Child extends Parent {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ThreadSafe
 | 
					 | 
				
			||||||
class SubArr {
 | 
					 | 
				
			||||||
  Child[] childArr = new Child[5];
 | 
					 | 
				
			||||||
  Parent[] parentArr = childArr; // actual aliasing not required, but for documentation
 | 
					 | 
				
			||||||
  String[] strArr = new String[5];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  public Child RWrace() {
 | 
					 | 
				
			||||||
    synchronized(this) {
 | 
					 | 
				
			||||||
      parentArr[3] = null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return childArr[4];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  public String NOrace() {
 | 
					 | 
				
			||||||
    synchronized(this) {
 | 
					 | 
				
			||||||
      parentArr[3] = null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return strArr[2];
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue