]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-133256: Add _Py_NONSTRING macro (#133257) (#135135)
authorVictor Stinner <vstinner@python.org>
Wed, 4 Jun 2025 15:10:35 +0000 (17:10 +0200)
committerGitHub <noreply@github.com>
Wed, 4 Jun 2025 15:10:35 +0000 (17:10 +0200)
gh-133256: Add _Py_NONSTRING macro (#133257)

Fix GCC 15 compiler warnings such as:

    In file included from Python/pylifecycle.c:26:
    Include/internal/pycore_runtime.h:47:26: warning:
    initializer-string for array of 'char' truncates NUL terminator
    but destination lacks 'nonstring' attribute (9 chars into 8
    available) [-Wunterminated-string-initialization]
       47 | #define _Py_Debug_Cookie "xdebugpy"
          |                          ^~~~~~~~~~

(cherry picked from commit e26bafd107aa86a4bdd6051848640f36a56d0efb)

Include/internal/pycore_runtime.h
Include/pyport.h

index d4291b87261ae0e68c6f8cf6707ea435caf57f6d..ed028944d18e046317cfa3a62239c9e2e4c32c59 100644 (file)
@@ -60,7 +60,7 @@ typedef struct _Py_AuditHookEntry {
 } _Py_AuditHookEntry;
 
 typedef struct _Py_DebugOffsets {
-    char cookie[8];
+    char cookie[8] _Py_NONSTRING;
     uint64_t version;
     uint64_t free_threaded;
     // Runtime state offset;
index 2ba81a4be42822655aaae94d675eae59a80d150f..72a157e679d92ff5c70db7b98fe0456cf59ec4ce 100644 (file)
@@ -541,6 +541,14 @@ extern "C" {
 #  define _Py__has_builtin(x) 0
 #endif
 
+// Preprocessor check for a compiler __attribute__. Always return 0
+// if __has_attribute() macro is not defined.
+#ifdef __has_attribute
+#  define _Py__has_attribute(x) __has_attribute(x)
+#else
+#  define _Py__has_attribute(x) 0
+#endif
+
 // _Py_TYPEOF(expr) gets the type of an expression.
 //
 // Example: _Py_TYPEOF(x) x_copy = (x);
@@ -606,4 +614,20 @@ extern "C" {
 #  define _SGI_MP_SOURCE
 #endif
 
+
+// _Py_NONSTRING: The nonstring variable attribute specifies that an object or
+// member declaration with type array of char, signed char, or unsigned char,
+// or pointer to such a type is intended to store character arrays that do not
+// necessarily contain a terminating NUL.
+//
+// Usage:
+//
+//   char name [8] _Py_NONSTRING;
+#if _Py__has_attribute(nonstring)
+#  define _Py_NONSTRING __attribute__((nonstring))
+#else
+#  define _Py_NONSTRING
+#endif
+
+
 #endif /* Py_PYPORT_H */