Summary: some examples of bugs infer finds Reviewed By: jeremydubreil Differential Revision: D15081483 fbshipit-source-id: 4e40c7384master
							parent
							
								
									da13e52b27
								
							
						
					
					
						commit
						596ffad8dd
					
				@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = simple_null.cpp
 | 
				
			||||
OBJECTS = $(SOURCES:.cpp=.o)
 | 
				
			||||
 | 
				
			||||
all: $(OBJECTS)
 | 
				
			||||
 | 
				
			||||
.cpp.o:
 | 
				
			||||
	${CC} -c $<
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECTS)
 | 
				
			||||
@ -0,0 +1,10 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
void deref_null() {
 | 
				
			||||
  int* p = nullptr;
 | 
				
			||||
  *p = 42;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = simple_null_interproc.c wrappers.c
 | 
				
			||||
OBJECTS = $(SOURCES:.c=.o)
 | 
				
			||||
 | 
				
			||||
all: $(OBJECTS)
 | 
				
			||||
 | 
				
			||||
.cpp.o:
 | 
				
			||||
	${CC} -c $<
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECTS)
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
#include <stdlib.h>
 | 
				
			||||
 | 
				
			||||
int* allocate_int();
 | 
				
			||||
void set(int* p, int value);
 | 
				
			||||
 | 
				
			||||
void deref_null() {
 | 
				
			||||
  int* p = allocate_int();
 | 
				
			||||
  set(p, 42);
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,19 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
#include <stdlib.h>
 | 
				
			||||
 | 
				
			||||
int* allocate_int();
 | 
				
			||||
void set(int* p, int value);
 | 
				
			||||
 | 
				
			||||
void deref_null_ok() {
 | 
				
			||||
  int* p = allocate_int();
 | 
				
			||||
  if (p != NULL) {
 | 
				
			||||
    set(p, 42);
 | 
				
			||||
  }
 | 
				
			||||
  free(p);
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,11 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
#include <stdlib.h>
 | 
				
			||||
 | 
				
			||||
int* allocate_int() { return malloc(sizeof(int)); }
 | 
				
			||||
 | 
				
			||||
void set(int* p, int value) { *p = value; }
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = Resources.java
 | 
				
			||||
OBJECT = Resources.class
 | 
				
			||||
 | 
				
			||||
all: $(OBJECT)
 | 
				
			||||
 | 
				
			||||
$(OBJECT): $(SOURCES)
 | 
				
			||||
	javac $^
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECT)
 | 
				
			||||
@ -0,0 +1,26 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
import java.io.File;
 | 
				
			||||
import java.io.FileInputStream;
 | 
				
			||||
import java.io.FileOutputStream;
 | 
				
			||||
import java.io.IOException;
 | 
				
			||||
 | 
				
			||||
class Resources {
 | 
				
			||||
 | 
				
			||||
  public static void cat() throws IOException {
 | 
				
			||||
    FileInputStream fis = null;
 | 
				
			||||
    FileOutputStream fos = null;
 | 
				
			||||
    try {
 | 
				
			||||
      fis = new FileInputStream(new File("infile.txt"));
 | 
				
			||||
      fos = new FileOutputStream(new File("outfile.txt"));
 | 
				
			||||
      fos.write(fis.read());
 | 
				
			||||
    } finally {
 | 
				
			||||
      if (fis != null) fis.close();
 | 
				
			||||
      if (fos != null) fos.close();
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,20 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
import java.io.File;
 | 
				
			||||
import java.io.FileInputStream;
 | 
				
			||||
import java.io.FileOutputStream;
 | 
				
			||||
import java.io.IOException;
 | 
				
			||||
 | 
				
			||||
public class ResourcesFixed {
 | 
				
			||||
 | 
				
			||||
  public static void cat() throws IOException {
 | 
				
			||||
    try (FileInputStream fis = new FileInputStream(new File("infile.txt"));
 | 
				
			||||
        FileOutputStream fos = new FileOutputStream(new File("outfile.txt")); ) {
 | 
				
			||||
      fos.write(fis.read());
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,12 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
@ThreadSafe
 | 
				
			||||
public interface Account {
 | 
				
			||||
  void deposit(int amount);
 | 
				
			||||
  int withdraw(int amount);
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
class AccountImplementation implements Account {
 | 
				
			||||
 | 
				
			||||
  int mBalance = 0;
 | 
				
			||||
 | 
				
			||||
  private void addToBalance(int amount) {
 | 
				
			||||
    mBalance += amount;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  public synchronized void deposit(int amount) {
 | 
				
			||||
    if (amount > 0) {
 | 
				
			||||
      addToBalance(amount);
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  public synchronized int withdraw(int amount){
 | 
				
			||||
    if (amount >= 0 && mBalance - amount >= 0) {
 | 
				
			||||
      addToBalance(-amount);
 | 
				
			||||
      return mBalance;
 | 
				
			||||
    } else {
 | 
				
			||||
      return 0;
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,19 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
@ThreadSafe
 | 
				
			||||
public class Client {
 | 
				
			||||
 | 
				
			||||
  Account account;
 | 
				
			||||
 | 
				
			||||
  void getPaid(int amount) {
 | 
				
			||||
    account.deposit(amount);
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  int buyCoffee() {
 | 
				
			||||
    return account.withdraw(5);
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = Account.java AccountImplementation.java Client.java
 | 
				
			||||
OBJECT = Client.class
 | 
				
			||||
 | 
				
			||||
all: $(OBJECT)
 | 
				
			||||
 | 
				
			||||
$(OBJECT): $(SOURCES)
 | 
				
			||||
	javac $^
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECT)
 | 
				
			||||
@ -0,0 +1,7 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
public @interface ThreadSafe {}
 | 
				
			||||
@ -0,0 +1,10 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
public interface Account {
 | 
				
			||||
  void deposit(int amount);
 | 
				
			||||
  int withdraw(int amount);
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
class AccountImplementation implements Account {
 | 
				
			||||
 | 
				
			||||
  int mBalance = 0;
 | 
				
			||||
 | 
				
			||||
  private void addToBalance(int amount) {
 | 
				
			||||
    mBalance += amount;
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  public void deposit(int amount) {
 | 
				
			||||
    if (amount > 0) {
 | 
				
			||||
      addToBalance(amount);
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  public int withdraw(int amount){
 | 
				
			||||
    if (amount >= 0 && mBalance - amount >= 0) {
 | 
				
			||||
      addToBalance(-amount);
 | 
				
			||||
      return mBalance;
 | 
				
			||||
    } else {
 | 
				
			||||
      return 0;
 | 
				
			||||
    }
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,19 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
@ThreadSafe
 | 
				
			||||
public class Client {
 | 
				
			||||
 | 
				
			||||
  Account account;
 | 
				
			||||
 | 
				
			||||
  void getPaid(int amount) {
 | 
				
			||||
    account.deposit(amount);
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  int buyCoffee() {
 | 
				
			||||
    return account.withdraw(5);
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = Account.java AccountImplementation.java Client.java
 | 
				
			||||
OBJECT = Client.class
 | 
				
			||||
 | 
				
			||||
all: $(OBJECT)
 | 
				
			||||
 | 
				
			||||
$(OBJECT): $(SOURCES)
 | 
				
			||||
	javac $^
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECT)
 | 
				
			||||
@ -0,0 +1,7 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
public @interface ThreadSafe {}
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
public class Client<T> {
 | 
				
			||||
 | 
				
			||||
  String foo() {
 | 
				
			||||
    Library<T> lib = new Library<T>();
 | 
				
			||||
    T t = lib.get();
 | 
				
			||||
    return t == null? "default": t.toString();
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
public class Library<T> {
 | 
				
			||||
 | 
				
			||||
  @Nullable T t;
 | 
				
			||||
 | 
				
			||||
  private native @Nullable T mayReturnNull();
 | 
				
			||||
 | 
				
			||||
  public Library() {
 | 
				
			||||
    t = mayReturnNull();
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  @Nullable public T get() {
 | 
				
			||||
    return t;
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = Client.java  Library.java
 | 
				
			||||
OBJECT = Client.class
 | 
				
			||||
 | 
				
			||||
all: $(OBJECT)
 | 
				
			||||
 | 
				
			||||
$(OBJECT): $(SOURCES)
 | 
				
			||||
	javac $^
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECT)
 | 
				
			||||
@ -0,0 +1,8 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
public @interface Nullable {}
 | 
				
			||||
@ -0,0 +1,14 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
public class Client<T> {
 | 
				
			||||
 | 
				
			||||
  String foo() {
 | 
				
			||||
    Library<T> lib = new Library<T>();
 | 
				
			||||
    return lib.get().toString();
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,21 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
public class Library<T> {
 | 
				
			||||
 | 
				
			||||
  T t;
 | 
				
			||||
 | 
				
			||||
  private native @Nullable T mayReturnNull();
 | 
				
			||||
 | 
				
			||||
  public Library() {
 | 
				
			||||
    t = mayReturnNull();
 | 
				
			||||
  }
 | 
				
			||||
 | 
				
			||||
  public T get() {
 | 
				
			||||
    return t;
 | 
				
			||||
  }
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,15 @@
 | 
				
			||||
# Copyright (c) 2017-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SOURCES = Client.java  Library.java
 | 
				
			||||
OBJECT = Client.class
 | 
				
			||||
 | 
				
			||||
all: $(OBJECT)
 | 
				
			||||
 | 
				
			||||
$(OBJECT): $(SOURCES)
 | 
				
			||||
	javac $^
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	rm -rf $(OBJECT)
 | 
				
			||||
@ -0,0 +1,8 @@
 | 
				
			||||
/*
 | 
				
			||||
 * Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
 *
 | 
				
			||||
 * This source code is licensed under the MIT license found in the
 | 
				
			||||
 * LICENSE file in the root directory of this source tree.
 | 
				
			||||
 */
 | 
				
			||||
 | 
				
			||||
public @interface Nullable {}
 | 
				
			||||
@ -0,0 +1,14 @@
 | 
				
			||||
# Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
SUBDIRS = 00 01 02 03
 | 
				
			||||
 | 
				
			||||
default: all
 | 
				
			||||
 | 
				
			||||
clean:
 | 
				
			||||
	$(foreach subdir,$(SUBDIRS),$(MAKE) -C $(subdir) clean;)
 | 
				
			||||
	rm -fr $(foreach subdir,$(SUBDIRS),$(subdir)/infer-out/)
 | 
				
			||||
 | 
				
			||||
all: $(OBJECTS)
 | 
				
			||||
@ -0,0 +1,16 @@
 | 
				
			||||
#!/bin/bash
 | 
				
			||||
# Copyright (c) 2019-present, Facebook, Inc.
 | 
				
			||||
#
 | 
				
			||||
# This source code is licensed under the MIT license found in the
 | 
				
			||||
# LICENSE file in the root directory of this source tree.
 | 
				
			||||
 | 
				
			||||
set -e
 | 
				
			||||
 | 
				
			||||
infer -- make -C 00 clean all
 | 
				
			||||
infer -- make -C 01 clean all
 | 
				
			||||
infer explore --no-source-preview --select 1
 | 
				
			||||
infer -- make -C 02 clean all
 | 
				
			||||
infer explore --no-source-preview --select 0
 | 
				
			||||
infer -- make -C 03 clean all
 | 
				
			||||
infer explore --no-source-preview --select 1
 | 
				
			||||
infer --eradicate-only -- make -C 04 clean all
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue