sprintfはなぜ安全上の危険性があるのか


まずコードを見てみましょう
#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ソースコードの については、さらに する があります.