From patchwork Tue Oct 19 13:58:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Peng, ZhihongX" X-Patchwork-Id: 102243 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0D7BDA0C41; Tue, 19 Oct 2021 16:20:08 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AB7DA411EA; Tue, 19 Oct 2021 16:20:00 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mails.dpdk.org (Postfix) with ESMTP id 2AF21411E0 for ; Tue, 19 Oct 2021 16:19:56 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10142"; a="208625537" X-IronPort-AV: E=Sophos;i="5.87,164,1631602800"; d="scan'208";a="208625537" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Oct 2021 06:59:07 -0700 X-IronPort-AV: E=Sophos;i="5.87,164,1631602800"; d="scan'208";a="494107966" Received: from unknown (HELO localhost.localdomain) ([10.240.183.65]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Oct 2021 06:59:03 -0700 From: zhihongx.peng@intel.com To: david.marchand@redhat.com, anatoly.burakov@intel.com, konstantin.ananyev@intel.com, stephen@networkplumber.org, cristian.dumitrescu@intel.com, john.mcnamara@intel.com, bruce.richardson@intel.com Cc: dev@dpdk.org, xueqin.lin@intel.com, Zhihong Peng Date: Tue, 19 Oct 2021 21:58:38 +0800 Message-Id: <20211019135841.2004819-1-zhihongx.peng@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211019101207.1451058-4-zhihongx.peng@intel.com> References: <20211019101207.1451058-4-zhihongx.peng@intel.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v12 1/4] Enable ASan Address Sanitization X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Zhihong Peng `AddressSanitizer `_ (ASan) is a widely-used debugging tool to detect memory access errors. It helps detect issues like use-after-free, various kinds of buffer overruns in C/C++ programs, and other similar errors, as well as printing out detailed debug information whenever an error is detected. We can enable ASan by adding below compilation options: -Dbuildtype=debug -Db_lundef=false -Db_sanitize=address "-Dbuildtype=debug": This is a non-essential option. When this option is added, if a memory error occurs, ASan can clearly show where the code is wrong. "-Db_lundef=false": When use clang to compile DPDK, this option must be added. Signed-off-by: Xueqin Lin Signed-off-by: Zhihong Peng Acked-by: John McNamara --- v7: 1) Split doc and code into two. 2) Modify asan.rst doc v8: No change. v9: 1) Add the check of libasan library. 2) Add release notes. v10:1) Split doc and code into two. 2) Meson supports asan. v11:Modify the document. v12:No change. --- config/meson.build | 16 +++++++++++ devtools/words-case.txt | 1 + doc/guides/prog_guide/asan.rst | 40 ++++++++++++++++++++++++++ doc/guides/prog_guide/index.rst | 1 + doc/guides/rel_notes/release_21_11.rst | 9 ++++++ 5 files changed, 67 insertions(+) create mode 100644 doc/guides/prog_guide/asan.rst diff --git a/config/meson.build b/config/meson.build index 4cdf589e20..f02b0e9c6d 100644 --- a/config/meson.build +++ b/config/meson.build @@ -411,6 +411,22 @@ if get_option('b_lto') endif endif +if get_option('b_sanitize') == 'address' or get_option('b_sanitize') == 'address,undefined' + if is_windows + error('ASan is not supported on windows') + endif + + if cc.get_id() == 'gcc' + asan_dep = cc.find_library('asan', required: true) + if (not cc.links('int main(int argc, char *argv[]) { return 0; }', + dependencies: asan_dep)) + error('broken dependency, "libasan"') + endif + add_project_link_arguments('-lasan', language: 'c') + dpdk_extra_ldflags += '-lasan' + endif +endif + if get_option('default_library') == 'both' error( ''' Unsupported value "both" for "default_library" option. diff --git a/devtools/words-case.txt b/devtools/words-case.txt index 0bbad48626..ada6910fa0 100644 --- a/devtools/words-case.txt +++ b/devtools/words-case.txt @@ -5,6 +5,7 @@ API Arm armv7 armv8 +ASan BAR CRC DCB diff --git a/doc/guides/prog_guide/asan.rst b/doc/guides/prog_guide/asan.rst new file mode 100644 index 0000000000..969676ebe8 --- /dev/null +++ b/doc/guides/prog_guide/asan.rst @@ -0,0 +1,40 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(c) 2021 Intel Corporation + +Running Address Sanitizer +========================= + +`AddressSanitizer +`_ (ASan) +is a widely-used debugging tool to detect memory access errors. +It helps detect issues like use-after-free, various kinds of buffer +overruns in C/C++ programs, and other similar errors, as well as +printing out detailed debug information whenever an error is detected. + +AddressSanitizer is a part of LLVM (3.1+) and GCC (4.8+). + +Usage +----- + +meson build +^^^^^^^^^^^ + +To enable ASan in meson build system, use following meson build command: + +Example usage:: + +* gcc:: + + meson build -Dbuildtype=debug -Db_sanitize=address + ninja -C build + +* clang:: + + meson build -Dbuildtype=debug -Db_lundef=false -Db_sanitize=address + ninja -C build + +.. Note:: + + a) To compile with gcc in centos, libasan needs to be installed separately. + b) If the program being tested uses cmdline you will need to execute the + "stty echo" command when a error occurs. diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index 89af28dacb..b95c460b19 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -71,4 +71,5 @@ Programmer's Guide writing_efficient_code lto profile_app + asan glossary diff --git a/doc/guides/rel_notes/release_21_11.rst b/doc/guides/rel_notes/release_21_11.rst index d5435a64aa..63d9fef1b4 100644 --- a/doc/guides/rel_notes/release_21_11.rst +++ b/doc/guides/rel_notes/release_21_11.rst @@ -167,6 +167,15 @@ New Features * Added tests to verify tunnel header verification in IPsec inbound. * Added tests to verify inner checksum. +* **Enable ASan Address Sanitization.** + + `AddressSanitizer + `_ (ASan) + is a widely-used debugging tool to detect memory access errors. + It helps detect issues like use-after-free, various kinds of buffer + overruns in C/C++ programs, and other similar errors, as well as + printing out detailed debug information whenever an error is detected. + Removed Items -------------