From: Harman Kalra <hkalra@marvell.com>
To: Thomas Monjalon <thomas@monjalon.net>,
John McNamara <john.mcnamara@intel.com>,
Marko Kovacevic <marko.kovacevic@intel.com>,
"Bruce Richardson" <bruce.richardson@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>
Subject: Re: [dpdk-dev] [PATCH] mk: add support for UBSAN
Date: Wed, 9 Oct 2019 14:25:52 +0000 [thread overview]
Message-ID: <20191009142524.GA8087@outlook.office365.com> (raw)
In-Reply-To: <20190913114026.GA172657@outlook.office365.com>
Ping..
On Fri, Sep 13, 2019 at 11:40:40AM +0000, Harman Kalra wrote:
> Ping..
> Kindly review this patch.
>
> On Mon, Aug 19, 2019 at 07:18:21PM +0530, Harman Kalra wrote:
> > UndefinedBehaviorSanitizer (UBSan) is a fast undefined behavior
> > detector. UBSan modifies the program at compile-time to catch
> > various kinds of undefined behavior during program execution.
> >
> > This patch implements support for UBSan to the DPDK.
> >
> > See: doc/guides/prog_guide/ubsan.rst for more information.
> >
> > Signed-off-by: Harman Kalra <hkalra@marvell.com>
> > ---
> > config/common_base | 6 ++
> > config/meson.build | 15 ++++
> > doc/guides/prog_guide/index.rst | 1 +
> > doc/guides/prog_guide/ubsan.rst | 112 +++++++++++++++++++++++++
> > doc/guides/rel_notes/release_19_11.rst | 7 ++
> > meson_options.txt | 2 +
> > mk/rte.app.mk | 10 +++
> > mk/rte.lib.mk | 12 +++
> > mk/toolchain/clang/rte.vars.mk | 4 +
> > mk/toolchain/gcc/rte.vars.mk | 8 ++
> > 10 files changed, 177 insertions(+)
> > create mode 100644 doc/guides/prog_guide/ubsan.rst
> >
> > diff --git a/config/common_base b/config/common_base
> > index 8ef75c203..b47a6f28e 100644
> > --- a/config/common_base
> > +++ b/config/common_base
> > @@ -1067,3 +1067,9 @@ CONFIG_RTE_APP_CRYPTO_PERF=y
> > # Compile the eventdev application
> > #
> > CONFIG_RTE_APP_EVENTDEV=y
> > +
> > +#
> > +# Enable undefined behavior sanitizer
> > +#
> > +CONFIG_RTE_UBSAN=n
> > +CONFIG_RTE_UBSAN_SANITIZE_ALL=n
> > diff --git a/config/meson.build b/config/meson.build
> > index 2bafea530..6a2fa117d 100644
> > --- a/config/meson.build
> > +++ b/config/meson.build
> > @@ -196,3 +196,18 @@ add_project_arguments('-D_GNU_SOURCE', language: 'c')
> > if is_freebsd
> > add_project_arguments('-D__BSD_VISIBLE', language: 'c')
> > endif
> > +
> > +# enable ubsan
> > +if get_option('enable_ubsan')
> > + if cc.has_argument('-fsanitize=undefined')
> > + ubsan_dep = cc.find_library('libubsan', required: false)
> > + if ubsan_dep.found()
> > + add_project_arguments('-fsanitize=undefined', language: 'c')
> > + add_project_link_arguments('-fsanitize=undefined', language: 'c')
> > + else
> > + message('libubsan not found, UBSAN cannot be enabled')
> > + endif
> > + else
> > + message('gcc version does not support UBSAN')
> > + endif
> > +endif
> > diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst
> > index 692409af8..970901e9a 100644
> > --- a/doc/guides/prog_guide/index.rst
> > +++ b/doc/guides/prog_guide/index.rst
> > @@ -66,4 +66,5 @@ Programmer's Guide
> > perf_opt_guidelines
> > writing_efficient_code
> > profile_app
> > + ubsan
> > glossary
> > diff --git a/doc/guides/prog_guide/ubsan.rst b/doc/guides/prog_guide/ubsan.rst
> > new file mode 100644
> > index 000000000..cb19f3bd9
> > --- /dev/null
> > +++ b/doc/guides/prog_guide/ubsan.rst
> > @@ -0,0 +1,112 @@
> > +.. SPDX-License-Identifier: BSD-3-Clause
> > + Copyright(c) 2019 Marvell International Ltd.
> > +
> > +The Undefined Behavior Sanitizer - UBSan
> > +========================================
> > +
> > +UndefinedBehaviorSanitizer (UBSan) is a runtime undefined behavior detector.
> > +UBSan uses compile-time instrumentation and modifies the program by adding
> > +some stubs which perform certain checks before operations that might cause
> > +undefined behaviour. If some UB detected, respective _UBSan_handle_* handlers
> > +(which are defined in libUBSan library) are called to prints the error message.
> > +
> > +Some examples of undefined behaviour checks:
> > +
> > +* Misaligned memory access
> > +* Signed integer overflow
> > +* Load from/store to an object with insufficient space.
> > +* Integer divide by zero as well as INT_MIN / -1 division
> > +* Out-of-bounds memory accesses.
> > +* Null argument declared with nonnull attribute, returned null from function
> > + which never returns null, null ptr dereference
> > +* Variable size array with non-positive length
> > +
> > +GCC supports this feature since 4.9, however GCC 5.0 onwards has many more
> > +checkers implemented.
> > +
> > +Example UBSan error
> > +--------------------
> > +
> > +Following error was reported when UBSan was enabled:
> > +
> > +.. code-block:: console
> > +
> > + drivers/net/octeontx2/otx2_stats.c:82:26: runtime error: left shift of
> > + 1 by 31 places cannot be represented in type 'int'
> > +
> > +Code responsible for this error:
> > +
> > +.. code-block:: c
> > +
> > + if (dev->txmap[i] & (1 << 31)) {
> > +
> > +To fix this error:
> > +
> > +.. code-block:: c
> > +
> > + if (dev->txmap[i] & (1U << 31)) {
> > +
> > +Usage
> > +-----
> > +
> > +make build
> > +^^^^^^^^^^
> > +
> > +To enable UBSan, enable following configuration:
> > +
> > +.. code-block:: console
> > +
> > + CONFIG_RTE_UBSAN=y
> > +
> > +UBSan framework supports three modes:
> > +
> > +1. Enable UBSan on the entire DPDK source code - set following configuration:
> > +
> > +.. code-block:: console
> > +
> > + CONFIG_RTE_UBSAN_SANITIZE_ALL=y
> > +
> > +2. Enable UBSan on a particular library or PMD - add the following line to the
> > + respective Makefile of the library or PMD
> > + (make sure ``CONFIG_RTE_UBSAN_SANITIZE_ALL=n``). This will instrument only
> > + the library or PMD and not the entire repository.
> > +
> > +.. code-block:: console
> > +
> > + UBSAN_SANITIZE := y
> > +
> > +3. Disable UBSan for a particular library or PMD - add the following line to
> > + the respective Makefile of the library or PMD. Make sure
> > + ``CONFIG_RTE_UBSAN_SANITIZE_ALL=y`` config is set. This will instrument
> > + entire DPDK repository but not this specific library or PMD.
> > +
> > +.. code-block:: console
> > +
> > + UBSAN_SANITIZE := n
> > +
> > +.. Note::
> > +
> > + Standard DPDK applications like test, testpmd, etc. cannot be
> > + chosen explicitly for UBSan check, like libraries or PMD. The reason is,
> > + say UBSan is enabled for library X, and ``UBSAN_SANITIZE=y`` is not added
> > + in Makefile of app Y which uses X APIs. This will lead to undefined
> > + reference to _UBSan_handle_* handlers as Y is not compiled with UBSan flags.
> > + Hence UBSan check is enabled for all standard DPDK applications as soon as
> > + ``CONFIG_RTE_UBSAN=y`` is set.
> > +
> > +meson build
> > +^^^^^^^^^^^
> > +
> > +To enable UBSan in meson build system, use following meson build command:
> > +
> > +**Example usage:**
> > +
> > +.. code-block:: console
> > +
> > + meson build -Denable_ubsan=true
> > + ninja -C build
> > +
> > +.. Note::
> > +
> > + Meson build works only in one mode i.e. UBSan can be enabled for
> > + the entire DPDK sources and not individual libraries or PMD, like make build.
> > diff --git a/doc/guides/rel_notes/release_19_11.rst b/doc/guides/rel_notes/release_19_11.rst
> > index 8490d897c..cfefdbeec 100644
> > --- a/doc/guides/rel_notes/release_19_11.rst
> > +++ b/doc/guides/rel_notes/release_19_11.rst
> > @@ -56,6 +56,13 @@ New Features
> > Also, make sure to start the actual text at the margin.
> > =========================================================
> >
> > +* **Added Undefined Behavior Sanitizer framework.**
> > +
> > + UBSan is a fast runtime undefined behavior detector which uses compile-time
> > + instrumentation and modifies the program by adding some stubs that perform
> > + certain checks before operations that might cause undefined behavior.
> > +
> > + See :doc:`../prog_guide/ubsan` for more information:
> >
> > Removed Items
> > -------------
> > diff --git a/meson_options.txt b/meson_options.txt
> > index 448f3e63d..fb0aead00 100644
> > --- a/meson_options.txt
> > +++ b/meson_options.txt
> > @@ -8,6 +8,8 @@ option('enable_docs', type: 'boolean', value: false,
> > description: 'build documentation')
> > option('enable_kmods', type: 'boolean', value: true,
> > description: 'build kernel modules')
> > +option('enable_ubsan', type: 'boolean', value: false,
> > + description: 'Enables undefined behavior sanitizer')
> > option('examples', type: 'string', value: '',
> > description: 'Comma-separated list of examples to build by default')
> > option('flexran_sdk', type: 'string', value: '',
> > diff --git a/mk/rte.app.mk b/mk/rte.app.mk
> > index ba5c39e01..9ea421a83 100644
> > --- a/mk/rte.app.mk
> > +++ b/mk/rte.app.mk
> > @@ -374,6 +374,16 @@ endif
> >
> > MAPFLAGS = -Map=$@.map --cref
> >
> > +#
> > +# If UBSAN is enabled, all application will be compiled with
> > +# '-fsanitize=undefined' flag
> > +#
> > +ifeq ($(CONFIG_RTE_UBSAN),y)
> > +ifeq ($(UBSAN_ENABLE),y)
> > +CFLAGS += -fsanitize=undefined
> > +endif
> > +endif
> > +
> > .PHONY: all
> > all: install
> >
> > diff --git a/mk/rte.lib.mk b/mk/rte.lib.mk
> > index 4df8849a0..33f5746c8 100644
> > --- a/mk/rte.lib.mk
> > +++ b/mk/rte.lib.mk
> > @@ -29,6 +29,18 @@ CPU_LDFLAGS += --version-script=$(SRCDIR)/$(EXPORT_MAP)
> > endif
> > endif
> >
> > +#
> > +# If UBSAN is enabled, lib to undergo check can be chosen
> > +# by setting UBSAN_SANITIZE=y in respective lib Makefile
> > +# else set CONFIG_RTE_UBSAN_SANITIZE_ALL=y to enforce check
> > +# on entire repo.
> > +#
> > +ifeq ($(CONFIG_RTE_UBSAN),y)
> > +ifeq ($(UBSAN_ENABLE),y)
> > +CFLAGS += $(if $(patsubst %n,,$(CONFIG_RTE_UBSAN_SANITIZE_ALL)$(UBSAN_SANITIZE)) \
> > + , -fsanitize=undefined)
> > +endif
> > +endif
> >
> > _BUILD = $(LIB)
> > PREINSTALL = $(SYMLINK-FILES-y)
> > diff --git a/mk/toolchain/clang/rte.vars.mk b/mk/toolchain/clang/rte.vars.mk
> > index 3c49dc568..623780106 100644
> > --- a/mk/toolchain/clang/rte.vars.mk
> > +++ b/mk/toolchain/clang/rte.vars.mk
> > @@ -56,5 +56,9 @@ ifeq ($(shell test $(CLANG_MAJOR_VERSION) -ge 4 && echo 1), 1)
> > WERROR_FLAGS += -Wno-address-of-packed-member
> > endif
> >
> > +ifeq ($(CONFIG_RTE_UBSAN),y)
> > +UBSAN_ENABLE := y
> > +endif
> > +
> > export CC AS AR LD OBJCOPY OBJDUMP STRIP READELF
> > export TOOLCHAIN_CFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
> > diff --git a/mk/toolchain/gcc/rte.vars.mk b/mk/toolchain/gcc/rte.vars.mk
> > index b852fcfd7..d40e14d61 100644
> > --- a/mk/toolchain/gcc/rte.vars.mk
> > +++ b/mk/toolchain/gcc/rte.vars.mk
> > @@ -90,5 +90,13 @@ endif
> > # disable packed member unalign warnings
> > WERROR_FLAGS += -Wno-address-of-packed-member
> >
> > +ifeq ($(CONFIG_RTE_UBSAN),y)
> > +ifeq ($(shell test $(GCC_VERSION) -lt 49 && echo 1), 1)
> > +$(warning UBSAN not supported gcc < 4.9)
> > +else
> > +UBSAN_ENABLE = y
> > +endif
> > +endif
> > +
> > export CC AS AR LD OBJCOPY OBJDUMP STRIP READELF
> > export TOOLCHAIN_CFLAGS TOOLCHAIN_LDFLAGS TOOLCHAIN_ASFLAGS
> > --
> > 2.18.0
> >
next prev parent reply other threads:[~2019-10-09 14:26 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-19 13:48 [dpdk-dev] [PATCH] mk: add support for UBSAN Harman Kalra
2019-09-13 11:40 ` Harman Kalra
2019-10-09 14:25 ` Harman Kalra [this message]
2019-10-28 10:50 ` Harman Kalra
2019-11-11 7:07 ` Thomas Monjalon
2019-11-15 14:46 ` [dpdk-dev] [EXT] " Harman Kalra
2019-11-15 14:54 ` [dpdk-dev] [PATCH v2] " Harman Kalra
2019-11-15 15:34 ` [dpdk-dev] [PATCH v3] " Harman Kalra
2019-11-27 14:23 ` Aaron Conole
2019-11-16 8:31 ` [dpdk-dev] [EXT] Re: [PATCH] " Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191009142524.GA8087@outlook.office365.com \
--to=hkalra@marvell.com \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
--cc=john.mcnamara@intel.com \
--cc=marko.kovacevic@intel.com \
--cc=thomas@monjalon.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.