在信任边界内,以保证安全性为前提,避免冗余的合法性检查
【说明】 在跨信任边界入口处统一进行合法性检查,避免性能关键路径上在信任边界内进行冗余的合法性检查。
信任边界的定义:
- 进程与进程之间的消息通信
- 跨so的API接口
- 应用程序与操作系统内核
【原理】 对外部数据不加限制的使用会导致严重的安全问题,如缓冲区溢出、空指针访问、除零等,为了提升程序的安全性,按照《c-coding-standard》P.04的要求,程序要对外部的数据进行合法性检查。但是在信任边界内,大量进行重复的合法性检查,可能会导致程序性能的下降。
【注意事项】 不涉及
【案例】
优化前:
在a.c中:
void AllocRes(MsgBlock *msg)
{
if (msg == NULL) {
//错误处理
...
}
...
}
void RecordRes(MsgBlock *msg)
{
if (msg == NULL) {
//错误处理
...
}
...
}
int MsgProcEntry(MsgBlock *msg)
{
if (msg == NULL) {
//错误处理
...
}
AllocRes(msg);
RecordRes(msg);
}
可以看出,只有MsgProcEntry是进程间消息通信的入口,另外两个函数都属于内部处理,可以只在MsgProcEntry中进行入参合法性检查,AllocRes和RecordRes中不再进行重复检查。
同时,为了避免AllocRes和RecordRes在其他跨进程消息处理中被调用而保护不当,需要加上static修饰。
static void AllocRes(MsgBlock *msg)
{
...
}
static void RecordRes(MsgBlock *msg)
{
...
}
int MsgProcEntry(MsgBlock *msg)
{
if (msg == NULL) {
//错误处理
...
}
AllocRes(msg);
RecordRes(msg);
}
父主题: 函数设计