大概聊聊在項(xiàng)目中,使用第三方庫時一些注意點(diǎn)。
這個項(xiàng)目中,接入了友方的一些功能,以頭文件及動態(tài)庫形式,也提供了接口說明以使用方法。
有塊邏輯功能不是我負(fù)責(zé)的,因?yàn)闀r間剩余一些就大概看了看。有幾行代碼存在安全問題即常見的內(nèi)存越界和性能問題。
因?yàn)槿绻峁┗A(chǔ)庫給別人使用,至少接口參數(shù)說清楚,算是一種約定。比如會改變或者不改變形參,盡量說清楚,不會改變加const引用或者指針,一般引用比較好,不會引用空對象。這樣用的時候就不需要拷貝一份數(shù)據(jù)傳遞進(jìn)去。
當(dāng)然,有些“指南”會建議在接口內(nèi)檢查每個參數(shù)是否合法,而有的建議不檢查,因?yàn)閭饕粋€比如空指針到接口內(nèi)或者比如字符串拷貝傳來可能重疊區(qū)域造成覆蓋等問題,是不應(yīng)該的,是使用者的問題,接口的實(shí)現(xiàn)不可能考慮到每一種情況,設(shè)計(jì)彈性的接口,其實(shí)不簡單。
回到越界這塊,項(xiàng)目中用的是memcpy,然后因?yàn)橄虻谌浇涌趥魅肓艘粋€結(jié)構(gòu)體,需要檢查比如一段聊天內(nèi)容,可能檢測到不合法字段需要用星號代替,然后接口傳出一些數(shù)據(jù)包括長度,這里使用方需要拷貝數(shù)據(jù)(傳出的數(shù)據(jù)中申請的堆內(nèi)存由接口內(nèi)部釋放,不可用move等),如果接口承諾是二進(jìn)制安全的,那么是否有必要再多申請一個字節(jié)空間用于結(jié)束?
我大概看了下文檔,其實(shí)也并沒有看到這塊內(nèi)容,為了安全起見,還是在末尾加上空白符,防止造成各種內(nèi)存錯誤。
額外注意下memcpy,strcpy,strncpy,memmove等實(shí)現(xiàn)原理。C/C++這么語言不簡單。