华为代码质量军规 (1) 数组访问,必须进行越界保护
https://blog.csdn.net/thecoldone/article/details/50759044
?
C++中數(shù)組作為形參傳遞給函數(shù)時(shí)把數(shù)組視為指針,并沒有將數(shù)組的長度信息傳遞給函數(shù),因而在函數(shù)中稍有不慎就會造成數(shù)組內(nèi)存的越界訪問。為了避免這個(gè)問題,下面根據(jù)書上給的內(nèi)容做了一點(diǎn)總結(jié)和說明。
數(shù)組形參的定義
void func(int *) {/* ...*/}
void func(int[]) {/* ... */}
void func(int[10]) {/* ...*/}
上面三種形參表示方式都是合法和等價(jià)的,可以看到C++將數(shù)組視為指針。另外第三種表示方式看上去在方括號中用一個(gè)常量指定了數(shù)組的長度,但事實(shí)上編譯器忽略了這一方式指定的數(shù)組長度,在函數(shù)調(diào)用時(shí)即使你給func函數(shù)傳遞一個(gè)長度不為10的數(shù)組編譯器同樣可以讓你通過,只不過這在實(shí)際運(yùn)行中可能造成數(shù)組內(nèi)存的越界訪問。(注:這種表示方式要和下面介紹的數(shù)組引用相區(qū)分開來)
因?yàn)镃++并不支持將數(shù)組的長度信息自動傳遞給函數(shù),所以我們在編寫代碼時(shí)必須采取措施來避免數(shù)組形參帶來的越界訪問問題,下面給出幾種方法
1.顯示傳遞數(shù)組長度:在函數(shù)定義的參數(shù)列表中加多一個(gè)表示數(shù)組大小的參數(shù),這種做法比較常見,舉個(gè)例子:
void func(int arr[], size_t size) {for (size_t i = 0; i < size; i++)// operation }?
2.顯示指定數(shù)組開始和結(jié)束的位置:這種編程風(fēng)格由標(biāo)準(zhǔn)庫所使用的技術(shù)啟發(fā)而得,常見于迭代器的使用,舉個(gè)例子:
void func(int *begin, int *end) {for (int *pt = begin; pt != end; pt++)// operation }?
3.顯示添加結(jié)束的標(biāo)記:在數(shù)組末尾加多一個(gè)標(biāo)識元素用來檢測數(shù)組的結(jié)束,常見的例子是C風(fēng)格字符串,它是一種字符數(shù)組,并且以空字符null作為結(jié)束的標(biāo)記
void func(char *cstr) {for (int i = 0; '\0' != cstr[i]; i++)// operation }?
4.通過引用傳遞數(shù)組:如果形參是數(shù)組的引用,編譯器不會將數(shù)組實(shí)參轉(zhuǎn)化為指針,而是傳遞數(shù)組的引用本身
void func(int (&arr)[10]) {for (int i = 0; i < 10; i++)// operation }int main() {int size = 20;int iarray[size] = {0};func(iarray); // errorreturn 0; }不過這種方式編譯器有著嚴(yán)格的規(guī)定,使用時(shí)要注意以下幾點(diǎn):
- 實(shí)參和形參的數(shù)組的長度都必須是常量,包括字面值常量(例如上面的數(shù)字10)和const修飾的常量(const int Size = 20; void func(int (&arr)[Size]) { } ),例如上面在main函數(shù)中調(diào)用func函數(shù)錯(cuò)誤的原因在于實(shí)參數(shù)組iarray定義時(shí)用了變量size來指定長度。這樣做確保在編譯時(shí)就能檢測出可能出現(xiàn)的數(shù)組長度不一致的錯(cuò)誤,而不至于等到運(yùn)行時(shí)造成更嚴(yán)重的后果
- 函數(shù)定義時(shí)&和變量名要用括號括起來,表示變量arr是指向int[10]型數(shù)組的指針
- C++中的引用時(shí)允許修改原始數(shù)據(jù),因此在函數(shù)調(diào)用時(shí)要謹(jǐn)慎考慮,如果不允許調(diào)用函數(shù)func對數(shù)組進(jìn)行修改,在定義func函數(shù)時(shí)使用const修飾數(shù)組( void func(const int (&arr)[10]) )
轉(zhuǎn)載于:https://www.cnblogs.com/ye-ming/p/9598799.html
總結(jié)
以上是生活随笔為你收集整理的华为代码质量军规 (1) 数组访问,必须进行越界保护的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pythonのgevent同步异步区别
- 下一篇: 进程相关操作