[libcxx-commits] [libcxx] [libc++][hardening] Introduce a dylib function to log hardening errors. (PR #148266)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jul 14 10:00:53 PDT 2025


================
@@ -0,0 +1,50 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___LOG_ERROR
+#define _LIBCPP___LOG_ERROR
+
+#include <__config>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+enum class _LogErrorReason {
+  // Where possible, it logs in a way that indicates a fatal error (which might include capturing the stack trace).
+  _HardeningFailure
+};
+
+// This function should never be called directly from the code -- it should only be called through the
+// `_LIBCPP_LOG_ERROR` macro.
+_LIBCPP_AVAILABILITY_LOG_ERROR _LIBCPP_EXPORTED_FROM_ABI void
+__log_error(_LogErrorReason __reason, const char* __message) _NOEXCEPT;
----------------
ldionne wrote:

Also, I think it is quite useful to assume that the message we're logging is null terminated, since we then call APIs that also make that assumption in the implementation of the logging function.

If we take a (possibly non-null-terminated) `char const*` and a length instead, we'd have to basically copy that string into a null terminated buffer (allocated on the fly?) before we can pass it to e.g. `fputs`. That seems like a lot of additional work/complexity for relatively little actual benefit. WDYT?

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


More information about the libcxx-commits mailing list