[v2,2/2] ci: build some job with ASan

Message ID 20220505092952.11818-3-david.marchand@redhat.com (mailing list archive)
State Accepted, archived
Delegated to: David Marchand
Headers
Series Enable ASan in GHA |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/github-robot: build success github build: passed
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-abi-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS

Commit Message

David Marchand May 5, 2022, 9:29 a.m. UTC
  Enable ASan, this can greatly help identify leaks and buffer overflows.
Running unit tests relying on multiprocess is unreliable with ASan
enabled, so skip them.

Signed-off-by: David Marchand <david.marchand@redhat.com>
---
Changes since v1:
- reinstated table_autotest in "ASan-safe" list of ut,

---
 .ci/linux-build.sh          |   8 ++
 .github/workflows/build.yml |   3 +-
 app/test/meson.build        | 208 +++++++++++++++++++-----------------
 3 files changed, 118 insertions(+), 101 deletions(-)
  

Comments

Aaron Conole May 10, 2022, 7:22 p.m. UTC | #1
David Marchand <david.marchand@redhat.com> writes:

> Enable ASan, this can greatly help identify leaks and buffer overflows.
> Running unit tests relying on multiprocess is unreliable with ASan
> enabled, so skip them.
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> Changes since v1:
> - reinstated table_autotest in "ASan-safe" list of ut,

This is great!

Acked-by: Aaron Conole <aconole@redhat.com>
  

Patch

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index 774a1441bf..93706c0131 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -95,6 +95,14 @@  if [ "$MINI" = "true" ]; then
     OPTS="$OPTS -Denable_drivers=net/null"
     OPTS="$OPTS -Ddisable_libs=*"
 fi
+
+if [ "$ASAN" = "true" ]; then
+    OPTS="$OPTS -Db_sanitize=address"
+    if [ "${CC%%clang}" != "$CC" ]; then
+        OPTS="$OPTS -Db_lundef=false"
+    fi
+fi
+
 meson build --werror $OPTS
 ninja -C build
 
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 22daaabb91..45871e76ed 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -16,6 +16,7 @@  jobs:
     env:
       AARCH64: ${{ matrix.config.cross == 'aarch64' }}
       ABI_CHECKS: ${{ contains(matrix.config.checks, 'abi') }}
+      ASAN: ${{ contains(matrix.config.checks, 'asan') }}
       BUILD_32BIT: ${{ matrix.config.cross == 'i386' }}
       BUILD_DOCS: ${{ contains(matrix.config.checks, 'doc') }}
       CC: ccache ${{ matrix.config.compiler }}
@@ -47,7 +48,7 @@  jobs:
           - os: ubuntu-18.04
             compiler: clang
             library: shared
-            checks: doc+tests
+            checks: asan+doc+tests
           - os: ubuntu-18.04
             compiler: gcc
             library: static
diff --git a/app/test/meson.build b/app/test/meson.build
index 5fc1dd1b7b..bb4621ed2a 100644
--- a/app/test/meson.build
+++ b/app/test/meson.build
@@ -149,96 +149,97 @@  test_deps = enabled_libs
 # as well as libs, the pci and vdev bus drivers are needed for a lot of tests
 test_deps += ['bus_pci', 'bus_vdev']
 
-# Each test is marked with flag true/false
-# to indicate whether it can run in no-huge mode.
+# Each test is marked with flags:
+# - the first flag indicates whether the test can run in no-huge mode,
+# - the second flag indicates whether the test can run with ASan enabled,
 fast_tests = [
-        ['acl_autotest', true],
-        ['atomic_autotest', false],
-        ['bitmap_autotest', true],
-        ['bpf_autotest', true],
-        ['bpf_convert_autotest', true],
-        ['bitops_autotest', true],
-        ['byteorder_autotest', true],
-        ['cksum_autotest', true],
-        ['cmdline_autotest', true],
-        ['common_autotest', true],
-        ['cpuflags_autotest', true],
-        ['debug_autotest', true],
-        ['devargs_autotest', true],
-        ['eal_flags_c_opt_autotest', false],
-        ['eal_flags_main_opt_autotest', false],
-        ['eal_flags_n_opt_autotest', false],
-        ['eal_flags_hpet_autotest', false],
-        ['eal_flags_no_huge_autotest', false],
-        ['eal_flags_a_opt_autotest', false],
-        ['eal_flags_b_opt_autotest', false],
-        ['eal_flags_vdev_opt_autotest', false],
-        ['eal_flags_r_opt_autotest', false],
-        ['eal_flags_mem_autotest', false],
-        ['eal_flags_file_prefix_autotest', false],
-        ['eal_flags_misc_autotest', false],
-        ['eal_fs_autotest', true],
-        ['errno_autotest', true],
-        ['ethdev_link_status', true],
-        ['event_ring_autotest', true],
-        ['fib_autotest', true],
-        ['fib6_autotest', true],
-        ['func_reentrancy_autotest', false],
-        ['hash_autotest', true],
-        ['interrupt_autotest', true],
-        ['ipfrag_autotest', false],
-        ['lcores_autotest', true],
-        ['logs_autotest', true],
-        ['lpm_autotest', true],
-        ['lpm6_autotest', true],
-        ['malloc_autotest', false],
-        ['mbuf_autotest', false],
-        ['mcslock_autotest', false],
-        ['memcpy_autotest', true],
-        ['memory_autotest', false],
-        ['mempool_autotest', false],
-        ['memzone_autotest', false],
-        ['meter_autotest', true],
-        ['multiprocess_autotest', false],
-        ['per_lcore_autotest', true],
-        ['pflock_autotest', true],
-        ['prefetch_autotest', true],
-        ['rcu_qsbr_autotest', true],
-        ['pie_autotest', true],
-        ['rib_autotest', true],
-        ['rib6_autotest', true],
-        ['ring_autotest', true],
-        ['rwlock_test1_autotest', true],
-        ['rwlock_rda_autotest', true],
-        ['rwlock_rds_wrm_autotest', true],
-        ['rwlock_rde_wro_autotest', true],
-        ['sched_autotest', true],
-        ['security_autotest', false],
-        ['spinlock_autotest', true],
-        ['stack_autotest', false],
-        ['stack_lf_autotest', false],
-        ['string_autotest', true],
-        ['tailq_autotest', true],
-        ['ticketlock_autotest', true],
-        ['timer_autotest', false],
-        ['user_delay_us', true],
-        ['version_autotest', true],
-        ['crc_autotest', true],
-        ['distributor_autotest', false],
-        ['eventdev_common_autotest', true],
-        ['fbarray_autotest', true],
-        ['hash_readwrite_func_autotest', false],
-        ['ipsec_autotest', true],
-        ['kni_autotest', false],
-        ['kvargs_autotest', true],
-        ['member_autotest', true],
-        ['power_cpufreq_autotest', false],
-        ['power_autotest', true],
-        ['power_kvm_vm_autotest', false],
-        ['reorder_autotest', true],
-        ['service_autotest', true],
-        ['thash_autotest', true],
-        ['trace_autotest', true],
+        ['acl_autotest', true, true],
+        ['atomic_autotest', false, true],
+        ['bitmap_autotest', true, true],
+        ['bpf_autotest', true, true],
+        ['bpf_convert_autotest', true, true],
+        ['bitops_autotest', true, true],
+        ['byteorder_autotest', true, true],
+        ['cksum_autotest', true, true],
+        ['cmdline_autotest', true, true],
+        ['common_autotest', true, true],
+        ['cpuflags_autotest', true, true],
+        ['debug_autotest', true, true],
+        ['devargs_autotest', true, true],
+        ['eal_flags_c_opt_autotest', false, false],
+        ['eal_flags_main_opt_autotest', false, false],
+        ['eal_flags_n_opt_autotest', false, false],
+        ['eal_flags_hpet_autotest', false, false],
+        ['eal_flags_no_huge_autotest', false, false],
+        ['eal_flags_a_opt_autotest', false, false],
+        ['eal_flags_b_opt_autotest', false, false],
+        ['eal_flags_vdev_opt_autotest', false, false],
+        ['eal_flags_r_opt_autotest', false, false],
+        ['eal_flags_mem_autotest', false, false],
+        ['eal_flags_file_prefix_autotest', false, false],
+        ['eal_flags_misc_autotest', false, false],
+        ['eal_fs_autotest', true, true],
+        ['errno_autotest', true, true],
+        ['ethdev_link_status', true, true],
+        ['event_ring_autotest', true, true],
+        ['fib_autotest', true, true],
+        ['fib6_autotest', true, true],
+        ['func_reentrancy_autotest', false, true],
+        ['hash_autotest', true, true],
+        ['interrupt_autotest', true, true],
+        ['ipfrag_autotest', false, true],
+        ['lcores_autotest', true, true],
+        ['logs_autotest', true, true],
+        ['lpm_autotest', true, true],
+        ['lpm6_autotest', true, true],
+        ['malloc_autotest', false, true],
+        ['mbuf_autotest', false, true],
+        ['mcslock_autotest', false, true],
+        ['memcpy_autotest', true, true],
+        ['memory_autotest', false, true],
+        ['mempool_autotest', false, true],
+        ['memzone_autotest', false, true],
+        ['meter_autotest', true, true],
+        ['multiprocess_autotest', false, false],
+        ['per_lcore_autotest', true, true],
+        ['pflock_autotest', true, true],
+        ['prefetch_autotest', true, true],
+        ['rcu_qsbr_autotest', true, true],
+        ['pie_autotest', true, true],
+        ['rib_autotest', true, true],
+        ['rib6_autotest', true, true],
+        ['ring_autotest', true, true],
+        ['rwlock_test1_autotest', true, true],
+        ['rwlock_rda_autotest', true, true],
+        ['rwlock_rds_wrm_autotest', true, true],
+        ['rwlock_rde_wro_autotest', true, true],
+        ['sched_autotest', true, true],
+        ['security_autotest', false, true],
+        ['spinlock_autotest', true, true],
+        ['stack_autotest', false, true],
+        ['stack_lf_autotest', false, true],
+        ['string_autotest', true, true],
+        ['tailq_autotest', true, true],
+        ['ticketlock_autotest', true, true],
+        ['timer_autotest', false, true],
+        ['user_delay_us', true, true],
+        ['version_autotest', true, true],
+        ['crc_autotest', true, true],
+        ['distributor_autotest', false, true],
+        ['eventdev_common_autotest', true, true],
+        ['fbarray_autotest', true, true],
+        ['hash_readwrite_func_autotest', false, true],
+        ['ipsec_autotest', true, true],
+        ['kni_autotest', false, true],
+        ['kvargs_autotest', true, true],
+        ['member_autotest', true, true],
+        ['power_cpufreq_autotest', false, true],
+        ['power_autotest', true, true],
+        ['power_kvm_vm_autotest', false, true],
+        ['reorder_autotest', true, true],
+        ['service_autotest', true, true],
+        ['thash_autotest', true, true],
+        ['trace_autotest', true, true],
 ]
 
 # Tests known to have issues or which don't belong in other tests lists.
@@ -345,15 +346,16 @@  endif
 
 if dpdk_conf.has('RTE_LIB_FLOW_CLASSIFY')
     test_sources += 'test_flow_classify.c'
-    fast_tests += [['flow_classify_autotest', false]]
+    fast_tests += [['flow_classify_autotest', false, true]]
 endif
 if dpdk_conf.has('RTE_LIB_METRICS')
     test_sources += ['test_metrics.c']
-    fast_tests += [['metrics_autotest', true]]
+    fast_tests += [['metrics_autotest', true, true]]
 endif
 if not is_windows and dpdk_conf.has('RTE_LIB_TELEMETRY')
     test_sources += ['test_telemetry_json.c', 'test_telemetry_data.c']
-    fast_tests += [['telemetry_json_autotest', true], ['telemetry_data_autotest', true]]
+    fast_tests += [['telemetry_json_autotest', true, true]]
+    fast_tests += [['telemetry_data_autotest', true, true]]
 endif
 if dpdk_conf.has('RTE_LIB_PIPELINE')
 # pipeline lib depends on port and table libs, so those must be present
@@ -366,7 +368,7 @@  if dpdk_conf.has('RTE_LIB_PIPELINE')
             'test_table_ports.c',
             'test_table_tables.c',
     ]
-    fast_tests += [['table_autotest', true]]
+    fast_tests += [['table_autotest', true, true]]
 endif
 
 # The following linkages of drivers are required because
@@ -386,26 +388,26 @@  if dpdk_conf.has('RTE_NET_RING')
     test_sources += 'test_pmd_ring.c'
     test_sources += 'test_event_eth_tx_adapter.c'
     test_sources += 'sample_packet_forward.c'
-    fast_tests += [['ring_pmd_autotest', true]]
+    fast_tests += [['ring_pmd_autotest', true, true]]
     perf_test_names += 'ring_pmd_perf_autotest'
-    fast_tests += [['event_eth_tx_adapter_autotest', false]]
+    fast_tests += [['event_eth_tx_adapter_autotest', false, true]]
     if dpdk_conf.has('RTE_LIB_BITRATESTATS')
         test_sources += 'test_bitratestats.c'
-        fast_tests += [['bitratestats_autotest', true]]
+        fast_tests += [['bitratestats_autotest', true, true]]
     endif
     if dpdk_conf.has('RTE_LIB_LATENCYSTATS')
         test_sources += 'test_latencystats.c'
-        fast_tests += [['latencystats_autotest', true]]
+        fast_tests += [['latencystats_autotest', true, true]]
     endif
     if dpdk_conf.has('RTE_LIB_PDUMP')
         test_sources += 'test_pdump.c'
-        fast_tests += [['pdump_autotest', true]]
+        fast_tests += [['pdump_autotest', true, false]]
     endif
 endif
 if dpdk_conf.has('RTE_NET_NULL')
     test_deps += 'net_null'
     test_sources += 'test_vdev.c'
-    fast_tests += [['vdev_autotest', true]]
+    fast_tests += [['vdev_autotest', true, true]]
 endif
 
 if dpdk_conf.has('RTE_HAS_LIBPCAP')
@@ -431,7 +433,7 @@  if dpdk_conf.has('RTE_LIB_COMPRESSDEV')
     if compress_test_dep.found()
         test_dep_objs += compress_test_dep
         test_sources += 'test_compressdev.c'
-        fast_tests += [['compressdev_autotest', false]]
+        fast_tests += [['compressdev_autotest', false, true]]
     endif
 endif
 
@@ -478,6 +480,12 @@  foreach arg : fast_tests
         endif
     endif
 
+    if get_option('b_sanitize') == 'address' or get_option('b_sanitize') == 'address,undefined'
+        if not arg[2]
+            run_test = false
+        endif
+    endif
+
     if (get_option('default_library') == 'shared' and
         arg[0] == 'event_eth_tx_adapter_autotest')
         foreach drv:dpdk_drivers