sprintfはなぜ安全上の危険性があるのか
まずコードを見てみましょう
以上のプログラムをコンパイルして実行すると、出力が印刷されます.
しかし、プログラムを
再コンパイル実行すると、プログラムは正常にコンパイルできますが、プログラムを実行するとプログラムが終了し、エラーが発生します.
したがってsprintfセキュリティ改良版snprintf関数の使用を推奨します.
上の例に続く
#include
int main()
{
char buf[12] = {0};
char *str = "ab";
sprintf(buf, "hello :%s
", str);
printf("%s
", buf);
return 0;
}
以上のプログラムをコンパイルして実行すると、出力が印刷されます.
hello :ab
しかし、プログラムを
#include
int main()
{
char buf[12] = {0};
char *str = "abcdefgh";
sprintf(buf, "hello :%s
", str);
printf("%s
", buf);
return 0;
}
再コンパイル実行すると、プログラムは正常にコンパイルできますが、プログラムを実行するとプログラムが終了し、エラーが発生します.
Abort trap: 6
はsprintf関数にセキュリティ上の危険性があることを示しており、プログラムを作成するとstr変数が異なる内容を保存する可能性があり、上記のセキュリティ上の危険性が大きい可能性があります.したがってsprintfセキュリティ改良版snprintf関数の使用を推奨します.
上の例に続く
#include
int main()
{
char buf[12] = {0};
char *str = "abcdefgh";
snprintf(buf, sizeof(buf), "hello :%s
", str);
printf("%s
", buf);
return 0;
}
パラメータについて します.1 はターゲット 、2 のターゲット の さ、3 は の です.
はどこに れていますか?2 のパラメータ.
する の さがターゲット の さより きい 、ターゲット の さ-1の さの のみが され、 に0 の が されます.したがってstr をどのように しても、snprintfを すると、プログラムが に することを し、クラッシュ することなくプログラムの を させることができます.
sprintfソースコードの については、さらに する があります.