C/C++ 程式的常見陷阱與範例

本篇 ShengYu 介紹 C/C++ 程式的常見陷阱與範例,C/C++ 寫程式時有許多常見的陷阱,以下是一些 C/C++ 常見陷阱的範例,同時也會說明如何避免與一些使用建議。

以下介紹 C/C++ 程式的常見陷阱分為,

  • 空指針(Null Pointers)陷阱
  • 記憶體洩漏(Memory Leaks)陷阱
  • 緩衝區溢出(Buffer Overflow)陷阱
  • 未檢查的輸入(Unchecked Input)陷阱
  • 未處理的異常(Unhandled Exceptions)陷阱

空指針(Null Pointers)陷阱

誤用空指針的話將會讓程式crash崩潰,以下為空指針的範例程式碼,

1
2
int* ptr = nullptr;
*ptr = 5; // 將導致crash,因為ptr是空指針

如何避免:在使用指針之前,確保它們不是空指針。

未初始化的指針或指向無效記憶體的指針可能導致程式崩潰。務必在使用指針之前進行初始化,並謹慎檢查指針是否為NULL,修正空指針陷阱後的程式碼如下,

1
2
3
4
int* ptr = nullptr;
if (ptr != nullptr) {
*ptr = 5; // 不會crash
}

要確保在使用指針之前檢查它們是否為空指針。

記憶體洩漏(Memory Leaks)陷阱

以下為記憶體洩漏的範例程式碼,

1
2
int* data = new int[10];
// 忘記釋放記憶體

如何避免:使用delete[]來釋放動態分配的記憶體。

忘記釋放動態分配的記憶體可能導致記憶體洩漏。使用newdelete(C++程式)或mallocfree(C程式)時,確保釋放記憶體,修正記憶體洩漏後的程式碼如下,

1
2
3
int* data = new int[10];
// 使用 data
delete[] data; // 釋放記憶體

使用new後記得使用delete[]來釋放動態分配的記憶體,以避免記憶體洩漏。

緩衝區溢出(Buffer Overflow)陷阱

以下為緩衝區溢出的範例程式碼,

1
2
char buffer[10];
strcpy(buffer, "This is a long string that overflows the buffer");

如何避免:使用strncpy等函數,或者使用std::string(C++)來處理字串,以確保不會超出緩衝區。

對陣列或緩衝區進行寫入時,超出其邊界可能導致不安全的程式行為。使用標準函數(例如strncpy而不是strcpy)或容器類型(例如std::vector)以避免此問題,修正緩衝區溢出後的程式碼如下,

1
2
char buffer[100];
strncpy(buffer, "This is a long string that won't overflow the buffer", sizeof(buffer));

使用strncpy,並確保不會超出緩衝區的大小。

未檢查的輸入(Unchecked Input)陷阱

以下為未檢查的輸入的範例程式碼,

1
2
3
char query[100];
cin >> query;
// 未驗證用戶輸入,可能受到SQL注入攻擊

如何避免:使用參數化查詢或驗證用戶輸入,以避免安全問題。

未驗證用戶輸入可能導致安全問題,如SQL注入或格式化字串攻擊。始終驗證和過濾用戶輸入,並使用參數化查詢來防止SQL注入,修正未檢查的輸入後的程式碼如下,

1
2
3
char query[100];
cin.getline(query, sizeof(query));
// 驗證用戶輸入,以避免安全問題

使用cin.getline等函數來讀取和驗證用戶輸入,以確保安全性。

未處理的異常(Unhandled Exceptions)陷阱

以下為未處理的異常的範例程式碼,

1
2
3
4
5
try {
// ...
} catch (std::exception& e) {
// 未處理異常
}

如何避免:確保捕獲並處理異常,或者將它們向上拋出以便在適當的地方處理。

處理異常可能導致程式崩潰。使用try-catch區塊來捕獲異常並處理它們,以確保程式的穩定性,修正未處理的異常後的程式碼如下,

1
2
3
4
5
try {
// ...
} catch (std::exception& e) {
// 處理異常,例如日誌記錄或回報錯誤
}

確保捕獲並處理異常,以確保程式的穩定性。

以上就是 C/C++ 程式的常見陷阱與範例介紹,這些範例展示了 C/C++ 中的一些常見陷阱,以及如何避免它們。要寫出更健壯和安全的程式,需要謹慎處理這些問題,以確保程式碼的正確性和可靠性。
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ fopen 用法與範例
C/C++ fread 用法與範例
C/C++ fgets 用法與範例
C/C++ fputs 用法與範例
C/C++ fclose 用法與範例