一、緩衝區溢出,使用不安全的函數
例如strcpy、sprintf、strcat、scanf等
應換用更安全的函數或者判斷傳入參數的大小,防止超過緩衝區大小。
strcpy()可改用strncpy(),並在最後添加0結尾符;sprintf()可改用snprintf();strcat()可改用strncat();scanf()可改用scanf_s()
二、處理問題時出錯
- 未檢查返回值的情況下調用函數
- 將負值用作了期望正值的函數的參數.
三、錯誤的表達式
- 可能除零
- .錯誤的sizeof()
-
S2IDString tIDString; memset(&tIDString,0,sizeof(SIDString));
-
- 複製錯誤。
Jint32 baseDirIndex = baseDirStr.find('/'); if(baseDirIndex!=-1) { baseDirStr = baseDirStr.mid(baseDirStr.find('/')+1); } else { baseDirStr = QString::null; } Jint32 currentIndex = currentDirStr.find('/'); if(currentIndex!=-1) { currentDirStr = currentDirStr.mid(currentDirStr.find('/')+1); } else { baseDirStr = QString::null; }
- 條件是多餘的,無論結果如何,執行的代碼相同
-
if(pTermStruct == G_NULL) { return 1; } return 1 ;
-
四、控制流問題
無法到達的語句:不帶符號的值判斷>0,值永遠爲true
五、內存泄漏
- 非法訪問
strlen:將不以 null 終止的字符緩衝區傳遞給了期望獲得以 null 終止的字符串的函數
strncpy:大小應減1,並結尾加0
- 內存泄漏
針對標量或使用 new[] 分配的指針數組使用了非數組刪除
六、初始化
- 非void函數需要有返回值
- 變量使用前未初始化
- 標量字段未被構造函數初始化
非靜態類成員,在此構造函數或其調用的任何函數中未初始化
七、API使用錯誤
- 使用 va_start 或 va_copy 來開始處理;未使用 va_end 來結束
- 參數過多或過少,例如:未使用,但卻傳入了參數。
-
sprintf(tmpBuf, "YVal", ProcTime.GetMonth()); sql.Format("SELECT %s, %s FROM ",sHours[0]);
-
- 格式轉換不兼容,例如%d,期望"int",但傳入參數爲"unsigned long";%s期望"char *",但傳入"QString"
- 源緩衝區可能與目標緩衝區重疊,這會導致 "memcpy" 的未定義行爲
-
memcpy(chPos, chPos+2, sizeof(char)*(strlen(i_pData->szBJName) - nPos-2)); memset(chPos+strlen(chPos)-2, 0, sizeof(char)*2);
-
八、明文存儲密碼