F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
Assert.cpp
Go to the documentation of this file.
1 #include <FpConfig.hpp>
2 #include <Fw/Types/Assert.hpp>
3 #include <cassert>
4 #include <cstdio>
5 
6 #define FW_ASSERT_DFL_MSG_LEN 256
7 
8 #if FW_ASSERT_LEVEL == FW_FILEID_ASSERT
9 #define fileIdFs "Assert: 0x%08" PRIx32 ":%" PRI_PlatformUIntType
10 #else
11 #define fileIdFs "Assert: \"%s:%" PRI_PlatformUIntType "\""
12 #endif
13 
14 namespace Fw {
15 
16 void defaultPrintAssert(const CHAR* msg) {
17  (void)fprintf(stderr, "%s\n", msg);
18 }
19 
21  NATIVE_UINT_TYPE lineNo,
22  NATIVE_UINT_TYPE numArgs,
23  FwAssertArgType arg1,
24  FwAssertArgType arg2,
25  FwAssertArgType arg3,
26  FwAssertArgType arg4,
27  FwAssertArgType arg5,
28  FwAssertArgType arg6,
29  CHAR* destBuffer,
30  NATIVE_INT_TYPE buffSize) {
31  switch (numArgs) {
32  case 0:
33  (void)snprintf(destBuffer, static_cast<size_t>(buffSize), fileIdFs, file, lineNo);
34  break;
35  case 1:
36  (void)snprintf(destBuffer, static_cast<size_t>(buffSize), fileIdFs " %" PRI_FwAssertArgType, file, lineNo, arg1);
37  break;
38  case 2:
39  (void)snprintf(destBuffer, static_cast<size_t>(buffSize), fileIdFs " %" PRI_FwAssertArgType " %" PRI_FwAssertArgType, file,
40  lineNo, arg1, arg2);
41  break;
42  case 3:
43  (void)snprintf(destBuffer, static_cast<size_t>(buffSize),
45  lineNo, arg1, arg2, arg3);
46  break;
47  case 4:
48  (void)snprintf(destBuffer, static_cast<size_t>(buffSize),
51  file, lineNo, arg1, arg2, arg3, arg4);
52  break;
53  case 5:
54  (void)snprintf(destBuffer, static_cast<size_t>(buffSize),
57  file, lineNo, arg1, arg2, arg3, arg4, arg5);
58  break;
59  case 6:
60  (void)snprintf(destBuffer, static_cast<size_t>(buffSize),
63  file, lineNo, arg1, arg2, arg3, arg4, arg5, arg6);
64  break;
65  default: // in an assert already, what can we do?
66  break;
67  }
68 
69  // null terminate
70  destBuffer[buffSize - 1] = 0;
71 }
72 
73 void AssertHook::printAssert(const CHAR* msg) {
74  defaultPrintAssert(msg);
75 }
76 
78  NATIVE_UINT_TYPE lineNo,
79  NATIVE_UINT_TYPE numArgs,
80  FwAssertArgType arg1,
81  FwAssertArgType arg2,
82  FwAssertArgType arg3,
83  FwAssertArgType arg4,
84  FwAssertArgType arg5,
85  FwAssertArgType arg6) {
86  CHAR destBuffer[FW_ASSERT_DFL_MSG_LEN];
87  defaultReportAssert(file, lineNo, numArgs, arg1, arg2, arg3, arg4, arg5, arg6, destBuffer, sizeof(destBuffer));
88  // print message
89  this->printAssert(destBuffer);
90 }
91 
93  assert(0);
94 }
95 
97 
99  this->previousHook = s_assertHook;
100  s_assertHook = this;
101 }
102 
104  s_assertHook = this->previousHook;
105 }
106 
107 // Default handler of SwAssert functions
109  NATIVE_UINT_TYPE lineNo,
110  NATIVE_UINT_TYPE numArgs,
111  FwAssertArgType arg1,
112  FwAssertArgType arg2,
113  FwAssertArgType arg3,
114  FwAssertArgType arg4,
115  FwAssertArgType arg5,
116  FwAssertArgType arg6) {
117  if (nullptr == s_assertHook) {
118  CHAR assertMsg[FW_ASSERT_DFL_MSG_LEN];
119  defaultReportAssert(file, lineNo, numArgs, arg1, arg2, arg3, arg4, arg5, arg6, assertMsg, sizeof(assertMsg));
120  defaultPrintAssert(assertMsg);
121  assert(0);
122  } else {
123  s_assertHook->reportAssert(file, lineNo, numArgs, arg1, arg2, arg3, arg4, arg5, arg6);
125  }
126  return 0;
127 }
128 
130  return defaultSwAssert(file, lineNo, 0, 0, 0, 0, 0, 0, 0);
131 }
132 
134  return defaultSwAssert(file, lineNo, 1, arg1, 0, 0, 0, 0, 0);
135 }
136 
138  return defaultSwAssert(file, lineNo, 2, arg1, arg2, 0, 0, 0, 0);
139 }
140 
142  FwAssertArgType arg1,
143  FwAssertArgType arg2,
144  FwAssertArgType arg3,
145  NATIVE_UINT_TYPE lineNo) {
146  return defaultSwAssert(file, lineNo, 3, arg1, arg2, arg3, 0, 0, 0);
147 }
148 
150  FwAssertArgType arg1,
151  FwAssertArgType arg2,
152  FwAssertArgType arg3,
153  FwAssertArgType arg4,
154  NATIVE_UINT_TYPE lineNo) {
155  return defaultSwAssert(file, lineNo, 4, arg1, arg2, arg3, arg4, 0, 0);
156 }
157 
159  FwAssertArgType arg1,
160  FwAssertArgType arg2,
161  FwAssertArgType arg3,
162  FwAssertArgType arg4,
163  FwAssertArgType arg5,
164  NATIVE_UINT_TYPE lineNo) {
165  return defaultSwAssert(file, lineNo, 5, arg1, arg2, arg3, arg4, arg5, 0);
166 }
167 
169  FwAssertArgType arg1,
170  FwAssertArgType arg2,
171  FwAssertArgType arg3,
172  FwAssertArgType arg4,
173  FwAssertArgType arg5,
174  FwAssertArgType arg6,
175  NATIVE_UINT_TYPE lineNo) {
176  return defaultSwAssert(file, lineNo, 6, arg1, arg2, arg3, arg4, arg5, arg6);
177 }
178 } // namespace Fw
179 
180 // define C asserts.
181 extern "C" {
183 }
184 
186  if (nullptr == Fw::s_assertHook) {
187  CHAR assertMsg[FW_ASSERT_DFL_MSG_LEN];
188  Fw::defaultReportAssert(file, lineNo, 0, 0, 0, 0, 0, 0, 0, assertMsg, sizeof(assertMsg));
189  } else {
190  Fw::s_assertHook->reportAssert(file, lineNo, 0, 0, 0, 0, 0, 0, 0);
192  }
193  return 0;
194 }
#define FW_ASSERT_DFL_MSG_LEN
Definition: Assert.cpp:6
#define fileIdFs
Definition: Assert.cpp:9
NATIVE_INT_TYPE CAssert0(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo)
Definition: Assert.cpp:185
#define FILE_NAME_ARG
Definition: Assert.hpp:16
#define STATIC
static for non unit-test code
Definition: BasicTypes.h:71
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:51
char CHAR
Definition: BasicTypes.h:28
PlatformUIntType NATIVE_UINT_TYPE
Definition: BasicTypes.h:52
PlatformAssertArgType FwAssertArgType
Definition: FpConfig.h:34
#define PRI_FwAssertArgType
Definition: FpConfig.h:35
C++-compatible configuration header for fprime configuration.
virtual void reportAssert(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo, NATIVE_UINT_TYPE numArgs, FwAssertArgType arg1, FwAssertArgType arg2, FwAssertArgType arg3, FwAssertArgType arg4, FwAssertArgType arg5, FwAssertArgType arg6)
destructor
Definition: Assert.cpp:77
void deregisterHook()
Definition: Assert.cpp:103
virtual void doAssert()
Definition: Assert.cpp:92
void registerHook()
Definition: Assert.cpp:98
virtual void printAssert(const CHAR *msg)
Definition: Assert.cpp:73
NATIVE_INT_TYPE SwAssert(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo)
Assert with no arguments.
Definition: Assert.cpp:129
void defaultPrintAssert(const CHAR *msg)
Definition: Assert.cpp:16
NATIVE_INT_TYPE defaultSwAssert(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo, NATIVE_UINT_TYPE numArgs, FwAssertArgType arg1, FwAssertArgType arg2, FwAssertArgType arg3, FwAssertArgType arg4, FwAssertArgType arg5, FwAssertArgType arg6)
Definition: Assert.cpp:108
STATIC AssertHook * s_assertHook
Definition: Assert.cpp:96
void defaultReportAssert(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo, NATIVE_UINT_TYPE numArgs, FwAssertArgType arg1, FwAssertArgType arg2, FwAssertArgType arg3, FwAssertArgType arg4, FwAssertArgType arg5, FwAssertArgType arg6, CHAR *destBuffer, NATIVE_INT_TYPE buffSize)
Definition: Assert.cpp:20