1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
19686: sys/string_utils: add memchk() r=maribu a=benpicco



19687: tests/unittests: remove old workaround for SAML1X and gcc9.X bug r=maribu a=dylad

### Contribution description
This reverts #13462, this workaround is no longer needed with newer GCC version.

### Testing procedure

Try to compile tests/unittests for `saml11-xpro` or `saml10-xpro`

### Issues/PRs references

This is a revert of #13462.


Co-authored-by: Benjamin Valentin <benjamin.valentin@ml-pa.com>
Co-authored-by: Dylan Laduranty <dylan.laduranty@mesotic.com>
This commit is contained in:
bors[bot] 2023-05-30 23:26:16 +00:00 committed by GitHub
commit 67c011f5a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 40 additions and 23 deletions

View File

@ -7,8 +7,7 @@
*/
/**
* @defgroup sys_string_utils Utility functions that are missing in
* `string.h`
* @defgroup sys_string_utils Utility functions that are missing in `string.h`
* @ingroup sys
*
* This header provides utility functions that the standard C libs `string.h`
@ -92,6 +91,18 @@ static inline void explicit_bzero(void *dest, size_t n_bytes)
*/
ssize_t strscpy(char *dest, const char *src, size_t count);
/**
* @brief Check if the entire buffer is filled with the same byte.
*
* @param[in] data The buffer to probe
* @param[in] c The byte to check of
* @param[in] len Size of the buffer
*
* @return NULL if the entire buffer is filled with @p c
* @return pointer to the first non-matching byte
*/
const void *memchk(const void *data, uint8_t c, size_t len);
#ifdef __cplusplus
}
#endif

View File

@ -37,4 +37,17 @@ ssize_t strscpy(char *dest, const char *src, size_t count)
return -E2BIG;
}
}
const void *memchk(const void *data, uint8_t c, size_t len)
{
const uint8_t *end = (uint8_t *)data + len;
for (const uint8_t *d = data; d != end; ++d) {
if (c != *d) {
return d;
}
}
return NULL;
}
/** @} */

View File

@ -30,6 +30,7 @@
#include "net/gnrc/pktbuf.h"
#include "net/gnrc/nettype.h"
#include "net/gnrc/pkt.h"
#include "string_utils.h"
#include "pktbuf_internal.h"
#include "pktbuf_static.h"
@ -61,18 +62,6 @@ static gnrc_pktsnip_t *_create_snip(gnrc_pktsnip_t *next, const void *data, size
gnrc_nettype_t type);
static void *_pktbuf_alloc(size_t size);
static const void *mem_is_set(const void *data, uint8_t c, size_t len)
{
const uint8_t *end = (uint8_t *)data + len;
for (const uint8_t *d = data; d != end; ++d) {
if (c != *d) {
return d;
}
}
return NULL;
}
static inline void _set_pktsnip(gnrc_pktsnip_t *pkt, gnrc_pktsnip_t *next,
void *data, size_t size, gnrc_nettype_t type)
{
@ -440,7 +429,7 @@ static void *_pktbuf_alloc(size_t size)
const void *mismatch;
if (CONFIG_GNRC_PKTBUF_CHECK_USE_AFTER_FREE &&
(mismatch = mem_is_set(ptr + 1, CANARY, size - sizeof(_unused_t)))) {
(mismatch = memchk(ptr + 1, CANARY, size - sizeof(_unused_t)))) {
printf("[%p] mismatch at offset %"PRIuPTR"/%u (ignoring %u initial bytes that were repurposed)\n",
(void *)ptr, (uintptr_t)mismatch - (uintptr_t)ptr, (unsigned)size, (unsigned)sizeof(_unused_t));
#ifdef MODULE_OD

View File

@ -26,11 +26,6 @@ static void test_atomic_flag(void)
TEST_ASSERT_EQUAL_INT(0, atomic_flag_test_and_set(&flag));
}
/* Prevent compiler optimization for SAML1X because of gcc internal bug */
#ifdef CPU_CORE_CORTEX_M23
#pragma GCC push_options
#pragma GCC optimize ("O0")
#endif
/* Test atomic_fetch_add */
static void test_atomic_inc_positive(void)
{
@ -72,9 +67,7 @@ static void test_atomic_inc_rollover(void)
TEST_ASSERT_EQUAL_INT(INT_MIN + 1, atomic_fetch_add(&res, 1));
TEST_ASSERT_EQUAL_INT(INT_MIN + 2, atomic_load(&res));
}
#ifdef CPU_SAML1X
#pragma GCC pop_options
#endif
/* Test atomic_fetch_sub */
static void test_atomic_dec_negative(void)
{

View File

@ -29,10 +29,21 @@ static void test_libc_strscpy(void)
TEST_ASSERT_EQUAL_INT(strscpy(buffer, "empty", 0), -E2BIG);
}
static void test_libc_memchk(void)
{
char buffer[32];
memset(buffer, 0xff, sizeof(buffer));
TEST_ASSERT_NULL(memchk(buffer, 0xff, sizeof(buffer)));
buffer[5] = 5;
TEST_ASSERT(memchk(buffer, 0xff, sizeof(buffer)) == &buffer[5]);
}
Test *tests_libc_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_libc_strscpy),
new_TestFixture(test_libc_memchk),
};
EMB_UNIT_TESTCALLER(libc_tests, NULL, NULL, fixtures);