Selaa lähdekoodia

LibC: Allow multiple includes of `<assert.h>`

ISO C requires in section 7.2:
The assert macro is redefined according to the current state of NDEBUG
each time that <assert.h> is included.

Also add tests for `assert` multiple inclusion accordingly.
Michel Hermier 3 vuotta sitten
vanhempi
commit
682f89d5bc
3 muutettua tiedostoa jossa 36 lisäystä ja 7 poistoa
  1. 1 0
      Meta/check-style.py
  2. 23 0
      Tests/LibC/TestAssert.cpp
  3. 12 7
      Userland/Libraries/LibC/assert.h

+ 1 - 0
Meta/check-style.py

@@ -31,6 +31,7 @@ LICENSE_HEADER_CHECK_EXCLUDES = {
 # We check that "#pragma once" is present
 PRAGMA_ONCE_STRING = '#pragma once'
 PRAGMA_ONCE_CHECK_EXCLUDES = {
+    'Userland/Libraries/LibC/assert.h',
 }
 
 # We make sure that there's a blank line before and after pragma once

+ 23 - 0
Tests/LibC/TestAssert.cpp

@@ -6,6 +6,7 @@
 
 #include <LibTest/TestCase.h>
 
+#undef NDEBUG
 #include <assert.h>
 #include <signal.h>
 
@@ -20,3 +21,25 @@ TEST_CASE(assert)
         return Test::Crash::Failure::DidNotCrash;
     });
 }
+
+#define NDEBUG
+#include <assert.h>
+
+TEST_CASE(assert_reinclude)
+{
+    EXPECT_NO_CRASH("This should not assert", [] {
+        assert(!"This should not assert");
+        return Test::Crash::Failure::DidNotCrash;
+    });
+}
+
+#undef NDEBUG
+#include <assert.h>
+
+TEST_CASE(assert_rereinclude)
+{
+    EXPECT_CRASH("This should assert", [] {
+        assert(!"This should assert");
+        return Test::Crash::Failure::DidNotCrash;
+    });
+}

+ 12 - 7
Userland/Libraries/LibC/assert.h

@@ -4,16 +4,25 @@
  * SPDX-License-Identifier: BSD-2-Clause
  */
 
-#pragma once
+#ifndef _ASSERT_H
+#    define _ASSERT_H
+
+#    define __stringify_helper(x) #    x
+#    define __stringify(x) __stringify_helper(x)
+
+#    ifndef __cplusplus
+#        define static_assert _Static_assert
+#    endif
+#endif
 
 #include <sys/cdefs.h>
 
+#undef assert
+
 __BEGIN_DECLS
 
 #ifndef NDEBUG
 __attribute__((noreturn)) void __assertion_failed(const char* msg);
-#    define __stringify_helper(x) #    x
-#    define __stringify(x) __stringify_helper(x)
 #    define assert(expr)                                                            \
         (__builtin_expect(!(expr), 0)                                               \
                 ? __assertion_failed(#expr "\n" __FILE__ ":" __stringify(__LINE__)) \
@@ -23,8 +32,4 @@ __attribute__((noreturn)) void __assertion_failed(const char* msg);
 #    define assert(expr) ((void)(0))
 #endif
 
-#ifndef __cplusplus
-#    define static_assert _Static_assert
-#endif
-
 __END_DECLS