[PPL-devel] [GIT] ppl/ppl(master): Improved error message reporting for assertion failures.

Enea Zaffanella zaffanella at cs.unipr.it
Fri Apr 6 16:39:32 CEST 2012


Module: ppl/ppl
Branch: master
Commit: 488490ab24f427266b6c305a0c48ecc42ddcf4d4
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=488490ab24f427266b6c305a0c48ecc42ddcf4d4

Author: Enea Zaffanella <zaffanella at cs.unipr.it>
Date:   Fri Apr  6 16:38:44 2012 +0200

Improved error message reporting for assertion failures.

---

 src/assert.cc |    8 ++++++++
 src/assert.hh |   38 +++++++++++++++++++++++++-------------
 2 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/src/assert.cc b/src/assert.cc
index c9d756a..926539c 100644
--- a/src/assert.cc
+++ b/src/assert.cc
@@ -42,3 +42,11 @@ PPL::ppl_unreachable_msg(const char* msg,
   abort();
 }
 
+void
+PPL::ppl_assertion_failed(const char* assertion_text,
+                          const char* file, unsigned int line,
+                          const char* function) {
+  std::cerr << file << ":" << line << ": " << function
+            << ": Assertion `" << assertion_text << "' failed\n";
+  abort();
+}
diff --git a/src/assert.hh b/src/assert.hh
index 35c2ef1..3039b77 100644
--- a/src/assert.hh
+++ b/src/assert.hh
@@ -36,6 +36,11 @@ site: http://bugseng.com/products/ppl/ . */
 // The PPL_UNREACHABLE macro flags a program point as unreachable.
 #define PPL_UNREACHABLE PPL_UNREACHABLE_MSG("unreachable")
 
+// The PPL_ASSERTION_FAILED macro is used to output a message after
+// an assertion failure and then cause program termination.
+// (It is meant to be used only when assertions are turned on).
+#define PPL_ASSERTION_FAILED(msg__) Parma_Polyhedra_Library:: \
+  ppl_assertion_failed(msg__, __FILE__, __LINE__, __func__)
 
 // Helper macro PPL_ASSERT_IMPL_: do not use it directly.
 #if defined(NDEBUG)
@@ -43,7 +48,7 @@ site: http://bugseng.com/products/ppl/ . */
 #else
 #define PPL_STRING_(s) #s
 #define PPL_ASSERT_IMPL_(cond__) \
-  ((cond__) ? (void) 0 : PPL_UNREACHABLE_MSG(PPL_STRING_(cond__)))
+  ((cond__) ? (void) 0 : PPL_ASSERTION_FAILED(PPL_STRING_(cond__)))
 #endif
 
 
@@ -90,17 +95,18 @@ site: http://bugseng.com/products/ppl/ . */
 
 namespace Parma_Polyhedra_Library {
 
-#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
-//! Helper function causing program termination by calling \c abort.
-#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
-void ppl_unreachable()
 #if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
-  __attribute__((weak, noreturn));
+#define PPL_WEAK_NORETURN __attribute__((weak, noreturn))
 #else
-  __attribute__((noreturn));
+#define PPL_WEAK_NORETURN __attribute__((noreturn))
 #endif
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Helper function causing program termination by calling \c abort.
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_unreachable() PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \brief
   Helper function printing message on \c std::cerr and causing program
   termination by calling \c abort.
@@ -108,12 +114,18 @@ void ppl_unreachable()
 #endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
 void ppl_unreachable_msg(const char* msg,
                          const char* file, unsigned int line,
-                         const char* function)
-#if PPL_CXX_SUPPORTS_ATTRIBUTE_WEAK
-  __attribute__((weak, noreturn));
-#else
-  __attribute__((noreturn));
-#endif
+                         const char* function) PPL_WEAK_NORETURN;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+  Helper function printing an assertion failure message on \c std::cerr
+  and causing program termination by calling \c abort.
+*/
+#endif // defined(PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS)
+void ppl_assertion_failed(const char* assertion_text,
+                          const char* file, unsigned int line,
+                          const char* function) PPL_WEAK_NORETURN;
+
 
 #ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
 /*! \brief




More information about the PPL-devel mailing list