From 5b30471339e6287da884fd9f9b3fd06581978b00 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Thu, 7 Mar 2019 17:31:39 -0800 Subject: [PATCH] Enable build with clang static analyzer As part of LLVM, there is a clang static analyzer tool that provides useful analysis of potential issues in the source code base. This change enables building coreclr with that analyzer enabled. Commit migrated from https://github.com/dotnet/coreclr/commit/7b7f8ec1e3f974a43e96c3f01cb0d5a2da913e17 --- src/coreclr/build.sh | 20 +++++++++++++++++--- src/coreclr/src/pal/tools/gen-buildsys-clang.sh | 19 +++++++++++++++++-- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/coreclr/build.sh b/src/coreclr/build.sh index 1d26b6b..71b07fa2 100755 --- a/src/coreclr/build.sh +++ b/src/coreclr/build.sh @@ -61,6 +61,7 @@ usage() echo "-msbuildonunsupportedplatform - build managed binaries even if distro is not officially supported." echo "-numproc - set the number of build processes." echo "-portablebuild - pass -portablebuild=false to force a non-portable build." + echo "-staticanalyzer - build with clang static analyzer enabled." exit 1 } @@ -276,11 +277,15 @@ build_native() # Regenerate the CMake solution if [[ $__GccBuild == 0 ]]; then - echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion \"$__ClangMinorVersion\" $platformArch $__BuildType $__CodeCoverage $generator $extraCmakeArguments $__cmakeargs" - "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion "$__ClangMinorVersion" $platformArch $__BuildType $__CodeCoverage $generator "$extraCmakeArguments" "$__cmakeargs" + scan_build= + if [[ $__StaticAnalyzer == 1 ]]; then + scan_build=scan-build + fi + echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh\" \"$__ProjectRoot\" $__ClangMajorVersion \"$__ClangMinorVersion\" $platformArch $__BuildType $__CodeCoverage $scan_build $generator $extraCmakeArguments $__cmakeargs" + source "$__ProjectRoot/src/pal/tools/gen-buildsys-clang.sh" "$__ProjectRoot" $__ClangMajorVersion "$__ClangMinorVersion" $platformArch $__BuildType $__CodeCoverage $scan_build $generator "$extraCmakeArguments" "$__cmakeargs" else echo "Invoking \"$__ProjectRoot/src/pal/tools/gen-buildsys-gcc.sh\" \"$__ProjectRoot\" $__GccMajorVersion \"$__GccMinorVersion\" $platformArch $__BuildType $__CodeCoverage $generator $extraCmakeArguments $__cmakeargs" - "$__ProjectRoot/src/pal/tools/gen-buildsys-gcc.sh" "$__ProjectRoot" "$__GccMajorVersion" "$__CGccMinorVersion" $platformArch $__BuildType $__CodeCoverage $generator "$extraCmakeArguments" "$__cmakeargs" + source "$__ProjectRoot/src/pal/tools/gen-buildsys-gcc.sh" "$__ProjectRoot" "$__GccMajorVersion" "$__CGccMinorVersion" $platformArch $__BuildType $__CodeCoverage $generator "$extraCmakeArguments" "$__cmakeargs" fi popd fi @@ -299,6 +304,10 @@ build_native() # Check that the makefiles were created. pushd "$intermediatesForBuild" + if [ $__StaticAnalyzer == 1 ]; then + buildTool="$SCAN_BUILD_COMMAND $buildTool" + fi + echo "Executing $buildTool install -j $__NumProc" $buildTool install -j $__NumProc @@ -649,6 +658,7 @@ __BuildManagedTools=1 __SkipRestoreArg="" __SignTypeArg="" __OfficialBuildIdArg="" +__StaticAnalyzer=0 # Get the number of processors available to the scheduler # Other techniques such as `nproc` only get the number of @@ -937,6 +947,10 @@ while :; do __OfficialBuildIdArg="/p:OfficialBuildId=$__Id" ;; + -staticanalyzer) + __StaticAnalyzer=1 + ;; + --) # Skip -Option=Value style argument passing ;; diff --git a/src/coreclr/src/pal/tools/gen-buildsys-clang.sh b/src/coreclr/src/pal/tools/gen-buildsys-clang.sh index 2047b1e..95b227d 100755 --- a/src/coreclr/src/pal/tools/gen-buildsys-clang.sh +++ b/src/coreclr/src/pal/tools/gen-buildsys-clang.sh @@ -6,12 +6,13 @@ if [ $# -lt 4 ] then echo "Usage..." - echo "gen-buildsys-clang.sh [build flavor] [coverage] [ninja] [cmakeargs]" + echo "gen-buildsys-clang.sh [build flavor] [coverage] [ninja] [scan-build] [cmakeargs]" echo "Specify the path to the top level CMake file - /src/NDP" echo "Specify the clang version to use, split into major and minor version" echo "Specify the target architecture." echo "Optionally specify the build configuration (flavor.) Defaults to DEBUG." echo "Optionally specify 'coverage' to enable code coverage build." + echo "Optionally specify 'scan-build' to enable build with clang static analyzer." echo "Target ninja instead of make. ninja must be on the PATH." echo "Pass additional arguments to CMake call." exit 1 @@ -42,6 +43,7 @@ build_arch="$4" buildtype=DEBUG code_coverage=OFF build_tests=OFF +scan_build=OFF generator="Unix Makefiles" __UnprocessedCMakeArgs="" @@ -59,6 +61,10 @@ for i in "${@:5}"; do NINJA) generator=Ninja ;; + SCAN-BUILD) + echo "Static analysis is turned on for this build." + scan_build=ON + ;; *) __UnprocessedCMakeArgs="${__UnprocessedCMakeArgs}${__UnprocessedCMakeArgs:+ }$i" esac @@ -152,7 +158,16 @@ fi # Determine the current script directory __currentScriptDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cmake \ +cmake_command=cmake + +if [[ "$scan_build" == "ON" ]]; then + export CCC_CC=$CC + export CCC_CXX=$CXX + export SCAN_BUILD_COMMAND=$(command -v scan-build$desired_llvm_version) + cmake_command="$SCAN_BUILD_COMMAND $cmake_command" +fi + +$cmake_command \ -G "$generator" \ "-DCMAKE_USER_MAKE_RULES_OVERRIDE=${__currentScriptDir}/$overridefile" \ "-DCMAKE_AR=$llvm_ar" \ -- 2.7.4