output: #fixed code
                               @SuppressWarnings("deprecation")
  	protected void init(int estimatedStringCount, int estimatedStringLength) {
  		try {
  			this.estimatedStringCount = estimatedStringCount;
  			this.estimatedStringLength = estimatedStringLength;
  			
  			charArrayIndexScale = JvmUtil.arrayIndexScale(char.class);
  			charArrayIndexStartOffset = JvmUtil.arrayBaseOffset(char.class);
  			valueArrayOffsetInString = JvmUtil.getUnsafe().fieldOffset(String.class.getDeclaredField("value"));
  			stringSize = (int) JvmUtil.sizeOf(String.class);
  			int estimatedStringSize = (int) (stringSize + JvmUtil.sizeOfArray(char.class, estimatedStringLength));
  			allocationSize = (estimatedStringSize * estimatedStringCount) + JvmUtil.OBJECT_ADDRESS_SENSIVITY; // Extra memory for possible aligning
  			allocationStartAddress = directMemoryService.allocateMemory(allocationSize); 
  			allocationEndAddress = allocationStartAddress + allocationSize;
  			// Allocated objects must start aligned as address size from start address of allocated address
  			stringsStartAddress = allocationStartAddress;
  			long addressMod = stringsStartAddress % JvmUtil.OBJECT_ADDRESS_SENSIVITY;
  			if (addressMod != 0) {
  				stringsStartAddress += (JvmUtil.OBJECT_ADDRESS_SENSIVITY - addressMod);
  			}
  			currentAddress = stringsStartAddress;
  			segmentCount = allocationSize / STRING_SEGMENT_SIZE;
  			long segmentCountMod = allocationSize % STRING_SEGMENT_SIZE;
  			if (segmentCountMod != 0) {
  				segmentCount++;
  			}
  			inUseBlockCount = segmentCount / STRING_SEGMENT_COUNT_AT_AN_IN_USE_BLOCK;
  			long blockCountMod = segmentCount % STRING_SEGMENT_COUNT_AT_AN_IN_USE_BLOCK;
  			if (blockCountMod != 0) {
  				inUseBlockCount++;
  				fullValueOfLastBlock = (byte)(Math.pow(2, blockCountMod) - 1);
  			}
  			else {
  				fullValueOfLastBlock = BLOCK_IS_FULL_VALUE;
  			}
  			inUseBlockAddress = directMemoryService.allocateMemory(inUseBlockCount);
  			sampleHeader = directMemoryService.getInt(new String(), 0L);
  			
  			init();
  			makeAvaiable();
  		}
  		catch (Throwable t) {
  			logger.error("Error occured while initializing \"StringOffHeapPool\"", t);
  			throw new IllegalStateException(t);
  		}	
  	}
input: #vulnerable code 
                               @SuppressWarnings("deprecation")
  	protected void init(int estimatedStringCount, int estimatedStringLength) {
  		try {
  			this.estimatedStringCount = estimatedStringCount;
  			this.estimatedStringLength = estimatedStringLength;
  			
  			charArrayIndexScale = JvmUtil.arrayIndexScale(char.class);
  			charArrayIndexStartOffset = JvmUtil.arrayBaseOffset(char.class);
  			valueArrayOffsetInString = JvmUtil.getUnsafe().fieldOffset(String.class.getDeclaredField("value"));
  			stringSize = (int) JvmUtil.sizeOf(String.class);
  			int estimatedStringSize = (int) (stringSize + JvmUtil.sizeOfArray(char.class, estimatedStringLength));
  			allocationSize = (estimatedStringSize * estimatedStringCount) + JvmUtil.OBJECT_ADDRESS_SENSIVITY; // Extra memory for possible aligning
  			allocationStartAddress = directMemoryService.allocateMemory(allocationSize); 
  			allocationEndAddress = allocationStartAddress + allocationSize;
  			// Allocated objects must start aligned as address size from start address of allocated address
  			stringsStartAddress = allocationStartAddress;
  			long addressMod = stringsStartAddress % JvmUtil.OBJECT_ADDRESS_SENSIVITY;
  			if (addressMod != 0) {
  				stringsStartAddress += (JvmUtil.OBJECT_ADDRESS_SENSIVITY - addressMod);
  			}
  			currentAddress = stringsStartAddress;
  			sampleStr = new String();
  			sampleStrAddress = JvmUtil.addressOf(sampleStr);
  			sampleCharArray = new char[0];
  			init();
  			makeAvaiable();
  		}
  		catch (Throwable t) {
  			logger.error("Error occured while initializing \"StringOffHeapPool\"", t);
  			throw new IllegalStateException(t);
  		}	
  	} 
                              #location 17 
                              #vulnerability type THREAD_SAFETY_VIOLATION