-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Closed
Description
RT-Thread Version
master
Hardware Type/Architectures
qemu/aarch64
Develop Toolchain
GCC
Describe the bug
在qemu aarch64中使用mlibc后出现rt_strnlen/strnlen混用的问题:
In file included from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/drivers/ofw/libfdt/libfdt.h:9,
from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/drivers/include/drivers/ofw.h:19,
from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/drivers/include/drivers/ofw_io.h:15,
from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/drivers/core/platform_ofw.c:17:
/home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/drivers/ofw/libfdt/libfdt_env.h:27:17: error: conflicting types for 'rt_strnlen'; have 'size_t(const char *, size_t)' {aka 'long unsigned int(const char *, long unsigned int)'}
27 | #define strnlen rt_strnlen
| ^~~~~~~~~~
/home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/libc/compilers/common/include/posix/string.h:31:8: note: in expansion of macro 'strnlen'
31 | size_t strnlen(const char *s, size_t maxlen);
| ^~~~~~~
In file included from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/include/rtklibc.h:17,
from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/include/rtthread.h:36,
from /home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/components/drivers/core/platform_ofw.c:11:
/home/runner/work/rtthread-qemu/rtthread-qemu/rt-thread/include/klibc/kstring.h:26:11: note: previous declaration of 'rt_strnlen' with type 'rt_size_t(const char *, rt_ubase_t)' {aka 'long unsigned int(const char *, long long unsigned int)'}
26 | rt_size_t rt_strnlen(const char *s, rt_ubase_t maxlen);
| ^~~~~~~~~~
CC build/kernel/components/drivers/core/power_domain.o
scons: *** [build/kernel/components/drivers/core/platform_ofw.o] Error 1
原因应该是 rt_strnlen 并不是完全标准的strnlen声明方式(参数和返回值),需要rt_strnlen以完全的strnlen方式进行实现:
size_t strnlen(const char *s, size_t maxlen);
同样的,
rt_int32_t rt_memcmp(const void *cs, const void *ct, rt_size_t count);
rt_int32_t rt_strcasecmp(const char *a, const char *b);
rt_int32_t rt_strncmp(const char *cs, const char *ct, rt_size_t count);
rt_int32_t rt_strcmp(const char *cs, const char *ct);中的rt_int32_t,也不应该采用这样的方式,而是int。
而 rt_memset 应该是 void *rt_memset(void *, int, size_t); 方式。
可以考虑 klibc 这部分的实现,各API保留 rt_ 前缀,但参数和返回值和标准的libc都一致的模式。
Other additional context
No response
Copilot
Metadata
Metadata
Assignees
Labels
No labels