forked from Imagelibrary/rtems
score: Add and use rtems_assert_context
This commit is contained in:
@@ -34,6 +34,13 @@ void __assert_func(
|
||||
const char *failedexpr
|
||||
)
|
||||
{
|
||||
rtems_assert_context assert_context = {
|
||||
.file = file,
|
||||
.line = line,
|
||||
.function = func,
|
||||
.failed_expression = failedexpr
|
||||
};
|
||||
|
||||
printk("assertion \"%s\" failed: file \"%s\", line %d%s%s\n",
|
||||
failedexpr,
|
||||
file,
|
||||
@@ -41,7 +48,7 @@ void __assert_func(
|
||||
(func) ? ", function: " : "",
|
||||
(func) ? func : ""
|
||||
);
|
||||
rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) func );
|
||||
rtems_fatal( RTEMS_FATAL_SOURCE_ASSERT, (rtems_fatal_code) &assert_context );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -33,6 +33,16 @@ extern "C" {
|
||||
*/
|
||||
/**@{**/
|
||||
|
||||
/**
|
||||
* @brief Assert context.
|
||||
*/
|
||||
typedef struct {
|
||||
const char *file;
|
||||
int line;
|
||||
const char *function;
|
||||
const char *failed_expression;
|
||||
} rtems_assert_context;
|
||||
|
||||
/**
|
||||
* @brief Exception frame.
|
||||
*/
|
||||
|
||||
@@ -88,7 +88,9 @@ typedef enum {
|
||||
/**
|
||||
* @brief Fatal source of assert().
|
||||
*
|
||||
* The fatal code is the pointer value of the function string.
|
||||
* The fatal code is the pointer value of the assert context.
|
||||
*
|
||||
* @see rtems_assert_context.
|
||||
*/
|
||||
RTEMS_FATAL_SOURCE_ASSERT,
|
||||
|
||||
|
||||
@@ -9,18 +9,33 @@
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
static const char func [] = "Init";
|
||||
#include <string.h>
|
||||
|
||||
#define FATAL_ERROR_TEST_NAME "10"
|
||||
#define FATAL_ERROR_DESCRIPTION "asserting with non-NULL strings..."
|
||||
#define FATAL_ERROR_EXPECTED_SOURCE RTEMS_FATAL_SOURCE_ASSERT
|
||||
#define FATAL_ERROR_EXPECTED_IS_INTERNAL FALSE
|
||||
#define FATAL_ERROR_EXPECTED_ERROR ((rtems_fatal_code) func)
|
||||
#define FATAL_ERROR_EXPECTED_ERROR_CHECK spfatal10_is_expected_error
|
||||
|
||||
#define ASSERT_FILE "testcase.h"
|
||||
#define ASSERT_LINE 38
|
||||
#define ASSERT_FUNC "Init"
|
||||
#define ASSERT_FEXP "forced"
|
||||
|
||||
static inline bool spfatal10_is_expected_error( rtems_fatal_code error )
|
||||
{
|
||||
const rtems_assert_context *assert_context =
|
||||
(const rtems_assert_context *) error;
|
||||
|
||||
return strcmp( assert_context->file, ASSERT_FILE ) == 0
|
||||
&& assert_context->line == ASSERT_LINE
|
||||
&& strcmp( assert_context->function, ASSERT_FUNC ) == 0
|
||||
&& strcmp( assert_context->failed_expression, ASSERT_FEXP ) == 0;
|
||||
}
|
||||
|
||||
void force_error()
|
||||
{
|
||||
__assert_func( __FILE__, __LINE__, func, "forced" );
|
||||
__assert_func( ASSERT_FILE, ASSERT_LINE, ASSERT_FUNC, ASSERT_FEXP );
|
||||
|
||||
/* we will not run this far */
|
||||
}
|
||||
|
||||
@@ -80,6 +80,15 @@ void Put_Source( rtems_fatal_source source )
|
||||
printk( "%s", rtems_fatal_source_description( source ) );
|
||||
}
|
||||
|
||||
static bool is_expected_error( rtems_fatal_code error )
|
||||
{
|
||||
#ifdef FATAL_ERROR_EXPECTED_ERROR
|
||||
return error == FATAL_ERROR_EXPECTED_ERROR;
|
||||
#else /* FATAL_ERROR_EXPECTED_ERROR */
|
||||
return FATAL_ERROR_EXPECTED_ERROR_CHECK( error );
|
||||
#endif /* FATAL_ERROR_EXPECTED_ERROR */
|
||||
}
|
||||
|
||||
void Fatal_extension(
|
||||
rtems_fatal_source source,
|
||||
bool is_internal,
|
||||
@@ -109,6 +118,7 @@ void Fatal_extension(
|
||||
);
|
||||
}
|
||||
|
||||
#ifdef FATAL_ERROR_EXPECTED_ERROR
|
||||
if ( error != FATAL_ERROR_EXPECTED_ERROR ) {
|
||||
printk( "ERROR==> Fatal Error Expected (");
|
||||
Put_Error( source, FATAL_ERROR_EXPECTED_ERROR );
|
||||
@@ -116,11 +126,12 @@ void Fatal_extension(
|
||||
Put_Error( source, error );
|
||||
printk( ")\n" );
|
||||
}
|
||||
#endif /* FATAL_ERROR_EXPECTED_ERROR */
|
||||
|
||||
if (
|
||||
source == FATAL_ERROR_EXPECTED_SOURCE
|
||||
&& is_internal == FATAL_ERROR_EXPECTED_IS_INTERNAL
|
||||
&& error == FATAL_ERROR_EXPECTED_ERROR
|
||||
&& is_expected_error( error )
|
||||
) {
|
||||
printk( "*** END OF TEST FATAL " FATAL_ERROR_TEST_NAME " ***\n" );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user