> -----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