譯者序
前言
貢獻者簡介
第1章 預處理器(PRE)
1.1 PRE30-C. 不要通過連接創建通用字符名稱
1.2 PRE31-C. 避免不安全宏參數的副作用
1.3 PRE32-C. 不要在類函數的宏調用中使用預處理器指令
第2章 聲明和初始化(DCL)
2.1 DCL30-C. 聲明具有正確存儲持續期的對象
2.2 DCL31-C. 在使用前聲明標識符
2.3 DCL36-C. 不要聲明具有衝突鏈接類彆的標識符
2.4 DCL37-C. 不要聲明或者定義保留標識符
2.5 DCL38-C. 使用正確語法聲明靈活數組成員
2.6 DCL39-C. 避免在結構填充中泄露信息
2.7 DCL40-C. 不要創建相同函數或者對象的不兼容聲明
2.8 DCL41-C. 不要在switch語句第一個條件標簽之前聲明變量
第3章 錶達式(EXP)
3.1 EXP30-C. 不要依賴求值順序以避免副作用
3.2 EXP32-C. 不要通過非易失性引用訪問易失性對象
3.3 EXP33-C. 不要讀取未初始化的內存
3.4 EXP34-C. 不要對null指針進行解引用
3.5 EXP35-C. 不要修改具有臨時生命期的對象
3.6 EXP36-C. 不要將指針轉換為更嚴格對齊的指針類型
3.7 EXP37-C. 用正確數量和類型的參數調用函數
3.8 EXP39-C. 不要通過不兼容類型的指針訪問變量
3.9 EXP40-C. 不要修改常量對象
3.10 EXP42-C. 不要比較填充數據
3.11 EXP43-C. 使用restrict限定的指針時避免未定義行為
3.12 EXP44-C. 不要嚮sizeof、_Alignof或者_Generic傳遞有副作用的操作數
3.13 EXP45-C. 不要在選擇語句中執行賦值
第4章 整數(INT)
4.1 INT30-C. 確保無符號整數運算不産生迴繞
4.2 INT31-C. 確保整數轉換不會造成數據丟失或者錯誤解釋
4.3 INT32-C. 確保有符號整數的運算不造成溢齣
4.4 INT33-C. 確保除法和餘數運算不會造成0除數錯誤
4.5 INT34-C. 不要用負數或者不小於操作數位數的位數對錶達式進行移位
4.6 INT35-C. 使用正確的整數精度
4.7 INT36-C. 將指針轉換為整數或者將整數轉換為指針
第5章 浮點數(FLP)
5.1 FLP30-C. 不要使用浮點變量作為循環計數器
5.2 FLP32-C. 避免或者檢測數學函數中的定義域和值域錯誤
5.3 FLP34-C. 確保浮點數轉換在新類型的範圍內
5.4 FLP36-C. 將整數值轉換為浮點指針類型時保持精度
第6章 數組(ARR)
6.1 ARR30-C. 不要形成或者使用超限的指針或者數組下標
6.2 ARR32-C. 確保變長數組的大小參數在有效範圍內
6.3 ARR36-C. 不要進行兩個不引用相同數組的指針之間的減法或者比較
6.4 ARR37-C. 不要在指嚮非數組對象的指針上加或者減一個整數
6.5 ARR38-C. 保證庫函數不形成無效指針
6.6 ARR39-C. 不要在指針上加或者減一個按比例調整的整數
第7章 字符和字符串(STR)
7.1 STR30-C. 不要企圖修改字符串字麵量
7.2 STR31-C. 保證字符串存儲有足夠的空間容納字符數據和null結束符
7.3 STR32-C. 不要嚮要求字符串參數的庫函數傳遞非null結束字符序列
7.4 STR34-C. 在轉換為更大的整數尺寸之前將字符轉換為unsigned char類型
7.5 STR37-C. 字符串處理函數的實參必須可以錶示為unsigned char
7.6 STR38-C. 不要混淆窄和寬字符串及函數
第8章 內存管理(MEM)
8.1 MEM30-C. 不要訪問已釋放內存
8.2 MEM31-C. 在不再需要時釋放動態分配的內存
8.3 MEM33-C. 動態分配和復製包含靈活數組成員的結構
8.4 MEM34-C. 隻釋放動態分配的內存
8.5 MEM35-C. 為對象分配足夠的內存
8.6 MEM36-C. 不要通過調用realloc()修改對象的對齊方式
第9章 輸入/輸齣(FIO)
9.1 FIO30-C. 從格式字符串中排除用戶輸入
9.2 FIO31-C. 不要打開已經打開的文件
9.3 FIO32-C. 不要在隻適閤文件的設備上執行操作
9.4 FIO34-C. 區分從文件讀入的字符和EOF/WEOF
9.5 FIO37-C. 不要假定fgets()或者fgetws()在成功時返迴非空字符串
9.6 FIO38-C. 不要復製FILE對象
9.7 FIO39-C. 不要在沒有中間刷新或者定位調用的情況下在一個流中交替輸入和輸齣
9.8 FIO40-C. 在fgets()或者fgetws()失敗時重置字符串
9.9 FIO41-C. 不要用有副作用的流作為實參調用getc()、putc()、getwc()或者putwc()
9.10 FIO42-C. 在不再需要時關閉文件
9.11 FIO44-C. 對fsetpos()隻使用fgetpos()返迴的值
9.12 FIO45-C. 避免訪問文件時齣現TOCTOU競爭條件
9.13 FIO46-C. 不要訪問已關閉文件
9.14 FIO47-C. 使用有效格式字符串
第10章 環境(ENV)
10.1 ENV30-C. 不要修改某些函數返迴值引用的對象
10.2 ENV31-C. 在可能使某個環境指針無效的操作之後不要依賴該指針
10.3 ENV32-C. 所有退齣處理程序必須正常返迴
10.4 ENV33-C. 不要調用system()
10.5 ENV34-C. 不要保存某些函數返迴的指針
第11章 信號(SIG)
11.1 SIG30-C. 在信號處理程序中隻調用異步安全函數
11.2 SIG31-C. 不在信號處理程序中訪問共享對象
11.3 SIG34-C. 不在可中斷的信號處理程序中調用signal()
11.4 SIG35-C. 不從計算性異常信號處理程序中返迴
第12章 錯誤處理(ERR)
12.1 ERR30-C. 在調用已知設置errno的庫函數之前,將errno設置為0,隻在函數返迴錶示故障的值之後纔檢查errno
12.2 ERR32-C. 不要依賴不確定的errno值
12.3 ERR33-C. 檢測並處理標準庫錯誤
第13章 並發性(CON)
13.1 CON30-C. 清理綫程特定存儲
13.2 CON31-C. 不要在互斥體被鎖定時刪除它們
13.3 CON32-C. 從多個綫程訪問位域時避免數據競爭
13.4 CON33-C. 使用庫函數時避免競爭條件
13.5 CON34-C. 用正確的存儲持續期聲明綫程間共享的對象
13.6 CON35-C. 以預定義順序加鎖,避免死鎖
13.7 CON36-C. 將可能不閤邏輯地喚醒的函數包裝在一個循環中
13.8 CON37-C. 不要在多綫程程序中調用signal()
13.9 CON38-C. 使用條件變量時保持綫程安全性和活性
13.10 CON39-C. 不要加入或者斷開之前已經加入或者斷開的綫程
13.11 CON40-C. 不要在一個錶達式中兩次引用同一個原子變量
13.12 CON41-C. 將可能不閤邏輯地失敗的函數包裝在一個循環中
第14章 雜項(MSC)
14.1 MSC30-C. 不要使用rand()函數生成僞隨機數
14.2 MSC32-C. 正確地設置僞隨機數生成器的種子
14.3 MSC33-C. 不要嚮asctime()函數傳遞無效的數據
14.4 MSC37-C. 確保控製永遠不會到達非void函數的結束位置
14.5 MSC38-C. 如果預定義標識符隻能以宏的形式實現,不要將其當作對象處理
14.6 MSC39-C. 不要在va_list的值不確定時調用va_arg()
14.7 MSC40-C. 不要違反約束
附錄A 詞匯錶
附錄B 未定義行為
附錄C 未指定行為
參考文獻
· · · · · · (
收起)