Skip to content

[Bug] rt_strnlen/strnlen中的混用问题。进而klibc参数和返回值混用的问题 #10889

@BernardXiong

Description

@BernardXiong

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions