作者 主題: 超過緩衝區大小而不會發生錯誤?  (閱讀 3713 次)

0 會員 與 1 訪客 正在閱讀本文。

iopklmm

  • 懷疑的國中生
  • **
  • 文章數: 71
    • 檢視個人資料
超過緩衝區大小而不會發生錯誤?
« 於: 2013-09-27 21:58 »
請問各位一下

scanf 用的 buffer 我設為 char buf[5] 大小應該只能放四個字元跟\0 ,為什麼我鍵盤輸入像是 123 456 789 他還是可以執行而不會發生錯誤

謝謝

#include <stdio.h>
#include <stdlib.h>

void read_str();

int main(){
   read_str();
   system("pause");
   return 0;
}
void read_str(){

   char buf[5] = {};
   scanf("%[^\n]",buf);
   printf("%d\n",strlen(buf));
   printf("%s\n",buf);
}


Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: 超過緩衝區大小而不會發生錯誤?
« 回覆 #1 於: 2013-09-28 11:20 »
請問各位一下

scanf 用的 buffer 我設為 char buf[5] 大小應該只能放四個字元跟\0 ,為什麼我鍵盤輸入像是 123 456 789 他還是可以執行而不會發生錯誤

謝謝

#include <stdio.h>
#include <stdlib.h>

void read_str();

int main(){
   read_str();
   system("pause");
   return 0;
}
void read_str(){

   char buf[5] = {};
   scanf("%[^\n]",buf);
   printf("%d\n",strlen(buf));
   printf("%s\n",buf);
}

看運氣吧,陣列後面剛好沒東西就沒問題
如果後面有東西,那就掛了~~

代碼: [選擇]
$ ./scanf
1234567
7, 1234567
$ ./scanf
123456789
9, 123456789
*** stack smashing detected ***: ./scanf terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f5cedeca817]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x0)[0x7f5cedeca7e0]
./scanf[0x4007ed]
./scanf[0x400659]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7f5cedde176d]
./scanf[0x400691]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:16 1032                               scanf
...........
7fffbf310000-7fffbf311000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted
$

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: 超過緩衝區大小而不會發生錯誤?
« 回覆 #2 於: 2013-09-28 21:12 »
因為 c/c++ 的標準裡頭不會檢查 buffer 長度.
以低階系統處理的角度來看, 這是優點. 以高階程式語言來看,  這算是缺點.

zelda

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
Re: 超過緩衝區大小而不會發生錯誤?
« 回覆 #3 於: 2013-10-17 20:07 »
因為 c/c++ 的標準裡頭不會檢查 buffer 長度.
以低階系統處理的角度來看, 這是優點. 以高階程式語言來看,  這算是缺點.
何以是優點?
我只看得見缺點
請大大解惑,謝謝

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: 超過緩衝區大小而不會發生錯誤?
« 回覆 #4 於: 2013-10-21 10:07 »
以近代的作業系統來說, 用到的機會不大.
以前的很多環境 (其實現在應該也都還有, 只是不是一般人用的), 有些功能可以直接修改某些固定位址的資料來達成.
用  C 可以很簡單的就處理 (指標指過去後, 不會管你那個空間有多大, 可以直接改).

如果用不到, 當成缺點也可以.

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
Re: 超過緩衝區大小而不會發生錯誤?
« 回覆 #5 於: 2013-10-21 11:14 »
以近代的作業系統來說, 用到的機會不大.
以前的很多環境 (其實現在應該也都還有, 只是不是一般人用的), 有些功能可以直接修改某些固定位址的資料來達成.
用  C 可以很簡單的就處理 (指標指過去後, 不會管你那個空間有多大, 可以直接改).

如果用不到, 當成缺點也可以.

說到這個,以前最常用到的大概就是顯示記憶體的存取(dos時代)
將指標指定到顯示記憶體開頭,然後就可以在螢幕上為所欲為了  :D