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