河南夢之網網絡科技有限公司
夢之網科技出品
掃描關注夢之網科技微信公眾賬號

掃小程序碼聯系客服

編寫零漏洞代碼所需的編碼準則-夢之網科技

夢之網科技?2019-10-08?文章動態?

蓋房子時,如果負責基礎工作的泥瓦匠手藝不精又沒有竭盡全力,房屋質量就不可能過關。即使后期有技藝精湛的裝潢布局使得建筑物的外觀精美絕倫,根基沒有打好也會成為“豆腐渣工程”。同理,決定軟件系統質量的就是編碼工作,這就要求負責編碼的程序員具有過硬的基本功。

本文將和大家分析編寫零漏洞代碼所需的編碼準則。

1

數組下標應從 0 開始

C 語言中的數組聲明語句如下所示。

代碼 P280 第一行

用該語句聲明的數組具有如下形式。

代碼 P280 第二段

此處需要注意,數組的第一個元素的下標為 0。也就是說,數組的第一個元素并不是 1 號元素,1 號元素實際上是數組的第二個元素。

程序員經常混淆這一點。這就導致為第五個元素賦值時,編寫的語句形式如下所示。

代碼 P280 第三行

這會導致原本應該賦給目標元素的值誤賦予非目標元素,進而產生嚴重問題。實際上,為第五個元素賦值的正確語句如下所示。

代碼 P281 第一行

指定數組下標時出現錯誤的原因主要在于,程序員基本功不夠扎實。要想避免這些問題,就必須訓練自己在指定數組下標時能夠區分第一、第二、第三這種表示順序的序數,以及一、二、三這種表示個數的基數。可以重讀自己編寫的代碼,檢查數組下標是否正確。

指定數組下標時出現的失誤可能打亂整個數據集合。即應該賦給 1 號元素的值被賦給了 0 號元素,而 1 號元素仍保留原值。這與程序員的本意相背離,也很難定位引起這種數據混亂的根源所在。

這種從 1 開始對數組進行計數引起的錯誤又稱大小差一(off-by-one)錯誤,顧名思義,就是少一個的意思。從 1 開始計數可能產生其他錯誤,比如無法處理數組的最后一個元素或引用無關數組,換言之,引用的數組可能始終是目標數組的下一個數組。

特別是在 while、for、do … while 循環語句中,這種大小差一錯誤更容易出現。

……中略……

計算數組所有元素總和

……中略……

根據注釋可知,該 while 語句要實現的功能是計算數組元素總和,那么應該從 0 號元素開始計算。但 counter 的值是從 1 開始的,也就是說,是從 1 號元素開始計算的。這就是典型的大小差一錯誤。應該將該語句改寫如下,counter 從 0 開始計數。

代碼 P282 第二行

隨著程序員編程經驗日漸豐富,這種大小差一錯誤的出現率會逐漸降低。但編程菜鳥還是會經常出錯,所以應當時刻保持警惕。特別是編寫循環語句時,更要多加留意。

2

置換字符串時必須使用括號

首先分析經常被用作示例的宏函數。

代碼 P282 第三行

從代碼中可以看出,宏函數 SQRT(x) 可以計算 x 的平方值。從表面看這段代碼并沒有任何問題,運行如下語句后,可以得出 y 值為 100。

代碼 P282 第四行

這是因為,該語句被置換為如下形式。

代碼 P283 第一行

如果在宏函數中傳遞表達式作為參數,會出現什么結果呢?將下列表達式傳遞到宏函數,代碼還能正常運行嗎?

代碼 P283 第二行

上述語句被置換為如下形式。

代碼 P283 第三行

根據該表達式的運算符優先級,可以推測運算順序如下,計算結果為 230。

代碼 P283 第四行

我們預期的結果應該是 900,實際結果竟然是 230。

如何才能避免這種問題呢?如下所示,在定義宏函數時使用括號。

代碼 P283 第五行

如上定義宏函數后,再用下列語句調用該函數。

代碼 P283 第六行

可以得出正確答案 900,因為該語句被置換為如下形式。

代碼 P283 第七行

3

文件必須有開就有關

我編寫過一個處理主文件的程序,該主文件一次需要保管大約 3 萬份數據。而且主文件的特性要求,允許多個程序擁有同時使用該文件的權限。

項目快要收尾時,我開始進行綜合測試。此時,問題出現了。所有程序中,只有我編寫的這個程序出現了問題。我從頭開始檢查程序代碼,卻沒有發現任何異常。雖然在各種編譯器配置下不斷編譯、執行,但界面始終顯示“無法打開文件”的錯誤信息。

這實在令人百思不得其解。我耗費了整整一周的時間死摳代碼。當然,整個項目也因此延期一周。1500 行代碼讓我眼花、惡心,最后身心交瘁,幾乎要放棄。就在這時,我突然靈光乍現:“說不定,并不是程序有問題。”

如果不是程序有問題,那么是什么問題呢?我開始查看所有可能與該主文件有關的程序。除了我自己編寫的程序外,還檢查了其他所有人編寫的程序。就這樣,一周又過去了。

文章關鍵詞
程序員
代碼
編碼
編譯器
急速赛车国语 海南环岛赛开奖软件下载 炸金花下载 玩那个网络游戏能赚钱 湖南幸运赛车奖金表 内蒙古11选5遗漏top 五金城送什么货赚钱吗 重庆百变王牌概率 申城棋牌有手机版吗 280组选号码前后关系 山西十一选五开奖查询结果 兰州股票配资 如何创建合买彩票群 舟山星空棋牌下载安装 北京快乐8和值 陕西11选5走势图遗漏top10 固废处理赚钱吗