セキュアなプログラムでは、ユーザー入力からのオーバーフローを防ぐのがかなり大切なことかな。と思います。
テストプログラムです。
C
1#include<stdio.h> 2#include<stdlib.h> 3#include<string.h> 4 5int main(){ 6 int num; 7 char **ptr; 8 9 printf("文字列は何個 : "); 10 scanf("%d", &num); 11 12 ptr = (char **)calloc(num, sizeof(char *)); 13 14 if(ptr == NULL) 15 puts("calloc error!!"); 16 else{ 17 int i; 18 19 for(i = 0; i < num; i++){ 20 char temp[128]; 21 22 printf("ptr[%d] :", i); 23 //if(fgets(temp, 128, stdin) == NULL) 24 // goto FREE; 25 scanf("%127s%*[^\n]%*c", temp); 26 27 ptr[i] = (char *)calloc(strlen(temp) + 1, sizeof(char)); 28 29 if(ptr[i] == NULL){ 30 puts("Error to calloc Second stage"); 31 goto FREE; 32 } else { 33 strncpy(ptr[i], temp, strlen(temp) + 1); 34 } 35 } 36 37 putchar('\n'); 38 for(i = 0; i < num; i++) 39 printf("ptr[%d] : %s\n", i, ptr[i]); 40 41FREE: 42 for(i = 0; i < num; i++) 43 free(ptr[i]); 44 free(ptr); 45 } 46 47 return 0; 48} 49
こちらはscanf()でオーバーフローを防いでいます。
正常に動作しオーバーフローは起きません。
[迷信] scanf ではバッファオーバーランを防げない
データの読み込み(scanf関数)
今回の場合、scanf()が複数回実行されるので、stdinバッファ内に文字列を残さないようにしています。
ここからが本題です。
scanf()の他にfgets関数を使う方法があります。
標準入力から安全に文字列を受け取る方法いろいろ
コメントの方にも書かれているのですが、
C
1fgets(temp, 128, stdin);
こちらを使うと表示が崩れます。
文字列は何個 : 2
ptr[0] :ptr[1] :fhdklafuadsf
ptr[0] :
ptr[1] : fhdklafuadsf
このように、標準出力が崩れてしまいます。
なぜでしょうか?
どうすれば解決できますか?
いろいろ試してみたのですが、どうもうまくいきません。
fgets()は入力の処理をしているのになぜ出力の方に影響が出ているんですか??
おまけに1回しか入力を受け付けていないという困った現象まで起きています。
あ、ちなみに、オーバーフローの方は防げているようです。
それと、scanf(), fgets() 以外にユーザー入力からのオーバーフローを防げる関数ってあるんですか?
(scanf_s()以外)
Linux 64bit gccです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/04 17:07
2017/12/04 17:35
2017/12/05 02:01
2017/12/05 04:26
2017/12/05 04:31
2017/12/05 11:14
2017/12/05 11:15