[v13,1/4] enable ASan AddressSanitizer

Message ID 20211020074643.3004385-1-zhihongx.peng@intel.com (mailing list archive)
State Accepted, archived
Delegated to: David Marchand
Headers
Series [v13,1/4] enable ASan AddressSanitizer |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Peng, ZhihongX Oct. 20, 2021, 7:46 a.m. UTC
  From: Zhihong Peng <zhihongx.peng@intel.com>

`AddressSanitizer
<https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
is a widely-used debugging tool to detect memory access errors.
It helps to 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 <xueqin.lin@intel.com>
Signed-off-by: Zhihong Peng <zhihongx.peng@intel.com>
Acked-by: John McNamara <john.mcnamara@intel.com>
---
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.
v13:Modify the document.
---
 config/meson.build                     | 16 ++++++++++++++
 devtools/words-case.txt                |  1 +
 doc/guides/prog_guide/asan.rst         | 30 ++++++++++++++++++++++++++
 doc/guides/prog_guide/index.rst        |  1 +
 doc/guides/rel_notes/release_21_11.rst |  9 ++++++++
 5 files changed, 57 insertions(+)
 create mode 100644 doc/guides/prog_guide/asan.rst
  

Comments

Peng, ZhihongX Oct. 25, 2021, 1:58 a.m. UTC | #1
> -----Original Message-----
> From: Peng, ZhihongX <zhihongx.peng@intel.com>
> Sent: Wednesday, October 20, 2021 3:47 PM
> To: david.marchand@redhat.com; thomas@monjalon.net; Burakov, Anatoly
> <anatoly.burakov@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; stephen@networkplumber.org;
> Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>
> Cc: dev@dpdk.org; Lin, Xueqin <xueqin.lin@intel.com>; Peng, ZhihongX
> <zhihongx.peng@intel.com>
> Subject: [PATCH v13 1/4] enable ASan AddressSanitizer
> 
> From: Zhihong Peng <zhihongx.peng@intel.com>
> 
> `AddressSanitizer
> <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan) is a
> widely-used debugging tool to detect memory access errors.
> It helps to 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 <xueqin.lin@intel.com>
> Signed-off-by: Zhihong Peng <zhihongx.peng@intel.com>
> Acked-by: John McNamara <john.mcnamara@intel.com>
> ---
> 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.
> v13:Modify the document.
> ---
>  config/meson.build                     | 16 ++++++++++++++
>  devtools/words-case.txt                |  1 +
>  doc/guides/prog_guide/asan.rst         | 30 ++++++++++++++++++++++++++
>  doc/guides/prog_guide/index.rst        |  1 +
>  doc/guides/rel_notes/release_21_11.rst |  9 ++++++++
>  5 files changed, 57 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..6888fc9a87
> --- /dev/null
> +++ b/doc/guides/prog_guide/asan.rst
> @@ -0,0 +1,30 @@
> +.. SPDX-License-Identifier: BSD-3-Clause
> +   Copyright(c) 2021 Intel Corporation
> +
> +Running AddressSanitizer
> +========================
> +
> +`AddressSanitizer
> +<https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> +is a widely-used debugging tool to detect memory access errors.
> +It helps to 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+).
> +
> +Add following meson build commands to enable ASan in the meson build
> system:
> +
> +* gcc::
> +
> +    -Dbuildtype=debug -Db_sanitize=address
> +
> +* clang::
> +
> +    -Dbuildtype=debug -Db_lundef=false -Db_sanitize=address
> +
> +.. Note::
> +
> +    a) If compile with gcc in centos, libasan needs to be installed separately.
> +    b) If the program is tested using cmdline, you may need to execute the
> +       "stty echo" command when an 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 3362c52a73..10f4275b1b 100644
> --- a/doc/guides/rel_notes/release_21_11.rst
> +++ b/doc/guides/rel_notes/release_21_11.rst
> @@ -173,6 +173,15 @@ New Features
>    * Added tests to verify tunnel header verification in IPsec inbound.
>    * Added tests to verify inner checksum.
> 
> +* **Enable ASan AddressSanitizer.**
> +
> +  `AddressSanitizer
> +  <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> + is a widely-used debugging tool to detect memory access errors.
> +  It helps to 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
>  -------------
> --
> 2.25.1

Hi David, Thomas

This is our last stable patch, and we have resolved the comments from
the community. Hope to get your comments!
  
David Marchand Oct. 29, 2021, 9:21 a.m. UTC | #2
Replying on this patch since there is no cover letter.

This series looks acceptable to me for rc2.

Patch 3 and 4 will be merged first, since they fix issues that would
be hit with ASan enabled.

I have comments mainly on rewording in commitlogs and documentation.

If you are fine with those comments, I'll fix them before pushing this series.



On Wed, Oct 20, 2021 at 9:47 AM <zhihongx.peng@intel.com> wrote:
>
> From: Zhihong Peng <zhihongx.peng@intel.com>
>
> `AddressSanitizer
> <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> is a widely-used debugging tool to detect memory access errors.
> It helps to 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 <xueqin.lin@intel.com>
> Signed-off-by: Zhihong Peng <zhihongx.peng@intel.com>
> Acked-by: John McNamara <john.mcnamara@intel.com>

This patch affects the build process so it should be reflected in the
patch title.
I find the commitlog hard to read.


Suggesting following rewording:
"""
build: enable AddressSanitizer

AddressSanitizer [1] a.k.a. ASan is a widely-used debugging tool to detect
memory access errors.
It helps to 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.

ASan is integrated with gcc and clang and can be enabled via a meson
option: -Db_sanitize=address
See the documentation for details (especially regarding clang).

Enabling ASan has an impact on performance since additional checks are
added to generated binaries.

Enabling ASan with Windows is currently not supported in DPDK.


1: https://github.com/google/sanitizers/wiki/AddressSanitizer
"""

> ---
> 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.
> v13:Modify the document.
> ---
>  config/meson.build                     | 16 ++++++++++++++
>  devtools/words-case.txt                |  1 +
>  doc/guides/prog_guide/asan.rst         | 30 ++++++++++++++++++++++++++
>  doc/guides/prog_guide/index.rst        |  1 +
>  doc/guides/rel_notes/release_21_11.rst |  9 ++++++++
>  5 files changed, 57 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

I see clang started supporting ASan for Windows in version 8.
https://releases.llvm.org/8.0.0/tools/clang/docs/AddressSanitizer.html

I also found some blog about adding ASan support in MSVC.
https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/

Keeping this limitation is acceptable for now, but I added a mention
in commitlog.


> +
> +    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..6888fc9a87
> --- /dev/null
> +++ b/doc/guides/prog_guide/asan.rst
> @@ -0,0 +1,30 @@
> +.. SPDX-License-Identifier: BSD-3-Clause
> +   Copyright(c) 2021 Intel Corporation
> +
> +Running AddressSanitizer
> +========================
> +
> +`AddressSanitizer
> +<https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> +is a widely-used debugging tool to detect memory access errors.
> +It helps to 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+).
> +
> +Add following meson build commands to enable ASan in the meson build system:
> +
> +* gcc::
> +
> +    -Dbuildtype=debug -Db_sanitize=address
> +
> +* clang::
> +
> +    -Dbuildtype=debug -Db_lundef=false -Db_sanitize=address

Suggests adding some explanations here and replacing like:

"""
...

AddressSanitizer is a part of LLVM (3.1+) and GCC (4.8+).

Enabling ASan is done by passing the -Db_sanitize=address option to
the meson build system,
see :ref:`linux_gsg_compiling_dpdk` for details.

The way ASan is integrated with clang requires to allow undefined
symbols when linking code.
To do this, the -Db_lundef=false option must be added.

Additionally, passing -Dbuildtype=debug option might help getting more
readable ASan reports.

Example::

  - gcc: meson setup -Db_sanitize=address <build_dir>
  - clang: meson setup -Db_sanitize=address -Db_lundef=false <build_dir>
"""

> +
> +.. Note::
> +
> +    a) If compile with gcc in centos, libasan needs to be installed separately.
> +    b) If the program is tested using cmdline, you may need to execute the
> +       "stty echo" command when an error occurs.

"""
  - The libasan package must be installed when compiling with gcc in
Centos/RHEL.
  - If the program is tested using cmdline, you may need to execute the
    "stty echo" command when an 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 3362c52a73..10f4275b1b 100644
> --- a/doc/guides/rel_notes/release_21_11.rst
> +++ b/doc/guides/rel_notes/release_21_11.rst
> @@ -173,6 +173,15 @@ New Features
>    * Added tests to verify tunnel header verification in IPsec inbound.
>    * Added tests to verify inner checksum.
>
> +* **Enable ASan AddressSanitizer.**

Should be in past form:

* **Added ASan support.**





> +
> +  `AddressSanitizer
> +  <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> +  is a widely-used debugging tool to detect memory access errors.
> +  It helps to 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.
  
Peng, ZhihongX Oct. 29, 2021, 12:48 p.m. UTC | #3
> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Friday, October 29, 2021 5:22 PM
> To: Peng, ZhihongX <zhihongx.peng@intel.com>
> Cc: Thomas Monjalon <thomas@monjalon.net>; Burakov, Anatoly
> <anatoly.burakov@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Stephen Hemminger
> <stephen@networkplumber.org>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>; dev <dev@dpdk.org>; Lin, Xueqin
> <xueqin.lin@intel.com>
> Subject: Re: [PATCH v13 1/4] enable ASan AddressSanitizer
> 
> Replying on this patch since there is no cover letter.
> 
> This series looks acceptable to me for rc2.
> 
> Patch 3 and 4 will be merged first, since they fix issues that would be hit with
> ASan enabled.
> 
> I have comments mainly on rewording in commitlogs and documentation.
> 
> If you are fine with those comments, I'll fix them before pushing this series.

Thank you very much for your help, I agree with this modification, it's good.
You have done a lot of work for asan patch, thank you again.

Regards,
Peng,Zhihong
> 
> 
> On Wed, Oct 20, 2021 at 9:47 AM <zhihongx.peng@intel.com> wrote:
> >
> > From: Zhihong Peng <zhihongx.peng@intel.com>
> >
> > `AddressSanitizer
> > <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> > is a widely-used debugging tool to detect memory access errors.
> > It helps to 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 <xueqin.lin@intel.com>
> > Signed-off-by: Zhihong Peng <zhihongx.peng@intel.com>
> > Acked-by: John McNamara <john.mcnamara@intel.com>
> 
> This patch affects the build process so it should be reflected in the patch title.
> I find the commitlog hard to read.
> 
> 
> Suggesting following rewording:
> """
> build: enable AddressSanitizer
> 
> AddressSanitizer [1] a.k.a. ASan is a widely-used debugging tool to detect
> memory access errors.
> It helps to 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.
> 
> ASan is integrated with gcc and clang and can be enabled via a meson
> option: -Db_sanitize=address
> See the documentation for details (especially regarding clang).
> 
> Enabling ASan has an impact on performance since additional checks are
> added to generated binaries.
> 
> Enabling ASan with Windows is currently not supported in DPDK.
> 
> 
> 1: https://github.com/google/sanitizers/wiki/AddressSanitizer
> """
> 
> > ---
> > 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.
> > v13:Modify the document.
> > ---
> >  config/meson.build                     | 16 ++++++++++++++
> >  devtools/words-case.txt                |  1 +
> >  doc/guides/prog_guide/asan.rst         | 30 ++++++++++++++++++++++++++
> >  doc/guides/prog_guide/index.rst        |  1 +
> >  doc/guides/rel_notes/release_21_11.rst |  9 ++++++++
> >  5 files changed, 57 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
> 
> I see clang started supporting ASan for Windows in version 8.
> https://releases.llvm.org/8.0.0/tools/clang/docs/AddressSanitizer.html
> 
> I also found some blog about adding ASan support in MSVC.
> https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-
> windows-with-msvc/
> 
> Keeping this limitation is acceptable for now, but I added a mention in
> commitlog.
> 
> 
> > +
> > +    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..6888fc9a87
> > --- /dev/null
> > +++ b/doc/guides/prog_guide/asan.rst
> > @@ -0,0 +1,30 @@
> > +.. SPDX-License-Identifier: BSD-3-Clause
> > +   Copyright(c) 2021 Intel Corporation
> > +
> > +Running AddressSanitizer
> > +========================
> > +
> > +`AddressSanitizer
> > +<https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
> > +is a widely-used debugging tool to detect memory access errors.
> > +It helps to 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+).
> > +
> > +Add following meson build commands to enable ASan in the meson build
> system:
> > +
> > +* gcc::
> > +
> > +    -Dbuildtype=debug -Db_sanitize=address
> > +
> > +* clang::
> > +
> > +    -Dbuildtype=debug -Db_lundef=false -Db_sanitize=address
> 
> Suggests adding some explanations here and replacing like:
> 
> """
> ...
> 
> AddressSanitizer is a part of LLVM (3.1+) and GCC (4.8+).
> 
> Enabling ASan is done by passing the -Db_sanitize=address option to the
> meson build system, see :ref:`linux_gsg_compiling_dpdk` for details.
> 
> The way ASan is integrated with clang requires to allow undefined symbols
> when linking code.
> To do this, the -Db_lundef=false option must be added.
> 
> Additionally, passing -Dbuildtype=debug option might help getting more
> readable ASan reports.
> 
> Example::
> 
>   - gcc: meson setup -Db_sanitize=address <build_dir>
>   - clang: meson setup -Db_sanitize=address -Db_lundef=false <build_dir> """
> 
> > +
> > +.. Note::
> > +
> > +    a) If compile with gcc in centos, libasan needs to be installed separately.
> > +    b) If the program is tested using cmdline, you may need to execute the
> > +       "stty echo" command when an error occurs.
> 
> """
>   - The libasan package must be installed when compiling with gcc in
> Centos/RHEL.
>   - If the program is tested using cmdline, you may need to execute the
>     "stty echo" command when an 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 3362c52a73..10f4275b1b 100644
> > --- a/doc/guides/rel_notes/release_21_11.rst
> > +++ b/doc/guides/rel_notes/release_21_11.rst
> > @@ -173,6 +173,15 @@ New Features
> >    * Added tests to verify tunnel header verification in IPsec inbound.
> >    * Added tests to verify inner checksum.
> >
> > +* **Enable ASan AddressSanitizer.**
> 
> Should be in past form:
> 
> * **Added ASan support.**
> 
> 
> 
> 
> 
> > +
> > +  `AddressSanitizer
> > +  <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_
> > + (ASan)  is a widely-used debugging tool to detect memory access errors.
> > +  It helps to 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.
> 
> 
> --
> David Marchand
  
David Marchand Oct. 29, 2021, 2:50 p.m. UTC | #4
On Fri, Oct 29, 2021 at 11:21 AM David Marchand
<david.marchand@redhat.com> wrote:
>
> Replying on this patch since there is no cover letter.
>
> This series looks acceptable to me for rc2.
>
> Patch 3 and 4 will be merged first, since they fix issues that would
> be hit with ASan enabled.
>
> I have comments mainly on rewording in commitlogs and documentation.
>
> If you are fine with those comments, I'll fix them before pushing this series.
>

Series applied with suggestions.

ASan is a really interesting tool, but there are still issues in some
components.
I caught a few and opened bugs.

We should work on fixing them so that we can have ASan enabled in the CI.
The sooner, the better.


Thanks.
  
Lin, Xueqin Nov. 1, 2021, 3:37 a.m. UTC | #5
> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Friday, October 29, 2021 10:51 PM
> To: Peng, ZhihongX <zhihongx.peng@intel.com>
> Cc: Thomas Monjalon <thomas@monjalon.net>; Burakov, Anatoly
> <anatoly.burakov@intel.com>; Ananyev, Konstantin
> <konstantin.ananyev@intel.com>; Stephen Hemminger
> <stephen@networkplumber.org>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>; dev <dev@dpdk.org>; Lin, Xueqin
> <xueqin.lin@intel.com>
> Subject: Re: [PATCH v13 1/4] enable ASan AddressSanitizer
> 
> On Fri, Oct 29, 2021 at 11:21 AM David Marchand
> <david.marchand@redhat.com> wrote:
> >
> > Replying on this patch since there is no cover letter.
> >
> > This series looks acceptable to me for rc2.
> >
> > Patch 3 and 4 will be merged first, since they fix issues that would
> > be hit with ASan enabled.
> >
> > I have comments mainly on rewording in commitlogs and documentation.
> >
> > If you are fine with those comments, I'll fix them before pushing this series.
> >
> 
> Series applied with suggestions.

Really happy that we co-worked and let this interesting  tool code merge to DPDK. 
Thanks a lot David, Thomas, Anatoly, Bruce, John, Hemminger, Konstantin, Cristian... , without your great help and support, we can't let this happen.

> 
> ASan is a really interesting tool, but there are still issues in some components.
> I caught a few and opened bugs.

Are they DPDK bugs or this tool code bugs?
Have you reported and tracked in bugzalla? Not sure if we captured them, as you know, we used this tool to detect and found lots of DPDK bugs in various of components that static scan tool can't find. 
Most for the issues have been fixed, really difficult for us because we are not experts on lots of components for DPDK issues fix.
The tool already merged, each component owner could detect and fix memory bugs by themselves now. 

> 
> We should work on fixing them so that we can have ASan enabled in the CI.
> The sooner, the better.

Agree, really good idea to use it in CI also, it could help to detect issues that static tool  can't find. 
We also have enabled ASan script code in DTS for the memory detect, next step, we will upload the code. Then CI also could use or reference the code. 
Thanks.
> 
> 
> Thanks.
> 
> --
> David Marchand
  
David Marchand Nov. 2, 2021, 5:29 p.m. UTC | #6
On Mon, Nov 1, 2021 at 4:37 AM Lin, Xueqin <xueqin.lin@intel.com> wrote:
> > ASan is a really interesting tool, but there are still issues in some components.
> > I caught a few and opened bugs.
>
> Are they DPDK bugs or this tool code bugs?

DPDK bugs that I started reporting some weeks ago.
I mentionned it during CI call.
bzs can be queried via: https://bugs.dpdk.org/buglist.cgi?quicksearch=[asan]
Some fixes have been sent.

> Have you reported and tracked in bugzalla? Not sure if we captured them, as you know, we used this tool to detect and found lots of DPDK bugs in various of components that static scan tool can't find.

Not sure I understand.
Did you catch more issues but you did not report upstream?

If so, please make them public.
  
Lin, Xueqin Nov. 3, 2021, 9:36 a.m. UTC | #7
> -----Original Message-----
> From: David Marchand <david.marchand@redhat.com>
> Sent: Wednesday, November 3, 2021 1:29 AM
> To: Lin, Xueqin <xueqin.lin@intel.com>
> Cc: Peng, ZhihongX <zhihongx.peng@intel.com>; Thomas Monjalon
> <thomas@monjalon.net>; Burakov, Anatoly <anatoly.burakov@intel.com>;
> Ananyev, Konstantin <konstantin.ananyev@intel.com>; Stephen Hemminger
> <stephen@networkplumber.org>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Mcnamara, John
> <john.mcnamara@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>; dev <dev@dpdk.org>; Chen, Zhaoyan
> <zhaoyan.chen@intel.com>; Tu, Lijuan <lijuan.tu@intel.com>
> Subject: Re: [dpdk-dev] [PATCH v13 1/4] enable ASan AddressSanitizer
> 
> On Mon, Nov 1, 2021 at 4:37 AM Lin, Xueqin <xueqin.lin@intel.com> wrote:
> > > ASan is a really interesting tool, but there are still issues in some
> components.
> > > I caught a few and opened bugs.
> >
> > Are they DPDK bugs or this tool code bugs?
> 
> DPDK bugs that I started reporting some weeks ago.
> I mentionned it during CI call.
> bzs can be queried via: https://bugs.dpdk.org/buglist.cgi?quicksearch=[asan]
> Some fixes have been sent.

Cool, IC, we tracked some internal bugs in internal bug system, and public to report some common modules in bugzalla, such as 738 737 792 722 723 735... 
Most of patches have been sent and upstreamed, bugzalla remained below bug is not resolved.
https://bugs.dpdk.org/show_bug.cgi?id=792

> 
> > Have you reported and tracked in bugzalla? Not sure if we captured them, as
> you know, we used this tool to detect and found lots of DPDK bugs in various of
> components that static scan tool can't find.
> 
> Not sure I understand.
> Did you catch more issues but you did not report upstream?
> 
> If so, please make them public.

Sure,  we will public them if they are common modules, also add flag [asan] in title to filter them.
  
> 
> 
> --
> David Marchand
  
David Marchand Nov. 3, 2021, 9:44 a.m. UTC | #8
On Wed, Nov 3, 2021 at 10:36 AM Lin, Xueqin <xueqin.lin@intel.com> wrote:
> > > Are they DPDK bugs or this tool code bugs?
> >
> > DPDK bugs that I started reporting some weeks ago.
> > I mentionned it during CI call.
> > bzs can be queried via: https://bugs.dpdk.org/buglist.cgi?quicksearch=[asan]
> > Some fixes have been sent.
>
> Cool, IC, we tracked some internal bugs in internal bug system, and public to report some common modules in bugzalla, such as 738 737 792 722 723 735...
> Most of patches have been sent and upstreamed, bugzalla remained below bug is not resolved.
> https://bugs.dpdk.org/show_bug.cgi?id=792

I had forgotten this bz, and caught the issue while looking at another
issue on device hotplug.
I posted a fix yesterday.
  

Patch

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..6888fc9a87
--- /dev/null
+++ b/doc/guides/prog_guide/asan.rst
@@ -0,0 +1,30 @@ 
+.. SPDX-License-Identifier: BSD-3-Clause
+   Copyright(c) 2021 Intel Corporation
+
+Running AddressSanitizer
+========================
+
+`AddressSanitizer
+<https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
+is a widely-used debugging tool to detect memory access errors.
+It helps to 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+).
+
+Add following meson build commands to enable ASan in the meson build system:
+
+* gcc::
+
+    -Dbuildtype=debug -Db_sanitize=address
+
+* clang::
+
+    -Dbuildtype=debug -Db_lundef=false -Db_sanitize=address
+
+.. Note::
+
+    a) If compile with gcc in centos, libasan needs to be installed separately.
+    b) If the program is tested using cmdline, you may need to execute the
+       "stty echo" command when an 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 3362c52a73..10f4275b1b 100644
--- a/doc/guides/rel_notes/release_21_11.rst
+++ b/doc/guides/rel_notes/release_21_11.rst
@@ -173,6 +173,15 @@  New Features
   * Added tests to verify tunnel header verification in IPsec inbound.
   * Added tests to verify inner checksum.
 
+* **Enable ASan AddressSanitizer.**
+
+  `AddressSanitizer
+  <https://github.com/google/sanitizers/wiki/AddressSanitizer>`_ (ASan)
+  is a widely-used debugging tool to detect memory access errors.
+  It helps to 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
 -------------