我是嵌入式软件单元测试的新手,一直在安全性和效率(无论是空间还是时间)之间进行权衡。
这里有 3 个例子来强调这一点:
参数检查
Status_t sendMsg(Msg_t* msg)
{
if (NULL == msg)
{
return FAIL;
}
.
.
许多嵌入式代码放弃参数检查(如上)并假设参数有效。
空函数
#ifdef DEBUG
#define ASSERT(x) if ((x) == 0) { HALT(); }
#else
#define ASSERT(x) if ((x) == 0) { }
#endif
void initBus(Context_t* context)
{
ASSERT(NULL != context);
.
.
还有很多嵌入式代码,其中函数被定义为
void
函数,假设它们永远不会失败,或者使用断言宏在调试模式下停止执行,但在生产中不执行任何操作。
静态函数
static Status_t send(uint8_t* buf, uint8_t size)
{
if (NULL == buf)
{
return FAIL;
}
memcpy(bus, buf, size);
return PASS;
}
Status_t sendMsg(Msg_t* msg, uint8_t size)
{
if (NULL == msg)
{
return FAIL;
}
if (FAIL == send((uint8_t*)msg, size))
{
return FAIL;
}
return PASS;
}
假设在全局函数中添加了参数检查。那么问题就变成了:我们是否应该向静态函数添加参数检查,以检查在调用全局函数(如上)中始终检查和处理的参数?这些通常可以避免,因为顶级函数已经处理这些检查。
在所有这三种情况下,嵌入式开发人员似乎都喜欢有利于效率的代码实践,因为代码(可能)运行得更快并且可以节省闪存空间。然而,当代码执行与假设相反时,不处理无效参数的危险可能会导致可怕的结果。
我很想知道是否存在广泛或特定于您/您的组织的标准实践或指南,它们已经形成了一个优雅的框架/心态/原则来处理安全和效率的这种权衡。
在对嵌入式系统进行单元测试时,通常需要在安全性和效率之间进行权衡。虽然彻底的测试可以确保安全性,尤其是关键系统的安全性,但有时会导致执行速度变慢并增加复杂性。另一方面,优先考虑效率可能会因不检查边缘情况而损害安全性。良好的平衡至关重要。参加程序测试课程可以为您提供优化嵌入式系统测试的安全性和效率所需的工具和方法。