日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

华为代码质量军规 (1) 数组访问,必须进行越界保护

發(fā)布時(shí)間:2025/7/25 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 华为代码质量军规 (1) 数组访问,必须进行越界保护 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。