Macros | Functions | Variables
Safety Checks

Safety checks are a set of macros to check for parameters or values that should never happen, it is similar in concept to assert(), but will log and return instead of abort() your program. More...

Macros

#define EINA_SAFETY_ERROR(msg)   _eina_safety_error(__FILE__, __FUNCTION__, __LINE__, msg)
 
#define EINA_SAFETY_ON_NULL_RETURN(exp)
 
#define EINA_SAFETY_ON_NULL_RETURN_VAL(exp, val)
 
#define EINA_SAFETY_ON_NULL_GOTO(exp, label)
 
#define EINA_SAFETY_ON_TRUE_RETURN(exp)
 
#define EINA_SAFETY_ON_TRUE_RETURN_VAL(exp, val)
 
#define EINA_SAFETY_ON_TRUE_GOTO(exp, label)
 
#define EINA_SAFETY_ON_FALSE_RETURN(exp)
 
#define EINA_SAFETY_ON_FALSE_RETURN_VAL(exp, val)
 
#define EINA_SAFETY_ON_FALSE_GOTO(exp, label)
 
#define EINA_ARG_NONNULL(...)
 

Functions

void _eina_safety_error (const char *file, const char *func, int line, const char *str)
 Log entry-point called every time an eina safety check fails. More...
 

Variables

Eina_Error EINA_ERROR_SAFETY_FAILED
 

Detailed Description

Safety checks are a set of macros to check for parameters or values that should never happen, it is similar in concept to assert(), but will log and return instead of abort() your program.

Warning
eina_safety_checks.h should only be included by source files, after all other includes and before the source file specific includes. By source file specific includes we mean those that define the functions that are being checked. The reason for such complexity is the trick to avoid compiler optimizations. If compilers are told that some given function will never receive NULL (EINA_ARG_NONNULL(), then compiler will emit a warning if it detects so (good!) but will remove any checks for that condition as it believes it will never happen, removing all safety checks! By including eina_safety_checks.h it will redefine EINA_ARG_NONNULL() to void and compiler warning will not be emitted, but checks will be there. The files already processed with the old macro EINA_ARG_NONNULL() will still work and emit the warnings.
// all these files will emit warning from EINA_ARG_NONNULL()
#include <Evas.h> // third party headers
#include <Ecore.h>
#include <eina_safety_checks.h>
// all the files below will NOT emit warning from EINA_ARG_NONNULL(),
// but this is required to have the functions defined there to be checked
// for NULL pointers
#include "my_functions1.h"
#include "my_functions2.h"

Since these cases should never happen, one may want to keep safety checks enabled during tests but disable then during deploy, not doing any checks at all. This is a common requirement for embedded systems. When to check or not should be set during compile time by using –disable-safety-checks or –enable-safety-checks options to configure script.

Whenever these macros capture an error, EINA_LOG_ERR() will be called.

See also
EINA_SAFETY_ON_NULL_RETURN(), EINA_SAFETY_ON_NULL_RETURN_VAL() and other macros.

Macro Definition Documentation

◆ EINA_SAFETY_ON_NULL_RETURN

#define EINA_SAFETY_ON_NULL_RETURN (   exp)
Value:
do \
{ \
if (EINA_UNLIKELY((exp) == NULL)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " == NULL"); \
return; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_NULL_RETURN_VAL

#define EINA_SAFETY_ON_NULL_RETURN_VAL (   exp,
  val 
)
Value:
do \
{ \
if (EINA_UNLIKELY((exp) == NULL)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " == NULL"); \
return (val); \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_NULL_GOTO

#define EINA_SAFETY_ON_NULL_GOTO (   exp,
  label 
)
Value:
do \
{ \
if (EINA_UNLIKELY((exp) == NULL)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " == NULL"); \
goto label; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_TRUE_RETURN

#define EINA_SAFETY_ON_TRUE_RETURN (   exp)
Value:
do \
{ \
if (EINA_UNLIKELY(exp)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " is true"); \
return; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_TRUE_RETURN_VAL

#define EINA_SAFETY_ON_TRUE_RETURN_VAL (   exp,
  val 
)
Value:
do \
{ \
if (EINA_UNLIKELY(exp)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " is true"); \
return val; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_TRUE_GOTO

#define EINA_SAFETY_ON_TRUE_GOTO (   exp,
  label 
)
Value:
do \
{ \
if (EINA_UNLIKELY(exp)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " is true"); \
goto label; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_FALSE_RETURN

#define EINA_SAFETY_ON_FALSE_RETURN (   exp)
Value:
do \
{ \
if (EINA_UNLIKELY(!(exp))) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " is false"); \
return; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_FALSE_RETURN_VAL

#define EINA_SAFETY_ON_FALSE_RETURN_VAL (   exp,
  val 
)
Value:
do \
{ \
if (EINA_UNLIKELY(!(exp))) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " is false"); \
return val; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

◆ EINA_SAFETY_ON_FALSE_GOTO

#define EINA_SAFETY_ON_FALSE_GOTO (   exp,
  label 
)
Value:
do \
{ \
if (EINA_UNLIKELY(!(exp))) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # exp " is false"); \
goto label; \
} \
} \
while (0)
#define EINA_UNLIKELY(exp)
Definition: eina_types.h:398

Function Documentation

◆ _eina_safety_error()

void _eina_safety_error ( const char *  file,
const char *  func,
int  line,
const char *  str 
)

Log entry-point called every time an eina safety check fails.

One purpose of this dedicated function is to provide a convenient breakpoint for GDB debugging. Also, this gives it a dedicated log domain, rather than using the default one.

Since
1.17

References eina_error_set().