1. 程式人生 > >程式碼安全性和健壯性:如何在if和assert中做選擇?

程式碼安全性和健壯性:如何在if和assert中做選擇?


道哥的第 023 篇原創

[TOC] ## 一、前言 我們在擼程式碼的時候,經常需要對程式碼的安全性進行檢查,例如: > 1. 指標是否為空? > 2. 被除數是否為 0? > 3. 函式呼叫的返回結果是否有效? > 4. 開啟一個檔案是否成功? 對這一類的邊界條件進行檢查的手段,一般都是使用 if 或者 assert 斷言,無論使用哪一個,都可以達到檢查的目的。那麼是否就意味著:這兩者可以隨便使用,想起來哪個就用哪個? 這篇小短文我們就來掰扯掰扯:在不同的場景下,到底是應該用 if,還是應該使用 assert 斷言? 寫這篇文章的時候,我想起了孔乙己老先生的那個問題:茴香豆的“茴”字有幾種寫法? 似乎我們沒有必要來糾結應該怎麼選擇,因為都能夠實現想要的功能。以前我也是這麼想的,但是,現在我不這麼認為。 成為技術大牛、拿到更好的offer,也許就在這些細微之間就分出了勝負。 ## 二、assert 斷言 剛才,我問了下旁邊的一位工作 5 年多的嵌入式開發者:if 和 assert 如何選擇?他說:assert 是幹什麼的?! 看來,有必要先簡單說一下 assert 斷言。 assert() 的原型是: `void assert(int expression);` > 1. 如果巨集的引數求值結果為非零值,則不做任何操作(no action); > 2. 如果巨集的引數是零值,就列印診斷訊息,然後呼叫abort()。 例如下面的程式碼: ``` #