> -----Original Message-----
> From: David Marchand <david.march...@redhat.com>
> Sent: Friday, October 29, 2021 5:23 PM
> To: Peng, ZhihongX <zhihongx.p...@intel.com>
> Cc: Thomas Monjalon <tho...@monjalon.net>; Burakov, Anatoly
> <anatoly.bura...@intel.com>; Ananyev, Konstantin
> <konstantin.anan...@intel.com>; Stephen Hemminger
> <step...@networkplumber.org>; Dumitrescu, Cristian
> <cristian.dumitre...@intel.com>; Mcnamara, John
> <john.mcnam...@intel.com>; Richardson, Bruce
> <bruce.richard...@intel.com>; dev <dev@dpdk.org>; Lin, Xueqin
> <xueqin....@intel.com>
> Subject: Re: [PATCH v13 2/4] DPDK code adapts to ASan
> 
> 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-
> hellow
> > + orld+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.
> 
> """

I agree with the above changes.

> > +
> > +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-
> hellow
> > + orld+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