sparse: add sparse support

With this adding "-DSPARSE=y" to the "west build" command line
performs a sparse check of the project build. So far only gcc-based
builds are supported.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
This commit is contained in:
Guennadi Liakhovetski 2022-03-14 17:26:18 +01:00 committed by Anas Nashif
commit 7a85ff7683
5 changed files with 45 additions and 2 deletions

View file

@ -267,6 +267,10 @@ if(CONFIG_COMPILER_COLOR_DIAGNOSTICS)
zephyr_compile_options($<TARGET_PROPERTY:compiler,diagnostic>)
endif()
if("${SPARSE}" STREQUAL "y")
list(APPEND TOOLCHAIN_C_FLAGS -D__CHECKER__)
endif()
zephyr_compile_options(
${TOOLCHAIN_C_FLAGS}
)

View file

@ -5,7 +5,14 @@ set_ifndef(C++ g++)
# Configures CMake for using GCC, this script is re-used by several
# GCC-based toolchains
find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATHS ${TOOLCHAIN_HOME} NO_DEFAULT_PATH)
if("${SPARSE}" STREQUAL "y")
find_program(CMAKE_C_COMPILER cgcc)
find_program(REAL_CC ${CROSS_COMPILE}${CC} PATHS ${TOOLCHAIN_HOME} NO_DEFAULT_PATH)
set(ENV{REAL_CC} ${REAL_CC})
else()
find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATHS ${TOOLCHAIN_HOME} NO_DEFAULT_PATH)
endif()
if(${CMAKE_C_COMPILER} STREQUAL CMAKE_C_COMPILER-NOTFOUND)
message(FATAL_ERROR "C compiler ${CROSS_COMPILE}${CC} not found - Please check your toolchain installation")
endif()

View file

@ -66,6 +66,12 @@ macro(configure_linker_script linker_script_gen linker_pass_define)
zephyr_get_include_directories_for_lang(C current_includes)
get_property(current_defines GLOBAL PROPERTY PROPERTY_LINKER_SCRIPT_DEFINES)
if("${SPARSE}" STREQUAL "y")
set(ld_command ${REAL_CC})
else()
set(ld_command ${CMAKE_C_COMPILER})
endif()
add_custom_command(
OUTPUT ${linker_script_gen}
DEPENDS
@ -74,7 +80,7 @@ macro(configure_linker_script linker_script_gen linker_pass_define)
${extra_dependencies}
# NB: 'linker_script_dep' will use a keyword that ends 'DEPENDS'
${linker_script_dep}
COMMAND ${CMAKE_C_COMPILER}
COMMAND ${ld_command}
-x assembler-with-cpp
${NOSYSDEF_CFLAG}
-MD -MF ${linker_script_gen}.dep -MT ${linker_script_gen}

View file

@ -9,3 +9,4 @@ Testing
ztest
twister
coverage
sparse

View file

@ -0,0 +1,25 @@
.. _sparse:
Sparse support
##############
`Sparse <https://kernelnewbies.org/Sparse>`__ is a static code analysis tool.
Apart from performing common code analysis tasks it also supports an
``address_space`` attribute, which allows introduction of distinct address
spaces in C code with subsequent verification that pointers to different
address spaces do not get confused. Additionally it supports a ``force``
attribute which should be used to cast pointers between different address
spaces. At the moment Zephyr introduces a single custom address space
``__cache`` used to identify pointers from the cached address range on the
Xtensa architecture. This helps identify cases where cached and uncached
addresses are confused.
Running with sparse
*******************
To run a sparse verification build :ref:`west build <west-building>` should be
called with a `-DSPARSE=y` parameter, e.g.
.. code-block:: shell
west build -d hello -b intel_adsp_cavs25 zephyr/samples/hello_world -- -DSPARSE=y