code.club

 找回密碼
 立即註冊
搜索
查看: 6331|回復: 0
打印 上一主題 下一主題

NASA頂級程式設計師程式設計十大規則

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2019-2-27 20:38:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
NASA 的開發者是程式設計界最有挑戰性的工作之一。他們編寫程式碼並將開發安全的關鍵任務應用程式作為其主要關注點。

在這種情形下,遵守一些嚴格的編碼規則是重要的。這些規則覆蓋軟體開發的多個方面,例如軟體應該如何編碼、應該使用哪些語言特性等。

儘管很難就一個好的編碼標準達成共識,NASA 的噴氣推進實驗室(JPL)遵守一個編碼規則,其名為“十的次方:開發安全的關鍵程式碼的規則”。

由於 JPL 長期使用 C 語言,這個規則主要是針對於 C 程式語言編寫。但是這些規則也可以很容地應用到其它的程式語言。

該規則由 JPL 的首席科學家 Gerard J. Holzmann 制定,這些嚴格的編碼規則主要是聚焦於安全。

NASA 的 10 條編寫關鍵任務程式碼的規則:

1.限制所有程式碼為極為簡單的控制流結構 — 不用 goto 語句、setjmp 或 longjmp 結構,不用間接或直接的遞迴呼叫。

2.所有迴圈必須有一個固定的上限值。必須可以被某個檢測工具靜態證實,該迴圈不能達到預置的迭代上限值。如果該上限值不能被靜態證實,那麼可以認為違背該原則。

3.在初始化後不要使用動態記憶體分配。

4.如果一個語句一行、一個宣告一行的標準格式來參考,那麼函式的長度不應該比超過一張紙。通常這意味著每個函式的程式碼行不能超過 60。

5.程式碼中斷言的密度平均低至每個函式 2 個斷言。斷言被用於檢測那些在實際執行中不可能發生的情況。斷言必須沒有副作用,並應該定義為布林測試。當一個斷言失敗時,應該執行一個明確的恢復動作,例如,把錯誤情況返回給執行該斷言失敗的函式呼叫者。對於靜態工具來說,任何能被靜態工具證實其永遠不會失敗或永遠不能觸發的斷言違反了該規則(例如,通過增加無用的 assert(true) 語句是不可能滿足這個規則的)。

6.必須在最小的範圍內宣告資料物件。

7.非 void 函式的返回值在每次函式呼叫時都必須檢查,且在每個函式內其引數的有效性必須進行檢查。

8.前處理器的使用僅限制於包含標頭檔案和簡單的巨集定義。符號拼接、可變引數列表(省略號)和遞迴巨集呼叫都是不允許的。所有的巨集必須能夠擴充套件為完整的語法單元。條件編譯指令的使用通常是晦澀的,但也不總是能夠避免。這意味著即使在一個大的軟體開發中超過一兩個條件編譯指令也要有充足的理由,這超出了避免多次包含標頭檔案的標準做法。每次在程式碼中這樣做的時候必須有基於工具的檢查器進行標記,並有充足的理由。

9.應該限制指標的使用。特別是不應該有超過一級的解除指標引用。解除指標引用操作不可以隱含在巨集定義或型別宣告中。還有,不允許使用函式指標。

10.從開發的第一天起,必須在編譯器開啟最高階別警告選項的條件下對程式碼進行編譯。在此設定之下,程式碼必須零警告編譯通過。程式碼必須利用原始碼靜態分析工具每天至少檢查一次或更多次,且零警告通過。
關於這些規則,NASA 是這麼評價的:

這些規則就像汽車中的安全帶一樣,剛開始你可能感到有一點不適,但是一段時間後就會養成習慣,你會無法想象不使用它們的日子。

作者簡介:

Adarsh Verma 是 Fossbytes 的共同創始人,他是一個令人尊敬的企業家,他一直對開源、技術突破和完全保持密切關注。可以通過郵件聯絡他 — adarsh.verma@fossbytes.com

via: https://fossbytes.com/nasa-coding-programming-rules-critical/
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|手機版|Archiver|code.club  

GMT+8, 2024-4-19 16:50 , Processed in 0.108447 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表