summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParthiban Nallathambi <[email protected]>2026-11-06 14:51:41 +0530
committerRbb666 <[email protected]>2026-11-08 14:01:29 +0800
commit0b682003ff79d9b74e213fb0d442d29576b7e994 (patch)
tree77f6b1d85e196003ac31bbf4a970365e3ab81a4b
parentc63d7bc9f499932ae42476aa61326482eb7f3709 (diff)
[libc][common] Match the picolibc asctime_r and ctime_r prototypes
picolibc declares the buffer as char[restrict static 26], so the pointer form warns with -Warray-parameter and the NULL check with -Wnonnull-compare. Other C libraries keep the pointer form. Signed-off-by: Parthiban Nallathambi <[email protected]>
-rw-r--r--components/libc/compilers/common/ctime.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/components/libc/compilers/common/ctime.c b/components/libc/compilers/common/ctime.c
index 77ef7fab34..6ea8aade53 100644
--- a/components/libc/compilers/common/ctime.c
+++ b/components/libc/compilers/common/ctime.c
@@ -26,6 +26,7 @@
* 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable
* 2023-10-23 Shell add lock for _g_timerid
* 2023-11-16 Shell Fixup of nanosleep if previous call was interrupted
+ * 2026-11-06 Parthiban match the picolibc asctime_r/ctime_r prototypes
*/
#include "sys/time.h"
@@ -59,6 +60,15 @@
#define _WARNING_NO_RTC "Cannot find a RTC device!"
+/* picolibc declares the buffer as char[restrict static __ASCTIME_SIZE], so it is non-null */
+#if defined(__PICOLIBC__) && defined(__ASCTIME_SIZE)
+#define _ASCTIME_BUF(b) b[__restrict_arr __min_size(__ASCTIME_SIZE)]
+#define _ASCTIME_BUF_NULL(b) 0
+#else
+#define _ASCTIME_BUF(b) *b
+#define _ASCTIME_BUF_NULL(b) ((b) == RT_NULL)
+#endif
+
#if defined(RT_USING_SMART) && defined(RT_USING_VDSO)
#include <vdso_kernel.h>
#endif
@@ -255,9 +265,9 @@ time_t mktime(struct tm * const t)
}
RTM_EXPORT(mktime);
-char* asctime_r(const struct tm *t, char *buf)
+char *asctime_r(const struct tm *t, char _ASCTIME_BUF(buf))
{
- if(t == RT_NULL || buf == RT_NULL)
+ if (t == RT_NULL || _ASCTIME_BUF_NULL(buf))
{
rt_set_errno(EFAULT);
return RT_NULL;
@@ -316,7 +326,7 @@ char *asctime(const struct tm *timeptr)
}
RTM_EXPORT(asctime);
-char *ctime_r(const time_t * tim_p, char * result)
+char *ctime_r(const time_t *tim_p, char _ASCTIME_BUF(result))
{
struct tm tm;
return asctime_r(localtime_r(tim_p, &tm), result);