xiaoxiang781216 opened a new pull request, #3712:
URL: https://github.com/apache/nuttx-apps/pull/3712

   ## Summary
   
   `apps/testing/libc/arch_libc` only exercised `strcpy()`, so the architecture
   optimized implementations of every other string and memory routine were never
   covered by the test suite.  This series turns it into a full correctness and
   speed harness for the whole string/memory family, which is the prerequisite 
for
   landing architecture optimized assembly with confidence.
   
   Four commits:
   
   1. **`Add tests for all string/memory functions.`**
      Adds a correctness test (sweeping buffer alignment and transfer size) and 
a
      speed test (average cycles via `perf_gettime()`) for `memcpy`, `memmove`,
      `memset`, `memcmp`, `memchr`, `strlen`, `strcmp`, `strchr`, `strncmp`,
      `strnlen`, `strncpy`, `stpcpy`, `strcat` and `strrchr`.  Each test is
      selected by its own `CONFIG_TESTING_ARCH_LIBC_<FUNC>` option (default y) 
so
      a target can drop the ones it does not need.
   
   2. **`Add strchrnul test and sweep size boundaries.`**
      Adds `strchrnul` coverage, and sweeps alignment 0..7 together with the
      boundary sizes {0, 1, 7, 8, 9, 15, 16, 17, 31, 32, 33, 63, 64, 65, 127, 
128,
      129, 255, 256, 257} in the scan function tests and in `memmove`.  Those
      sizes sit on the 8/16-byte chunk edges and on the sub-word tails, so
      vectorized (NEON/MVE) and word-at-a-time implementations are stressed
      exactly at their alignment and size boundaries.  `memmove` is additionally
      exercised across four overlap layouts: forward, backward, contained and
      adjacent.
   
   3. **`Fix out-of-bounds write in memmove test.`**
      The adjacent overlap layout introduced by (2) started at a fixed
      `g_buf1 + align + 64`, so the destination tail ran past `g_buf1` for the
      largest swept sizes (AddressSanitizer reported a global-buffer-overflow).
      Start the layout at `g_buf1 + align` instead.
   
   4. **`Cover unaligned src/dst copy paths.`**
      `strcpy`/`strncpy`/`stpcpy` applied the same offset to source and
      destination, so the two pointers always shared the same word congruence 
and
      the byte prologue plus shift-merge path of optimized copy routines was 
never
      reached.  Vary both offsets independently over 0..7.  Also drops the
      `ARCH_TOOLCHAIN_GNU` dependency from `TESTING_ARCH_LIBC`: the test only 
uses
      standard C string functions and `perf_gettime()`, with no GNU specific
      construct, so it builds with non-GNU toolchains such as TASKING as well.
   
   Commit 3 is a fix for commit 2 rather than a squash because the two commits
   have different authors; each commit still builds and runs standalone
   (see Testing).
   
   ## Impact
   
   * Test code only.  Nothing is built unless `CONFIG_TESTING_ARCH_LIBC`
     (default n) is selected, so no existing board configuration or defconfig
     changes, and no size impact on any shipped build.
   * New Kconfig options 
`TESTING_ARCH_LIBC_{MEMCHR,MEMCMP,MEMCPY,MEMMOVE,MEMSET,
     STRCHR,STRCMP,STRCPY,STRLEN,STRNCMP,STRNLEN,STRNCPY,STPCPY,STRCAT,STRRCHR,
     STRCHRNUL}`, all default y inside `TESTING_ARCH_LIBC`.
   * Dropping the `ARCH_TOOLCHAIN_GNU` dependency only widens the set of
     toolchains that may select the test; no existing configuration changes
     behaviour.
   * No user API/ABI, hardware, security or documentation impact.
   
   ## Testing
   
   Host: Ubuntu 24.04 x86_64, gcc 13.3.0
   Target: `sim:nsh` with `CONFIG_TESTING_ARCH_LIBC=y` (all 16 function options
   enabled) and `CONFIG_TESTING_ARCH_LIBC_VERBOSE=y`
   
   Every commit of the series was built and run standalone; no build warnings, 
and
   all enabled functions report `PASSED`:
   
   | commit | functions PASSED | result |
   | --- | --- | --- |
   | 1 `Add tests for all string/memory functions.` | 15 | `arch_libc_test 
Passed` |
   | 2 `Add strchrnul test and sweep size boundaries.` | 16 | `arch_libc_test 
Passed` |
   | 3 `Fix out-of-bounds write in memmove test.` | 16 | `arch_libc_test 
Passed` |
   | 4 `Cover unaligned src/dst copy paths.` | 16 | `arch_libc_test Passed` |
   
   A build with only `CONFIG_TESTING_ARCH_LIBC_STRCPY=y` (every other function
   test disabled) was also checked to make sure the reduced configurations stay
   warning free.
   
   **Before** (`apache/master`, only `strcpy` is covered):
   
   ```
   NuttShell (NSH) NuttX-10.4.0
   nsh> arch_libctest
   arch_libc_test_strcpy Test Passed
   strcpy total(run 25 times) cpu cycles 1749
   strcpy average cpu cycles 69
   nsh> exit
   ```
   
   **After** (this series):
   
   ```
   NuttShell (NSH) NuttX-10.4.0
   nsh> arch_libctest
   Testing memcpy...
   memcpy: PASSED
   memcpy(128) avg cycles: 96
   Testing memmove...
   memmove: PASSED
   memmove(128) avg cycles: 4
   Testing memset...
   memset: PASSED
   memset(128) avg cycles: 53
   Testing memcmp...
   memcmp: PASSED
   memcmp(128) avg cycles: 121
   Testing memchr...
   memchr: PASSED
   memchr(128) avg cycles: 12
   Testing strlen...
   strlen: PASSED
   strlen(128) avg cycles: 50
   Testing strcmp...
   strcmp: PASSED
   strcmp(128) avg cycles: 133
   Testing strcpy...
   strcpy: PASSED
   strcpy(128) avg cycles: 234
   Testing strchr...
   strchr: PASSED
   strchr(128) avg cycles: 54
   Testing strncmp...
   strncmp: PASSED
   strncmp(128) avg cycles: 469
   Testing strnlen...
   strnlen: PASSED
   strnlen(128) avg cycles: 281
   Testing strncpy...
   strncpy: PASSED
   strncpy(128) avg cycles: 142
   Testing stpcpy...
   stpcpy: PASSED
   stpcpy(128) avg cycles: 68
   Testing strcat...
   strcat: PASSED
   strcat(64) avg cycles: 37
   Testing strrchr...
   strrchr: PASSED
   strrchr(128) avg cycles: 65
   Testing strchrnul...
   strchrnul: PASSED
   strchrnul(128) avg cycles: 18
   arch_libc_test Passed
   nsh> exit
   ```
   
   `tools/checkpatch.sh -c -u -m -g apache/master..HEAD` reports
   `All checks pass.` for the series.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to