質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

39851閲覧

VC++でのsprintfのエラーについて

takesita8

総合スコア11

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/08/06 02:40

###前提・実現したいこと
文字列を扱う関数を呼ぶだけのプログラムを作成して実行すると、
以下のようなエラーメッセージが発生してしまいます。

実行結果は
f(1,2)=4
f(182,144)=508

と出るはずですが、
なぜエラーが出るのかわかりません。言語はVC++です。

###発生している問題・エラーメッセージ
error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

###該当のソースコード
#include <iostream>
#include <cstdio>

using namespace std;

int f(int x, int y){
return 2 * x + y;
}

void Show(int x, int y){
char str[50];

sprintf(str, "f(%d,%d)=%d", x, y, f(x, y)); cout << str << endl;

}

int main(){
Show(1, 2);
Show(182, 144);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flied_onion

2016/08/06 02:53

コード部分は ``` で括ってください。(またはコードを選択した </> ボタン)
guest

回答1

0

ベストアンサー

sprintfにはバッファオーバーランの脆弱性があります。
今回で言えばsprintfでstrの内容を書き換えるわけですが、書き換える内容がstrのサイズとあっているかチェックしないので、strに収まるサイズ(50)以上の文字を入れようとしたときに他のメモリを壊す恐れがある。といった問題です。悪用されると大変です。

そんなわけでVC++ではsprintfは使わないでMSが用意した sprintf_s使ってね、
どうしてもつかいたいなら _CRT_SECURE_NO_WARNINGS に値を指定して セキュリティ警告ださないでと指定してね
といったエラーを出します。

sprintf_s の使い方は第二引数に第一引数のサイズを書くだけです(たしか、遠い記憶なのでちがったらごめんなさい)。

今回はstrを50としていますので、

sprintf_s(str, 50, "f(%d,%d)=%d", x, y, f(x, y));

とすればよかったと思います。
書き換える場合は前述の

初期の言語習得段階で自分しか見ないコードあれば、その書き換えに苦慮して挫折するより一旦警告を無視するようにしてもいいのかな(何が問題かはサンプルが動いてから調べる前提です)とも思います。
以下は一応警告を無視する場合に使う定義(書き換える場合は必要ありません)

c

1#define _CRT_SECURE_NO_WARNINGS 1

投稿2016/08/06 03:13

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問