F´ Flight Software - C/C++ Documentation
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 <Fw/Types/format.hpp>
5 #include <cassert>
6 #include <cstdio>
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  // Write to stderr w/o formatting
18  (void) fputs(msg, stderr);
19  (void) fputs("\n", stderr);
20 }
21 
23  NATIVE_UINT_TYPE lineNo,
24  NATIVE_UINT_TYPE numArgs,
25  FwAssertArgType arg1,
26  FwAssertArgType arg2,
27  FwAssertArgType arg3,
28  FwAssertArgType arg4,
29  FwAssertArgType arg5,
30  FwAssertArgType arg6,
31  CHAR* destBuffer,
32  NATIVE_INT_TYPE buffSize) {
33  static_assert(std::numeric_limits<FwSizeType>::max() >= std::numeric_limits<NATIVE_INT_TYPE>::max(),
34  "NATIVE_INT_TYPE cannot fit into FwSizeType");
35  switch (numArgs) {
36  case 0:
37  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize), fileIdFs, file, lineNo);
38  break;
39  case 1:
40  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize),
41  fileIdFs " %" PRI_FwAssertArgType, file, lineNo, arg1);
42  break;
43  case 2:
44  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize),
45  fileIdFs " %" PRI_FwAssertArgType " %" PRI_FwAssertArgType, file, lineNo, arg1, arg2);
46  break;
47  case 3:
48  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize),
50  lineNo, arg1, arg2, arg3);
51  break;
52  case 4:
53  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize),
56  file, lineNo, arg1, arg2, arg3, arg4);
57  break;
58  case 5:
59  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize),
62  file, lineNo, arg1, arg2, arg3, arg4, arg5);
63  break;
64  case 6:
65  (void)stringFormat(destBuffer, static_cast<FwSizeType>(buffSize),
68  file, lineNo, arg1, arg2, arg3, arg4, arg5, arg6);
69  break;
70  default: // in an assert already, what can we do?
71  break;
72  }
73 }
74 
75 void AssertHook::printAssert(const CHAR* msg) {
76  defaultPrintAssert(msg);
77 }
78 
80  NATIVE_UINT_TYPE lineNo,
81  NATIVE_UINT_TYPE numArgs,
82  FwAssertArgType arg1,
83  FwAssertArgType arg2,
84  FwAssertArgType arg3,
85  FwAssertArgType arg4,
86  FwAssertArgType arg5,
87  FwAssertArgType arg6) {
88  CHAR destBuffer[FW_ASSERT_TEXT_SIZE];
89  defaultReportAssert(file, lineNo, numArgs, arg1, arg2, arg3, arg4, arg5, arg6, destBuffer, sizeof(destBuffer));
90  // print message
91  this->printAssert(destBuffer);
92 }
93 
95  assert(0);
96 }
97 
99 
101  this->previousHook = s_assertHook;
102  s_assertHook = this;
103 }
104 
106  s_assertHook = this->previousHook;
107 }
108 
109 // Default handler of SwAssert functions
111  NATIVE_UINT_TYPE lineNo,
112  NATIVE_UINT_TYPE numArgs,
113  FwAssertArgType arg1,
114  FwAssertArgType arg2,
115  FwAssertArgType arg3,
116  FwAssertArgType arg4,
117  FwAssertArgType arg5,
118  FwAssertArgType arg6) {
119  if (nullptr == s_assertHook) {
120  CHAR assertMsg[FW_ASSERT_TEXT_SIZE];
121  defaultReportAssert(file, lineNo, numArgs, arg1, arg2, arg3, arg4, arg5, arg6, assertMsg, sizeof(assertMsg));
122  defaultPrintAssert(assertMsg);
123  assert(0);
124  } else {
125  s_assertHook->reportAssert(file, lineNo, numArgs, arg1, arg2, arg3, arg4, arg5, arg6);
127  }
128  return 0;
129 }
130 
132  return defaultSwAssert(file, lineNo, 0, 0, 0, 0, 0, 0, 0);
133 }
134 
136  return defaultSwAssert(file, lineNo, 1, arg1, 0, 0, 0, 0, 0);
137 }
138 
140  return defaultSwAssert(file, lineNo, 2, arg1, arg2, 0, 0, 0, 0);
141 }
142 
144  FwAssertArgType arg1,
145  FwAssertArgType arg2,
146  FwAssertArgType arg3,
147  NATIVE_UINT_TYPE lineNo) {
148  return defaultSwAssert(file, lineNo, 3, arg1, arg2, arg3, 0, 0, 0);
149 }
150 
152  FwAssertArgType arg1,
153  FwAssertArgType arg2,
154  FwAssertArgType arg3,
155  FwAssertArgType arg4,
156  NATIVE_UINT_TYPE lineNo) {
157  return defaultSwAssert(file, lineNo, 4, arg1, arg2, arg3, arg4, 0, 0);
158 }
159 
161  FwAssertArgType arg1,
162  FwAssertArgType arg2,
163  FwAssertArgType arg3,
164  FwAssertArgType arg4,
165  FwAssertArgType arg5,
166  NATIVE_UINT_TYPE lineNo) {
167  return defaultSwAssert(file, lineNo, 5, arg1, arg2, arg3, arg4, arg5, 0);
168 }
169 
171  FwAssertArgType arg1,
172  FwAssertArgType arg2,
173  FwAssertArgType arg3,
174  FwAssertArgType arg4,
175  FwAssertArgType arg5,
176  FwAssertArgType arg6,
177  NATIVE_UINT_TYPE lineNo) {
178  return defaultSwAssert(file, lineNo, 6, arg1, arg2, arg3, arg4, arg5, arg6);
179 }
180 } // namespace Fw
181 
182 // define C asserts.
183 extern "C" {
185 }
186 
188  if (nullptr == Fw::s_assertHook) {
189  CHAR assertMsg[FW_ASSERT_TEXT_SIZE];
190  Fw::defaultReportAssert(file, lineNo, 0, 0, 0, 0, 0, 0, 0, assertMsg, sizeof(assertMsg));
191  } else {
192  Fw::s_assertHook->reportAssert(file, lineNo, 0, 0, 0, 0, 0, 0, 0);
194  }
195  return 0;
196 }
PlatformUIntType NATIVE_UINT_TYPE
Definition: BasicTypes.h:56
PlatformAssertArgType FwAssertArgType
Definition: FpConfig.h:39
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:110
PlatformIntType NATIVE_INT_TYPE
Definition: BasicTypes.h:55
char CHAR
Definition: BasicTypes.h:32
STATIC AssertHook * s_assertHook
Definition: Assert.cpp:98
#define FW_ASSERT_TEXT_SIZE
Size of string used to store assert description.
Definition: FpConfig.hpp:19
#define PRI_FwAssertArgType
Definition: FpConfig.h:40
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:79
#define FILE_NAME_ARG
Definition: Assert.hpp:16
NATIVE_INT_TYPE CAssert0(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo)
Definition: Assert.cpp:187
#define fileIdFs
Definition: Assert.cpp:9
void defaultPrintAssert(const CHAR *msg)
Definition: Assert.cpp:16
void deregisterHook()
Definition: Assert.cpp:105
virtual void doAssert()
Definition: Assert.cpp:94
C++-compatible configuration header for fprime configuration.
#define STATIC
static for non unit-test code
Definition: BasicTypes.h:75
void registerHook()
Definition: Assert.cpp:100
NATIVE_INT_TYPE SwAssert(FILE_NAME_ARG file, NATIVE_UINT_TYPE lineNo)
Assert with no arguments.
Definition: Assert.cpp:131
virtual void printAssert(const CHAR *msg)
Definition: Assert.cpp:75
FormatStatus stringFormat(char *destination, const FwSizeType maximumSize, const char *formatString,...)
format a c-string
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:22