首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C/C++ memcmp 參數長度檢查必要性解析

     編輯:程式設計疑難解答

函數原型

int memcmp(const void *buf1, const void *buf2, size_t count);

核心結論

必須在調用前確保 count 不超過兩塊內存的實際可訪問長度。memcmp 內部不會檢查邊界,會嚴格按 count 逐字節比較,越界訪問導致未定義行為(崩潰、讀取垃圾數據、安全漏洞)。

風險場景

  • buf1 長度 10,buf2 長度 100,傳 count=50 → 讀取 buf1 後 40 字節越界。
  • 結構體數組比較,結構體含填充字節,邏輯長度計算錯誤導致越界。
  • 網絡數據包解析,長度字段被篡改為巨大值,引發 DoS。

防禦性編程模式

// 安全封裝
int safe_memcmp(const void *a, size_t len_a, const void *b, size_t len_b, size_t count) {
    if (count > len_a || count > len_b) {
        // 記錄錯誤、返回特定錯誤碼、或截斷 count
        return -2;  // 自定義:長度不足
    }
    return memcmp(a, b, count);
}

// 或調用前斷言
assert(count <= strlen(buf1) && count <= strlen(buf2));  // 僅適用字符串
assert(count <= sizeof(buf1) && count <= sizeof(buf2));  // 僅適用定長數組

替代方案

  • 字符串比較:用 strncmp(遇 \0 停止)或 strcmp,天然受長度限制。
  • C++:用 std::string_view、std::vector、std::span(C++20)攜帶長度信息,編譯期/運行期更安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved