From f63582893fb980cfc88296ef8d5bd9b1fa6d68c0 Mon Sep 17 00:00:00 2001 From: Andrzej Kotulski Date: Fri, 9 Oct 2015 04:07:24 -0700 Subject: [PATCH] Add basic e2e tests for C++ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: @​public Add some basic tests to make sure that there is no regression afterwards Reviewed By: @dulmarod Differential Revision: D2521887 fb-gh-sync-id: 1b8a15c --- .../errors/npe/null_returned_by_method.cpp | 34 ++++++++ .../cpp/errors/npe/object_deref.cpp | 28 +++++++ .../cpp/NullReturnedByMethodTest.java | 77 +++++++++++++++++++ .../endtoend/cpp/ObjectDereferenceTest.java | 77 +++++++++++++++++++ 4 files changed, 216 insertions(+) create mode 100644 infer/tests/codetoanalyze/cpp/errors/npe/null_returned_by_method.cpp create mode 100644 infer/tests/codetoanalyze/cpp/errors/npe/object_deref.cpp create mode 100644 infer/tests/endtoend/cpp/NullReturnedByMethodTest.java create mode 100644 infer/tests/endtoend/cpp/ObjectDereferenceTest.java diff --git a/infer/tests/codetoanalyze/cpp/errors/npe/null_returned_by_method.cpp b/infer/tests/codetoanalyze/cpp/errors/npe/null_returned_by_method.cpp new file mode 100644 index 000000000..4ee41ccea --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/errors/npe/null_returned_by_method.cpp @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2015 - 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. +*/ + +class X { +public: + int field; +}; + +class XFactory { +public: + X nonNull; + X* getNull() { return nullptr; } + X* getNonNull() { return &nonNull; } +}; + +int testNullDeref(XFactory *factory) { + if (factory) { + X *x = factory->getNull(); + return x->field; + } +} + +int testNoNullDeref(XFactory *factory) { + if (factory) { + X *x = factory->getNonNull(); + return x->field; + } +} diff --git a/infer/tests/codetoanalyze/cpp/errors/npe/object_deref.cpp b/infer/tests/codetoanalyze/cpp/errors/npe/object_deref.cpp new file mode 100644 index 000000000..113975079 --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/errors/npe/object_deref.cpp @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2015 - 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. +*/ + +class X { +public: + int field; +}; + +X* getNull() { return nullptr; } + +X globalX; +X* getNonNull() { return &globalX; } + +void derefNullField() { + X *x = getNull(); + int c = x->field; +} + +void derefNonNullField() { + X *x = getNonNull(); + int c = x->field; +} diff --git a/infer/tests/endtoend/cpp/NullReturnedByMethodTest.java b/infer/tests/endtoend/cpp/NullReturnedByMethodTest.java new file mode 100644 index 000000000..b3b52adb3 --- /dev/null +++ b/infer/tests/endtoend/cpp/NullReturnedByMethodTest.java @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2015 - 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 endtoend.cpp; + +import static org.hamcrest.MatcherAssert.assertThat; +import static utils.matchers.ResultContainsErrorInMethod.contains; +import static utils.matchers.ResultContainsNoErrorInMethod.doesNotContain; + +import com.google.common.collect.ImmutableList; + +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; + +import java.io.IOException; + +import utils.DebuggableTemporaryFolder; +import utils.InferException; +import utils.InferResults; +import utils.InferRunner; + +public class NullReturnedByMethodTest { + + public static final String FILE = + "infer/tests/codetoanalyze/cpp/errors/npe/null_returned_by_method.cpp"; + + private static ImmutableList inferCmd; + + public static final String NULL_DEREFERENCE = "NULL_DEREFERENCE"; + + @ClassRule + public static DebuggableTemporaryFolder folder = + new DebuggableTemporaryFolder(); + + @BeforeClass + public static void runInfer() throws InterruptedException, IOException { + inferCmd = InferRunner.createCPPInferCommand(folder, FILE); + } + + @Test + public void whenInferRunsOnTestNullDerefThenNpeIsFound() + throws InterruptedException, IOException, InferException { + InferResults inferResults = InferRunner.runInferCPP(inferCmd); + assertThat( + "Results should contain null pointer dereference error", + inferResults, + contains( + NULL_DEREFERENCE, + FILE, + "testNullDeref" + ) + ); + } + + @Test + public void whenInferRunsOnTestNoNullDerefThenNpeIsFound() + throws InterruptedException, IOException, InferException { + InferResults inferResults = InferRunner.runInferCPP(inferCmd); + assertThat( + "Results should not contain null pointer dereference error", + inferResults, + doesNotContain( + NULL_DEREFERENCE, + FILE, + "testNoNullDeref" + ) + ); + } + +} diff --git a/infer/tests/endtoend/cpp/ObjectDereferenceTest.java b/infer/tests/endtoend/cpp/ObjectDereferenceTest.java new file mode 100644 index 000000000..f07718186 --- /dev/null +++ b/infer/tests/endtoend/cpp/ObjectDereferenceTest.java @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2015 - 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 endtoend.cpp; + +import static org.hamcrest.MatcherAssert.assertThat; +import static utils.matchers.ResultContainsErrorInMethod.contains; +import static utils.matchers.ResultContainsNoErrorInMethod.doesNotContain; + +import com.google.common.collect.ImmutableList; + +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; + +import java.io.IOException; + +import utils.DebuggableTemporaryFolder; +import utils.InferException; +import utils.InferResults; +import utils.InferRunner; + +public class ObjectDereferenceTest { + + public static final String FILE = + "infer/tests/codetoanalyze/cpp/errors/npe/object_deref.cpp"; + + private static ImmutableList inferCmd; + + public static final String NULL_DEREFERENCE = "NULL_DEREFERENCE"; + + @ClassRule + public static DebuggableTemporaryFolder folder = + new DebuggableTemporaryFolder(); + + @BeforeClass + public static void runInfer() throws InterruptedException, IOException { + inferCmd = InferRunner.createCPPInferCommand(folder, FILE); + } + + @Test + public void whenInferRunsOnDerefNullFieldThenNpeIsFound() + throws InterruptedException, IOException, InferException { + InferResults inferResults = InferRunner.runInferCPP(inferCmd); + assertThat( + "Results should contain null pointer dereference error", + inferResults, + contains( + NULL_DEREFERENCE, + FILE, + "derefNullField" + ) + ); + } + + @Test + public void whenInferRunsOnDerefNonNullFieldThenNpeIsFound() + throws InterruptedException, IOException, InferException { + InferResults inferResults = InferRunner.runInferCPP(inferCmd); + assertThat( + "Results should not contain null pointer dereference error", + inferResults, + doesNotContain( + NULL_DEREFERENCE, + FILE, + "derefNonNullField" + ) + ); + } + +}