On Wed, Oct 20, 2021 at 9:47 AM <zhihongx.p...@intel.com> wrote:
>
> From: Zhihong Peng <zhihongx.p...@intel.com>
>
> DPDK ASan functionality is currently only supported on Linux x86_64.
> If want to support on other platforms, need to define ASAN_SHADOW_OFFSET
> value according to google ASan document, and configure meson file
> (config/meson.build).
>
> Signed-off-by: Xueqin Lin <xueqin....@intel.com>
> Signed-off-by: Zhihong Peng <zhihongx.p...@intel.com>
> Acked-by: Anatoly Burakov <anatoly.bura...@intel.com>

Suggests following title/commitlog:
"""
mem: instrument allocator for ASan

This patch adds necessary hooks in the memory allocator for ASan.

This feature is currently available in DPDK only on Linux x86_64.
If other OS/architectures want to support it, ASAN_SHADOW_OFFSET must be
defined and RTE_MALLOC_ASAN must be set accordingly in meson.
"""

> ---
> v7: Split doc and code into two.
> v8: No change.
> v9: Modify the definition of RTE_MALLOC_ASAN.
> v10:Modify the definition of RTE_MALLOC_ASAN.
> v11:No change.
> v12:No change.
> v13:Modify the document.
> ---
>  config/meson.build             |   4 +
>  doc/guides/prog_guide/asan.rst |  58 +++++++++-
>  lib/eal/common/malloc_elem.c   |  26 ++++-
>  lib/eal/common/malloc_elem.h   | 194 ++++++++++++++++++++++++++++++++-
>  lib/eal/common/malloc_heap.c   |  12 ++
>  lib/eal/common/rte_malloc.c    |   9 +-
>  6 files changed, 296 insertions(+), 7 deletions(-)
>
> diff --git a/config/meson.build b/config/meson.build
> index f02b0e9c6d..bf751583bd 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -425,6 +425,10 @@ if get_option('b_sanitize') == 'address' or 
> get_option('b_sanitize') == 'address
>          add_project_link_arguments('-lasan', language: 'c')
>          dpdk_extra_ldflags += '-lasan'
>      endif
> +
> +    if is_linux and arch_subdir == 'x86'

Missing a check on "and dpdk_conf.get('RTE_ARCH_64')" for i386 build.


> +       dpdk_conf.set10('RTE_MALLOC_ASAN', true)
> +    endif
>  endif
>
>  if get_option('default_library') == 'both'
> diff --git a/doc/guides/prog_guide/asan.rst b/doc/guides/prog_guide/asan.rst
> index 6888fc9a87..02591ca68a 100644
> --- a/doc/guides/prog_guide/asan.rst
> +++ b/doc/guides/prog_guide/asan.rst
> @@ -13,6 +13,58 @@ printing out detailed debug information whenever an error 
> is detected.
>
>  AddressSanitizer is a part of LLVM (3.1+) and GCC (4.8+).

I'll move the examples after the explanations on how to enable ASan.


>
> +DPDK ASan functionality is currently only supported on Linux x86_64.
> +If want to support on other platforms, need to define ASAN_SHADOW_OFFSET
> +value according to google ASan document, and configure meson file
> +(config/meson.build).

DPDK ASan functionnality is vague.

Suggests rewording:
"""
ASan is aware of DPDK memory allocations, thanks to added instrumentation.
This is only enabled on x86_64 at the moment.
Other architectures may have to define ASAN_SHADOW_OFFSET.
"""


> +
> +Example heap-buffer-overflow error
> +----------------------------------
> +
> +Add below unit test code in examples/helloworld/main.c::
> +
> +    Add code to helloworld:
> +    char *p = rte_zmalloc(NULL, 9, 0);
> +    if (!p) {
> +        printf("rte_zmalloc error.");
> +        return -1;
> +    }
> +    p[9] = 'a';
> +
> +Above code will result in heap-buffer-overflow error if ASan is enabled, 
> because apply 9 bytes of memory but access the tenth byte, detailed error log 
> as below::
> +
> +    ==369953==ERROR: AddressSanitizer: heap-buffer-overflow on address 
> 0x7fb17f465809 at pc 0x5652e6707b84 bp 0x7ffea70eea20 sp 0x7ffea70eea10 WRITE 
> of size 1 at 0x7fb17f465809 thread T0
> +    #0 0x5652e6707b83 in main ../examples/helloworld/main.c:47
> +    #1 0x7fb94953c0b2 in __libc_start_main 
> (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
> +    #2 0x5652e67079bd in _start 
> (/home/pzh/asan_test/x86_64-native-linuxapp-gcc/examples/dpdk-helloworld+0x8329bd)
> +
> +    Address 0x7fb17f465809 is a wild pointer.
> +    SUMMARY: AddressSanitizer: heap-buffer-overflow 
> ../examples/helloworld/main.c:47 in main

I'll move the note update here:
"""
Note::

  - Some of the features of ASan (for example, 'Display memory
application location, currently
    displayed as a wild pointer') are not currently supported with
DPDK allocations.

"""

> +
> +Example use-after-free error
> +----------------------------
> +
> +Add below unit test code in examples/helloworld/main.c::
> +
> +    Add code to helloworld:
> +    char *p = rte_zmalloc(NULL, 9, 0);
> +    if (!p) {
> +        printf("rte_zmalloc error.");
> +        return -1;
> +    }
> +    rte_free(p);
> +    *p = 'a';
> +
> +Above code will result in use-after-free error if ASan is enabled, because 
> apply 9 bytes of memory but access the first byte after release, detailed 
> error log as below::
> +
> +    ==417048==ERROR: AddressSanitizer: heap-use-after-free on address 
> 0x7fc83f465800 at pc 0x564308a39b89 bp 0x7ffc8c85bf50 sp 0x7ffc8c85bf40 WRITE 
> of size 1 at 0x7fc83f465800 thread T0
> +    #0 0x564308a39b88 in main ../examples/helloworld/main.c:48
> +    #1 0x7fd0079c60b2 in __libc_start_main 
> (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
> +    #2 0x564308a399bd in _start 
> (/home/pzh/asan_test/x86_64-native-linuxapp-gcc/examples/dpdk-helloworld+0x8329bd)
> +
> +    Address 0x7fc83f465800 is a wild pointer.
> +    SUMMARY: AddressSanitizer: heap-use-after-free 
> ../examples/helloworld/main.c:48 in main
> +
>  Add following meson build commands to enable ASan in the meson build system:
>
>  * gcc::
> @@ -25,6 +77,8 @@ Add following meson build commands to enable ASan in the 
> meson build system:
>
>  .. 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
> +    a) Some of the features of ASan (for example, 'Display memory 
> application location, currently
> +       displayed as a wild pointer') are not currently supported by DPDK's 
> implementation.
> +    b) If compile with gcc in centos, libasan needs to be installed 
> separately.
> +    c) If the program is tested using cmdline, you may need to execute the
>         "stty echo" command when an error occurs.


-- 
David Marchand

Reply via email to