大概聊聊在项目中,使用第三方库时一些注意点。
这个项目中,接入了友方的一些功能,以头文件及动态库形式,也提供了接口说明以使用方法。
有块逻辑功能不是我负责的,因为时间剩余一些就大概看了看。有几行代码存在安全问题即常见的内存越界和性能问题。
因为如果要提供基础库给别人使用,至少接口参数说清楚,算是一种约定。比如会改变或者不改变形参,尽量说清楚,不会改变加const引用或者指针,一般引用比较好,不会引用空对象。这样用的时候就不需要拷贝一份数据传递进去。
当然,有些“指南”会建议在接口内检查每个参数是否合法,而有的建议不检查,因为传一个比如空指针到接口内或者比如字符串拷贝传来可能重叠区域造成覆盖等问题,是不应该的,是使用者的问题,接口的实现不可能考虑到每一种情况,设计弹性的接口,其实不简单。
回到越界这块,项目中用的是memcpy,然后因为向第三方接口传入了一个结构体,需要检查比如一段聊天内容,可能检测到不合法字段需要用星号代替,然后接口传出一些数据包括长度,这里使用方需要拷贝数据(传出的数据中申请的堆内存由接口内部释放,不可用move等),如果接口承诺是二进制安全的,那么是否有必要再多申请一个字节空间用于结束?
我大概看了下文档,其实也并没有看到这块内容,为了安全起见,还是在末尾加上空白符,防止造成各种内存错误。
额外注意下memcpy,strcpy,strncpy,memmove等实现原理。C/C++这么语言不简单。