Files
rtems/cpukit/include/rtems/score/assert.h
Ryan Long cc273ec10f Add macros to assert status and use it
These macros are to be used to check the status from calls that are flagged
by Coverity as 'Unchecked return value'.

Fix file assert.h
2021-02-12 17:13:10 -06:00

148 lines
3.6 KiB
C

/**
* @file
*
* @ingroup RTEMSScoreAssert
*
* @brief This header file provides the interfaces of the
* @ref RTEMSScoreAssert.
*/
/*
* Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#ifndef _RTEMS_SCORE_ASSERT_H
#define _RTEMS_SCORE_ASSERT_H
#include <rtems/score/basedefs.h>
/**
* @defgroup RTEMSScoreAssert Assert Handler
*
* @ingroup RTEMSScore
*
* @brief This group contains the Assert Handler implementation.
*
* @{
*/
#if defined( RTEMS_DEBUG )
#include <assert.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* @brief Assertion similar to assert() controlled via RTEMS_DEBUG instead of
* NDEBUG and static analysis runs.
*/
#if defined( RTEMS_DEBUG ) || defined( RTEMS_STATIC_ANALYSIS )
/**
* @brief Macro with method name used in assert output
*
* Given the variations in compilers and standards, we have to poke a bit.
*
* @note This is based on the code in newlib's assert.h.
*/
#ifndef __RTEMS_ASSERT_FUNCTION
/* Use g++'s demangled names in C++. */
#if defined __cplusplus && defined __GNUC__
#define __RTEMS_ASSERT_FUNCTION __PRETTY_FUNCTION__
/* C99 requires the use of __func__. */
#elif __STDC_VERSION__ >= 199901L
#define __RTEMS_ASSERT_FUNCTION __func__
/* Older versions of gcc don't have __func__ but can use __FUNCTION__. */
#elif __GNUC__ >= 2
#define __RTEMS_ASSERT_FUNCTION __FUNCTION__
/* failed to detect __func__ support. */
#else
#define __RTEMS_ASSERT_FUNCTION ((char *) 0)
#endif
#endif /* !__RTEMS_ASSERT_FUNCTION */
#if !defined( RTEMS_SCHEDSIM )
/* normal build is newlib. */
#define _Assert( _e ) \
( ( _e ) ? \
( void ) 0 : \
__assert_func( __FILE__, __LINE__, __RTEMS_ASSERT_FUNCTION, #_e ) )
#elif defined(__linux__)
/* Scheduler simulator has only beed tested on glibc. */
#define _Assert( _e ) \
( ( _e ) ? \
( void ) 0 : \
__assert_fail( #_e, __FILE__, __LINE__, __RTEMS_ASSERT_FUNCTION ) )
#else
#error "Implement RTEMS assert support for this C Library"
#endif
#else
#define _Assert( _e ) ( ( void ) 0 )
#endif
/**
* @brief Assert if unused return value is equal.
*
* Assert whether @a _var and @a _val are equal and ensure @a _var is
* marked as used when not building for debug.
*
* @param _var The return value to be checked.
* @param _val Indicates what @a _var is supposed to be.
*/
#define _Assert_Unused_variable_equals(_var,_val) \
do { \
_Assert((_var) == (_val)); \
(void) (_var); \
} while (0)
/**
* @brief Assert if unused return value is not equal.
*
* Assert whether @a _var and @a _val are not equal and ensure @a _var
* is marked as used when not building for debug.
*
* @param _var The return value to be checked.
* @param _val Indicates what @a _var is not supposed to be.
*/
#define _Assert_Unused_variable_unequal(_var,_val) \
do { \
_Assert((_var) != (_val)); \
(void) (_var); \
} while (0)
/**
* @brief Returns true if thread dispatching is allowed.
*
* Thread dispatching can be repressed via _Thread_Disable_dispatch() or
* _ISR_Local_disable().
*/
#if defined( RTEMS_DEBUG )
bool _Debug_Is_thread_dispatching_allowed( void );
#endif
#ifdef __cplusplus
}
#endif /* __cplusplus */
/** @} */
#endif /* _RTEMS_SCORE_ASSERT_H */