You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ag...@apache.org on 2021/10/29 17:21:34 UTC

[incubator-nuttx] branch master updated: tool: add code coverage tool

This is an automated email from the ASF dual-hosted git repository.

aguettouche pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new ee17ae5  tool: add code coverage tool
ee17ae5 is described below

commit ee17ae5ba1d6728b8bd8eba991c59a5d4d245085
Author: yinshengkai <yi...@xiaomi.com>
AuthorDate: Tue Oct 26 14:57:15 2021 +0800

    tool: add code coverage tool
---
 .gitignore                           |  2 ++
 arch/Kconfig                         |  8 ++++++
 arch/sim/src/Makefile                |  4 +++
 arch/sim/src/nuttx-names.in          | 19 +++++++++++++
 boards/sim/sim/sim/scripts/Make.defs |  4 +++
 tools/Config.mk                      |  7 ++++-
 tools/gcov.sh                        | 54 ++++++++++++++++++++++++++++++++++++
 7 files changed, 97 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 48e380f..22fdef5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,8 @@
 *.dSYM
 *.elf
 *.exe
+*.gcno
+*.gcda
 *.hex
 *.i
 *.ihx
diff --git a/arch/Kconfig b/arch/Kconfig
index b2a933f..73a37d2 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -217,6 +217,14 @@ config ARCH_SIZET_LONG
 		C++ library routines because the NuttX size_t might not have
 		the same underlying type as your toolchain's size_t.
 
+config ARCH_COVERAGE
+	bool "Enable code coverage analysis"
+	select HAVE_CXX
+	select HAVE_CXXINITIALIZE
+	default n
+	---help---
+		Generate code coverage
+
 comment "Architecture Options"
 
 config ARCH_NOINTC
diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index 71a8c4c..a549a50 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -89,6 +89,10 @@ ifeq ($(CONFIG_STACK_COLORATION),y)
   CSRCS += up_checkstack.c
 endif
 
+ifeq ($(CONFIG_ARCH_COVERAGE),y)
+  STDLIBS += -lgcov
+endif
+
 ifeq ($(CONFIG_SPINLOCK),y)
   HOSTSRCS += up_testset.c
 endif
diff --git a/arch/sim/src/nuttx-names.in b/arch/sim/src/nuttx-names.in
index 2c43b3a..3b3629a 100644
--- a/arch/sim/src/nuttx-names.in
+++ b/arch/sim/src/nuttx-names.in
@@ -31,7 +31,9 @@
 #endif
 
 NXSYMBOLS(__cxa_atexit)
+NXSYMBOLS(abort)
 NXSYMBOLS(accept)
+NXSYMBOLS(access)
 NXSYMBOLS(atexit)
 NXSYMBOLS(bind)
 NXSYMBOLS(calloc)
@@ -46,14 +48,24 @@ NXSYMBOLS(dup)
 NXSYMBOLS(exit)
 NXSYMBOLS(fchmod)
 NXSYMBOLS(fchown)
+NXSYMBOLS(fclose)
 NXSYMBOLS(fcntl)
+NXSYMBOLS(fdopen)
+NXSYMBOLS(fopen)
+NXSYMBOLS(fprintf)
+NXSYMBOLS(fread)
 NXSYMBOLS(free)
+NXSYMBOLS(fseek)
 NXSYMBOLS(fstat)
 NXSYMBOLS(fsync)
+NXSYMBOLS(ftell)
 NXSYMBOLS(ftruncate)
 NXSYMBOLS(futimens)
+NXSYMBOLS(fwrite)
 NXSYMBOLS(getpeername)
 NXSYMBOLS(getsockname)
+NXSYMBOLS(getenv)
+NXSYMBOLS(getpid)
 NXSYMBOLS(getsockopt)
 NXSYMBOLS(if_nametoindex)
 NXSYMBOLS(ioctl)
@@ -89,6 +101,7 @@ NXSYMBOLS(pthread_mutex_lock)
 NXSYMBOLS(pthread_mutex_unlock)
 NXSYMBOLS(pthread_setspecific)
 NXSYMBOLS(pthread_sigmask)
+NXSYMBOLS(puts)
 NXSYMBOLS(read)
 NXSYMBOLS(readdir)
 NXSYMBOLS(readv)
@@ -102,6 +115,7 @@ NXSYMBOLS(select)
 NXSYMBOLS(sendmsg)
 NXSYMBOLS(sendto)
 NXSYMBOLS(setitimer)
+NXSYMBOLS(setbuf)
 NXSYMBOLS(setjmp)
 NXSYMBOLS(setsockopt)
 NXSYMBOLS(shutdown)
@@ -113,7 +127,12 @@ NXSYMBOLS(sleep)
 NXSYMBOLS(socket)
 NXSYMBOLS(stat)
 NXSYMBOLS(statvfs)
+NXSYMBOLS(stderr)
+NXSYMBOLS(strcat)
+NXSYMBOLS(strchr)
 NXSYMBOLS(strerror)
+NXSYMBOLS(strlen)
+NXSYMBOLS(strtol)
 NXSYMBOLS(syslog)
 NXSYMBOLS(tcgetattr)
 NXSYMBOLS(tcsetattr)
diff --git a/boards/sim/sim/sim/scripts/Make.defs b/boards/sim/sim/sim/scripts/Make.defs
index 38ddbe1..080eb70 100644
--- a/boards/sim/sim/sim/scripts/Make.defs
+++ b/boards/sim/sim/sim/scripts/Make.defs
@@ -55,6 +55,10 @@ ifeq ($(CONFIG_SIM_SANITIZE),y)
   ARCHOPTIMIZATION += -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer
 endif
 
+ifeq ($(CONFIG_ARCH_COVERAGE),y)
+  ARCHOPTIMIZATION += -fprofile-arcs -ftest-coverage
+endif
+
 ARCHCPUFLAGS = -fno-builtin
 ARCHCPUFLAGSXX = -fno-builtin -nostdinc++
 ifeq ($(CONFIG_CXX_EXCEPTION),)
diff --git a/tools/Config.mk b/tools/Config.mk
index 6adbebf..770950a 100644
--- a/tools/Config.mk
+++ b/tools/Config.mk
@@ -461,6 +461,10 @@ endef
 
 # CLEAN - Default clean target
 
+ifeq ($(CONFIG_ARCH_COVERAGE),y)
+	EXTRA = *.gcno *.gcda
+endif
+
 ifeq ($(CONFIG_WINDOWS_NATIVE),y)
 define CLEAN
 	$(Q) if exist *$(OBJEXT) (del /f /q *$(OBJEXT))
@@ -469,10 +473,11 @@ define CLEAN
 	$(Q) if exist (del /f /q  .*.swp)
 	$(Q) if exist $(OBJS) (del /f /q $(OBJS))
 	$(Q) if exist $(BIN) (del /f /q  $(BIN))
+	$(Q) if exist $(EXTRA) (del /f /q  $(EXTRA))
 endef
 else
 define CLEAN
-	$(Q) rm -f *$(OBJEXT) *$(LIBEXT) *~ .*.swp $(OBJS) $(BIN)
+	$(Q) rm -f *$(OBJEXT) *$(LIBEXT) *~ .*.swp $(OBJS) $(BIN) $(EXTRA)
 endef
 endif
 
diff --git a/tools/gcov.sh b/tools/gcov.sh
new file mode 100755
index 0000000..341cf7c
--- /dev/null
+++ b/tools/gcov.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+# tools/gcov.sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to you 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.
+#
+
+ROOT_DIR=$(cd $(dirname $0)/../../; pwd)
+
+if [ $# == 1 ]; then
+    GCOV_DIR=$1
+else
+    GCOV_DIR=${ROOT_DIR}/gcov
+fi
+
+files=$(find -name "*.gcda" 2> /dev/null | wc -l)
+if [ "$files" == "0" ] ;then
+    echo "Please run ./nuttx before using gcov.sh to generate the coverage report"
+    exit 1
+fi
+
+type lcov
+if [ $? -ne 0 ]; then
+    echo "Code coverage generation tool is not detected, please install lcov"
+    exit 1
+fi
+
+mkdir -p ${GCOV_DIR}
+cd ${GCOV_DIR}
+
+# Generate coverage text report
+lcov -c -d ${ROOT_DIR} -o coverage.info --rc lcov_branch_coverage=1
+# Generate coverage page report
+genhtml --branch-coverage -o result coverage.info
+
+if [ $? -ne 0 ]; then
+    echo "Failed to generate coverage file"
+    exit 1
+fi
+
+echo -e "Copy the following link and open it in the browser to view the coverage report"
+echo  "file://${GCOV_DIR}/result/index.html"