Thread (117 messages) 117 messages, 11 authors, 2021-11-03

Re: [dpdk-dev] [PATCH v13 1/4] enable ASan AddressSanitizer

From: Peng, ZhihongX <hidden>
Date: 2021-10-25 01:58:46

quoted hunk ↗ jump to hunk
-----Original Message-----
From: Peng, ZhihongX <redacted>
Sent: Wednesday, October 20, 2021 3:47 PM
To: david.marchand@redhat.com; thomas@monjalon.net; Burakov, Anatoly
[off-list ref]; Ananyev, Konstantin
[off-list ref]; stephen@networkplumber.org;
Dumitrescu, Cristian [off-list ref]; Mcnamara, John
[off-list ref]; Richardson, Bruce
[off-list ref]
Cc: dev@dpdk.org; Lin, Xueqin <redacted>; Peng, ZhihongX
[off-list ref]
Subject: [PATCH v13 1/4] enable ASan AddressSanitizer

From: Zhihong Peng <redacted>

`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 <redacted>
Signed-off-by: Zhihong Peng <redacted>
Acked-by: John McNamara <redacted>
---
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!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help