From cc3b27cc5b23347eb1e5b8d175317230088b586e Mon Sep 17 00:00:00 2001 From: Rene Sugar Date: Sat, 30 Sep 2017 11:42:37 -0500 Subject: [PATCH] =?UTF-8?q?ARROW-1626=20Add=20make=20targets=20to=20run=20?= =?UTF-8?q?the=20inter-procedural=20static=20analys=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …is tool called infer Author: Rene Sugar Closes #1149 from renesugar/infer and squashes the following commits: 8591b5ff [Rene Sugar] ARROW-1626 Add make targets to run the inter-procedural static analysis tool called infer --- cpp/CMakeLists.txt | 21 +++++++++++ cpp/build-support/run-infer.sh | 48 ++++++++++++++++++++++++++ cpp/cmake_modules/FindInferTools.cmake | 45 ++++++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100755 cpp/build-support/run-infer.sh create mode 100644 cpp/cmake_modules/FindInferTools.cmake diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index ad99970e9b25f..d488646fd9694 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -56,6 +56,14 @@ if ("$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}" STREQUAL "1" OR CLANG_TIDY_FOUND) set(CMAKE_EXPORT_COMPILE_COMMANDS 1) endif() +find_package(InferTools) +if ("$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}" STREQUAL "1" OR INFER_FOUND) + # Generate a Clang compile_commands.json "compilation database" file for use + # with various development tools, such as Vim's YouCompleteMe plugin. + # See http://clang.llvm.org/docs/JSONCompilationDatabase.html + set(CMAKE_EXPORT_COMPILE_COMMANDS 1) +endif() + find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND}) @@ -596,6 +604,19 @@ if (${CLANG_TIDY_FOUND}) endif() +############################################################ +# "make infer" target +############################################################ + +if (${INFER_FOUND}) + # runs infer capture + add_custom_target(infer ${BUILD_SUPPORT_DIR}/run-infer.sh ${INFER_BIN} ${CMAKE_BINARY_DIR}/compile_commands.json 1) + # runs infer analyze + add_custom_target(infer-analyze ${BUILD_SUPPORT_DIR}/run-infer.sh ${INFER_BIN} ${CMAKE_BINARY_DIR}/compile_commands.json 2) + # runs infer report + add_custom_target(infer-report ${BUILD_SUPPORT_DIR}/run-infer.sh ${INFER_BIN} ${CMAKE_BINARY_DIR}/compile_commands.json 3) +endif() + ############################################################ # "make iwyu" target ############################################################ diff --git a/cpp/build-support/run-infer.sh b/cpp/build-support/run-infer.sh new file mode 100755 index 0000000000000..823685aef146e --- /dev/null +++ b/cpp/build-support/run-infer.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Runs infer in the given directory +# Arguments: +# $1 - Path to the infer binary +# $2 - Path to the compile_commands.json to use +# $3 - Apply infer step (1=capture, 2=analyze, 3=report) +# +INFER=$1 +shift +COMPILE_COMMANDS=$1 +shift +APPLY_STEP=$1 +shift + +if [ "$APPLY_STEP" == "1" ]; then + $INFER capture --compilation-database $COMPILE_COMMANDS + echo "" + echo "Run 'make infer-analyze' next." +elif [ "$APPLY_STEP" == "2" ]; then + # infer's analyze step can take a very long time to complete + $INFER analyze + echo "" + echo "Run 'make infer-report' next." + echo "See: http://fbinfer.com/docs/steps-for-ci.html" +elif [ "$APPLY_STEP" == "3" ]; then + $INFER report --issues-csv ./infer-out/report.csv 1> /dev/null + $INFER report --issues-txt ./infer-out/report.txt 1> /dev/null + $INFER report --issues-json ./infer-out/report.json 1> /dev/null + echo "" + echo "Reports (report.txt, report.csv, report.json) can be found in the infer-out subdirectory." +else + echo "" + echo "See: http://fbinfer.com/docs/steps-for-ci.html" +fi diff --git a/cpp/cmake_modules/FindInferTools.cmake b/cpp/cmake_modules/FindInferTools.cmake new file mode 100644 index 0000000000000..00c6709c67703 --- /dev/null +++ b/cpp/cmake_modules/FindInferTools.cmake @@ -0,0 +1,45 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Tries to find the infer module +# +# Usage of this module as follows: +# +# find_package(InferTools) +# +# Variables used by this module, they can change the default behaviour and need +# to be set before calling find_package: +# +# InferTools_PATH - +# When set, this path is inspected instead of standard library binary locations +# to find infer +# +# This module defines +# INFER_BIN, The path to the clang tidy binary +# INFER_FOUND, Whether clang tidy was found + +find_program(INFER_BIN + NAMES infer + PATHS ${InferTools_PATH} $ENV{INFER_TOOLS_PATH} /usr/local/bin /usr/bin + /usr/local/homebrew/bin + /opt/local/bin + NO_DEFAULT_PATH +) + +if ( "${INFER_BIN}" STREQUAL "INFER_BIN-NOTFOUND" ) + set(INFER_FOUND 0) + message("infer not found") +else() + set(INFER_FOUND 1) + message("infer found at ${INFER_BIN}") +endif()