[libc-commits] [libc] [libc] Add `ctime_s` (PR #110676)

Nick Desaulniers via libc-commits libc-commits at lists.llvm.org
Thu Nov 14 11:28:03 PST 2024


================
@@ -0,0 +1,49 @@
+//===-- Implementation of ctime_s function --------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ctime_s.h"
+#include "hdr/errno_macros.h"
+#include "src/__support/CPP/limits.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/config.h"
+#include "time_utils.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+using LIBC_NAMESPACE::time_utils::TimeConstants;
+
+LLVM_LIBC_FUNCTION(int, ctime_s,
+                   (char *buffer, rsize_t buffer_size, const time_t *t_ptr)) {
+  // TODO (https://github.com/llvm/llvm-project/issues/115907): invoke
+  // constraint handler
+  if (buffer == nullptr || t_ptr == nullptr)
+    return EINVAL;
+
+  if (*t_ptr > cpp::numeric_limits<int32_t>::max()) {
+    if (buffer_size != 0 && buffer_size <= RSIZE_MAX)
----------------
nickdesaulniers wrote:

K.3.8.3.3.3:
> If there is a runtime-constraint violation, s[0] is set to a null character if s is not a null pointer and maxsize is not equal zero and is not greater than RSIZE_MAX

But what's funny to me is that the sentence before (K.3.8.3.3.2) literally says maxsize shall not be less than 26.  So if we first check that maxsize is not less than 26, then it would implicitly mean maxsize is not zero.

So if you implement my above check, I think we can elide this `buffer_size != 0` check here.

https://github.com/llvm/llvm-project/pull/110676


More information about the libc-commits mailing list