關於作者
前言
第1章 本標準使用說明係統質量
自動生成的代碼
順應性
第2章 預處理器(PRE)
建議和規則
風險評估匯總
相關規則和建議
PRE00-C.用內聯函數或靜態函數代替與函數相似的宏
PRE01-C.在宏參數名兩邊加上括號
PRE02-C.宏替換列錶應該加上括號
PRE03-C.應該使用typedef定義編碼類型
PRE04-C.不要復用標準頭文件名
PRE05-C.理解連接標記或執行字符串化時的宏替換
PRE06-C.把頭文件放在包含防護條件中
PRE07-C.避免使用連續的問號
PRE08-C.保證頭文件名惟一
PRE09-C.不要用不安全的函數替換安全函數
PRE10-C.在一個do-while循環中包裝多條語句的宏
PRE30-C.不要通過連接創建統一字符名稱
PRE31-C.不要在不安全宏的參數中包含賦值、增值、減值、volatile訪問或函數調用
第3章 聲明和初始化(DCL)
建議和規則
風險評估匯總
DCL00-C. 用const限定不可修改的對象
DCL01-C.不要在子作用域中復用變量名
DCL02-C.使用視覺區彆明顯的標識符
DCL03-C.使用靜態斷言測試常量錶達式的值
DCL04-C.不要在一個聲明中聲明超過1個的變量
DCL05-C.使用typedef聲明提高代碼的可讀性
DCL06-C.使用有意義的符號常量錶示程序邏輯中的字麵值
DCL07-C.在函數聲明器中包含適當的類型信息
DCL08-C.在常量定義中對關係進行正確的編碼
DCL09-C.把返迴errno錯誤代碼的函數的返迴類型聲明為errno_t
DCL10-C.維護變參函數的編寫者和調用者之間的契約
DCL11-C.理解與變參函數相關聯的類型問題
DCL12-C.使用不透明類型實現抽象數據類型
DCL13-C.把不會被函數修改的值指針參數聲明為const
DCL14 不要對跨翻譯單元的全局變量的初始化順序作齣假設
DCL15-C.把不需要外部鏈接的對象聲明為static
DCL30-C.聲明具有正確存儲持久期的對象
DCL31-C.在使用標識符之前聲明它們
DCL32-C.保證相互可見的標識符是惟一的
DCL33-C.保證函數實參中具有限製性限定的源指針和目標指針不引用重疊的對象
DCL34-C.對無法緩存的數據使用volatile
DCL35-C.不要使用與函數定義不匹配的類型轉換函數
DCL36-C.不要聲明具有衝突鏈接屬性的標識符
第4章 錶達式(EXP)
建議和規則
風險評估匯總
相關的規則和建議
EXP00-C.使用括號保證操作的優先級
EXP01-C.不要用指針的長度確定它所指嚮類型的長度
EXP02-C.注意邏輯AND和OR操作符的短路行為
EXP03-C.不要認為結構的長度等於它的各個成員的長度之和
EXP04-C.不要在結構之間執行逐字節的比較
EXP05-C.不要轉換掉const限定
EXP06-C. sizeof操作符的操作數不應該包含副作用
EXP07-C.不要在錶達式中對常量的值作齣假設而削弱常量的優點
EXP08-C.確保正確地使用指針運算
EXP09-C.使用sizeof確定類型或變量的長度
EXP10-C.不要依賴子錶達式的求值順序或副作用的發生順序
EXP11-C.不要把期待一種類型的操作符應用於一種不兼容的類型
EXP12-C.不要忽略函數的返迴值
EXP30-C.不要依賴序列點之間的求值順序
EXP31-C.避免斷言的副作用
EXP32-C.不要轉換掉volatile限定..
EXP33-C.不要引用未初始化的內存
EXP34-C.保證不對null指針進行解引用
EXP35-C.不要在後續的序列點之後訪問或修改一個函數的調用結果中的數組
EXP36-C.不要把指針轉換為對齊要求更嚴格的指針類型
EXP37-C.調用函數時使用API所指定的參數
EXP38-C.不要在位段成員或非法類型上調用offsetof()
第5章 整數(INT)
建議和規則
風險評估匯總
相關的規則和建議
INT00-C.理解編譯器所使用的數據模型
INT01-C.使用rsize_t或size_t類型錶示所有錶示對象長度的整數值
INT02-C.理解整數轉換規則
INT03-C.使用安全的整數庫
INT04-C.對來自不信任來源的整數值實行限製
INT05-C.如果輸入函數無法處理所有可能齣現的錯誤就不要用它們轉換字符數據
INT06-C.使用strtol()或相關函數把字符串標記轉換為整數
INT07-C.隻使用顯式的有符號或無符號char類型錶示數值
INT08-C.驗證所有的整數值位於範圍內
INT09-C.保證枚舉常量映射到惟一數值
INT10-C.使用%操作符時不要假設餘數總是正的
INT11-C.把指針轉換為整數或者把整數轉換為指針時需要小心
INT12-C.當普通的整數位段用於錶達式時,不要對它的類型作齣假設
INT13-C.隻對無符號操作數使用位操作符
INT14-C.避免在同一個數據上執行位操作和算術運算
INT15-C.在程序員定義的整數類型的格式化I/O中使用intmax_t或uintmax_t
INT30-C.保證無符號整數運算不産生迴繞
INT31-C.保證整型轉換不會丟失或錯誤解釋數據
INT32-C.保證有符號整數運算不會産生溢齣
INT33-C.保證除法和求模運算不會導緻除零錯誤
INT34-C.移位的數量不能是負數或大於操作數的位數
INT35-C.把整型錶達式比較或賦值為一種較大類型之前用這種較大類型對它進行求值
第6章 浮點數(FCP)
建議和規則
風險評估匯總
相關規則和建議
FLP00-C.理解浮點數的限製
FLP01-C.在重新排列浮點錶達式時需要注意
FLP02-C.需要精確計算時避免使用浮點數
FLP03-C.檢測和處理浮點錯誤
FLP30-C.不要使用浮點數作為循環計數器
FLP31-C.不要用復數調用期望接受實數的函數
FLP32-C.防止或檢測數學函數中的定義域錯誤和值域錯誤
FLP33-C.執行浮點運算時把整數轉換為浮點數
FLP34-C.保證浮點轉換位於新類型的範圍之內
第7章 數組(ARR)
建議和規則
風險評估匯總
相關規則和建議
ARR00-C.理解數組的工作方式
ARR01-C.獲取數組的長度時不要對指針應用sizeof操作符
ARR02-C.顯式地指定數組的邊界,即使它已經由初始化值列錶隱式地指定
ARR30-C.保證數組索引位於閤法的範圍之內
ARR31-C.在所有源文件中使用一緻的數組記法
ARR32-C.保證變長數組的長度參數位於閤法範圍之內
ARR33-C.保證復製的目標具有足夠的存儲空間
ARR34-C.保證錶達式中的數組類型是兼容的
ARR35-C.不允許循環迭代到數組尾部之後
ARR36-C.不要對兩個並不指嚮同一個數組的指針進行相減或比較
ARR37-C.不要把一個指嚮非數組對象的指針加上或減去一個整數
ARR38-C.如果結果值並不引用閤法的數組元素,不要把指針加上或減去一個整數
第8章 字符和字符串(STR)
建議和規則
風險評估匯總
相關規則和建議
STR00-C.使用適閤的類型錶示字符
STR01-C.采納和實現一緻的字符串管理計劃
STR02-C.對傳遞給復雜子係統的字符串數據進行淨化
STR03-C.不要意外地截斷null結尾的字節字符串
STR04-C.使用普通char類型錶示基本字符集中的字符
STR05-C.引用字符串常量時使用const指針
STR06-C.不要以為strtok()會使解析的字符串不被修改
STR07-C.使用TR 24731修正現在的字符串操縱代碼
STR08-C.使用托管字符串開發新的字符串操縱代碼
STR30-C.不要試圖修改字符串常量
STR31-C.保證字符串的存儲具有足夠的空間容納字符數據和null結尾符
STR32-C.根據需要將字符串用null結尾
STR33-C.正確地判斷寬字符串的長度
STR34-C.在轉換為更大的整型長度時把字符轉換為無符號類型
STR35-C.不要把未檢查邊界來源的數據復製到固定長度的數組
STR36-C.不要指定用字符串常量初始化的字符數組的邊界
STR37-C.字符處理函數的參數必須能夠用unsigned char錶示
第9章 內存管理(MEM)
建議和規則
風險評估匯總
相關規則和建議
MEM00-C.在同一個模塊、同一個抽象層中分配和釋放內存
MEM01-C.在free()之後立即在指針中存儲一個新值
MEM02-C.把內存分配函數的調用結果立即轉換為指嚮被分配類型的指針
MEM03-C.及時清除存儲在可復用資源中的敏感信息
MEM04-C.不要執行零長度的分配
MEM05-C.避免大型的堆棧分配
MEM06-C.保證敏感數據不會被寫入到磁盤
MEM07-C.保證calloc()的參數相乘後可以用size_t錶示
MEM08-C.隻把realloc()用於改變動態分配數組的大小
MEM09-C.不要假設內存分配函數會對內存進行初始化
MEM10-C.定義和使用指針驗證函數
MEM30-C.不要訪問已經被釋放的內存
MEM31-C.動態分配的內存隻應釋放一次
MEM32-C.檢測和處理內存分配錯誤
MEM33-C.使用正確的語法錶示靈活數組成員
MEM34-C.隻釋放動態分配的內存
MEM35-C.為對象分配足夠的內存
第10章 輸入/輸齣(FLO)
建議和規則
風險評估匯總
相關規則和建議
FIO00-C.在創建格式字符串時應該小心
FIO01-C.調用通過文件名標識文件的函數時必須小心
FIO02-C.對來自不信任來源的路徑名進行標準化
FIO03-C.不要對fopen()和文件的創建作齣假設
FIO04-C.檢測和處理輸入和輸齣錯誤
FIO05-C.使用多個文件屬性標識文件
FIO06-C.創建具有正確訪問權限的文件
FIO07-C.用fseek()代替rewind()
FIO08-C.在打開的文件上調用remove()時應該小心
FIO09-C.跨係統傳輸二進製數據時應該小心
FIO10-C.使用rename()函數時應該小心
FIO11-C.指定fopen()的mode參數時應該小心
FIO12-C.使用setvbuf()代替setbuf()
FIO13-C.不要壓迴多於1個的字符
FIO14-C.理解文件流的文本模式和二進製模式的區彆
FIO15-C.保證文件操作在安全目錄中執行
FIO16-C.通過創建jail限製對文件的訪問
FIO30-C.排除格式字符串中的用戶輸入
FIO31-C.不要打開已經被打開的文件
FIO32-C.不要在專用於文件的設備上執行操作
FIO33-C.檢測和處理導緻未定義行為的輸入輸齣錯誤
FIO34-C.使用int捕捉字符I/O函數的返迴值
FIO35-C.當sizeof(int) == sizeof(char)時使用feof()和ferror()檢測文件尾和文件錯誤
FIO36-C.不要假設fgets()會讀取換行符
FIO37-C.不要假設被讀取的是字符數據
FIO38-C.不要使用FILE對象的拷貝進行輸入和輸齣
FIO39-C.不要在沒有乾預刷新或定位調用的情況下在一個流中交替地執行輸入和輸齣
FIO40-C.在fgets()失敗時重置字符串
FIO41-C.調用getc()或putc()時不要使用具有副作用的流參數
FIO42-C.保證當文件不再需要時及時將它們關閉
FIO43-C.不要在共享目錄中創建臨時文件
FIO44-C.隻在fsetpos()中使用fgetpos()所返迴的值
第11章 環境(ENV)
建議和規則
風險評估匯總
相關規則和建議
ENV00-C.不要存儲指嚮getenv()返迴的字符串的指針
ENV01-C.不要對環境變量的長度作齣假設
ENV02-C.注意具有相同有效名稱的多個環境變量
ENV03-C. 調用外部程序時對環境進行淨化
ENV04-C.如果不需要命令處理器就不要調用system()
ENV30-C.不要修改getenv()所返迴的字符串
ENV31-C.在可能無效化環境指針的操作之後不能再依賴它
ENV32-C.所有的atexit處理函數都不能以除瞭正常返迴之外的其他任何方式終止
第12章 信號(SIG)
建議和規則
風險評估匯總
相關規則和建議
SIG00-C.屏蔽由不可中斷的信號處理函數所處理的信號
SIG01-C.理解與信號處理函數的持久性有關的平颱特定的細節
SIG02-C.避免使用信號實現常規的功能
SIG30-C.隻在信號處理函數中調用異步安全的函數
SIG31-C.不要訪問和修改信號處理函數中的共享對象
SIG32-C.不要在信號處理函數中調用longjmp()
SIG33-C.不要遞歸地調用raise()函數
SIG34-C.不要在不可中斷的信號處理函數內部調用signal()
第13章 錯誤處理(ERR)
建議和規則
風險評估匯總
相關規則和建議
ERR00-C.采用和實現一緻的、全麵的錯誤處理策略
ERR01-C.使用ferror()而不是errno檢查FILE流錯誤
ERR02-C.避免帶內錯誤指示符
ERR03-C.調用TR24731-1所定義的函數時使用運行時約束處理函數
ERR04-C.選擇一種適當的終止策略
ERR05-C.獨立於應用程序的代碼應該在不提示錯誤處理的情況下提供錯誤檢測
ERR06-C.理解assert()和abort()的終止行為
ERR30-C.調用設置errno的庫函數之前把errno設置為0,並且在函數返迴一個提示失敗的值之後檢查errno
ERR31-C.不要重定義errno
ERR32-C.不要依賴errno的不確定值
第14章 其他(MSC)
建議和規則
風險評估總結
MSC00-C.在高警告級彆進行乾淨的編譯
MSC01-C.實現邏輯完整性
MSC02-C.避免因為省略所導緻的錯誤
MSC03-C.避免因為多餘所導緻的錯誤
MSC04-C.用一種可讀的風格一緻地使用注釋
MSC05-C.不要直接維護time_t類型的值
MSC06-C.處理敏感數據時注意編譯器的優化
MSC07-C.檢測和刪除死代碼
MSC08-C.庫函數應該對形參進行驗證
MSC09-C.字符編碼:使用ASCII的子集以保證安全
MSC10-C.字符編碼:UTF 8相關的問題
MSC11-C.使用斷言進行診斷測試
MSC12-C.檢測和刪除沒有效果的代碼
MSC13-C.檢測和刪除未使用的值
MSC14-C.不要引入不必要的平颱依賴性
MSC15-C.不要依賴未定義的行為
MSC30-C.不要使用rand()函數産生僞隨機數
MSC31-C.保證返迴值與適當的類型進行比較
附錄 POSIX(POS)
建議和規則
風險評估匯總
相關的規則和建議
POS00-C.避免多綫程的競爭條件
POS01-C.檢查鏈接是否存在
POS02-C.遵循最小特權原則
POS30-C.正確地使用readlink()函數
POS31-C.不要解鎖或銷毀另一個綫程的mutex
POS32-C.在多綫程環境中使用位段時包含一個mutex
POS33-C.不要使用vfork()
POS34-C.不要用一個指嚮自動變量的指針為參數調用putenv()
POS35-C.避免檢查符號鏈接是否存在時的競爭條件
POS36-C.在撤消特權時注意正確的撤消順序
POS37-C.保證特權的撤消是成功的
詞匯錶
參考資料
· · · · · · (
收起)