- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 286字
- 2020-10-30 17:56:38
2.2.2 差一錯誤
空字符結尾的字符串的另一個常見問題是差一錯誤(off-by-one error)。差一錯誤與無界字符串復制有相似之處,即都涉及對數組的越界寫問題。下列程序在微軟Visual C++2010的/W4警告級別上完全可以編譯和鏈接,并且在Windows 7上運行時也不報錯,但它包含了幾個差一錯誤。你能找出這個程序中所有的差一錯誤嗎?
01 #include <string.h> 02 #include <stdio.h> 03 #include <stdlib.h> 04 05 int main(void) { 06 char s1[] = "012345678"; 07 char s2[] = "0123456789"; 08 char *dest; 09 int i; 10 11 strcpy_s(s1, sizeof(s2), s2); 12 dest = (char *)malloc(strlen(s1)); 13 for (i=1; i <= 11; i++) { 14 dest[i] = s1[i]; 15 } 16 dest[i] = '\0'; 17 printf("dest = %s", dest); 18 /* ... */; 19 }
這些錯誤中,很多都是新手易犯的錯誤,但經驗豐富的程序員也可能犯同樣的錯誤,很容易開發出并部署類似于這個例子的程序,因為它在大多數系統上都可以順利通過編譯并且運行時也不報錯。
推薦閱讀
- Visual Basic .NET程序設計(第3版)
- Spring 5企業級開發實戰
- 自制編譯器
- Monkey Game Development:Beginner's Guide
- LabVIEW入門與實戰開發100例
- Learning C++ Functional Programming
- 技術領導力:程序員如何才能帶團隊
- PyTorch Artificial Intelligence Fundamentals
- Julia機器學習核心編程:人人可用的高性能科學計算
- 單片機應用技術
- HTML5入門經典
- C++面向對象程序設計習題解答與上機指導(第三版)
- 區塊鏈技術進階與實戰(第2版)
- Spring+Spring MVC+MyBatis從零開始學
- 零基礎學C語言第2版