鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

在信任边界内,以保证安全性为前提,避免冗余的合法性检查

【说明】 在跨信任边界入口处统一进行合法性检查,避免性能关键路径上在信任边界内进行冗余的合法性检查。

信任边界的定义:

  • 进程与进程之间的消息通信
  • 跨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);

}