strcpy関数でのエラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
宗一郎

strcpy関数でのエラーについて

#1

投稿記事 by 宗一郎 » 14年前

いつもお世話になっております。

さっそくですみませんが、標準関数のstrcpyを用いた多重継承のサンプルを実行したら、
以下のようなエラーメッセージが出ました。いちおう実行結果にも問題なく実行できましたが、
今後のことも考えて質問させていただきました。
どうかよろしくお願いしますm(_ _)m

【環境】Visual C++ 2008 Express Edition

========================================================================================
エラーメッセージ
========================================================================================
warning C4996: 'strcpy': This function or variable may be unsafe.
Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
See online help for details.

'strcpy' の宣言を確認してください。
========================================================================================
このようなメッセージがstrcpyの数だけ出ました。

========================================================================================
プログラム
========================================================================================
#include <iostream>
#include <string.h>
using namespace std;

class A
{
protected:
char str[64];
public:
A();
};

class B
{
protected:
char str[64];
public:
B();
};

class C : public A, public B
{
char str[64];
public:
C();
void show(void);
};

A::A()
{
strcpy(str, "classA\n");
}

B::B()
{
strcpy(str, "classB\n");
}

C::C()
{
strcpy(str, "classC\n");
}

void C::show()
{
cout << str;
cout << A::str;
cout << B::str;
return;
}

int main()
{
C test;
test.show();

return 0;
}
========================================================================================

preタグ、/preタグでプログラムを囲んだら、ものすごく空白と改行が増えました><

たかぎ

Re:strcpy関数でのエラーについて

#2

投稿記事 by たかぎ » 14年前

> warning C4996: 'strcpy': This function or variable may be unsafe.

これはエラーメッセージではありません。単なる警告です。

宗一郎

Re:strcpy関数でのエラーについて

#3

投稿記事 by 宗一郎 » 14年前

さっそくの回答ありがとうございます^^

strcpy 警告 でググッてみたら解決策が出てきました。

VC++2005でCRT関数にセキュリティ強化された関数が追加された為。
つまり、strcpy関数 -> strcpy_s関数にバージョンアップされた。

解決方:
strcpyをstrcpy_sに置き換える

という認識でよろしいでしょうか?
お教えいただければ助かります。

たかぎ

Re:strcpy関数でのエラーについて

#4

投稿記事 by たかぎ » 14年前

strcpy_sを使えば互換性を捨てることになります。
また、strcpyをstrcpy_sに変えれば、無条件に安全になるわけでもありません。

この警告がうるさいので消したいだけであれば、特に理由がないかぎり、std::stringを使うようにしましょう。
そのほうがずっと簡単で安全になります。

ゆーずぃ

Re:strcpy関数でのエラーについて

#5

投稿記事 by ゆーずぃ » 14年前

これはマイクロソフトが「その関数は危険なことになる可能性を秘めてるよ!うちで開発した関数の方が安全だから是非使ってね!」っていう宣伝ですから、普段出る警告とは意味合いが少し異なるかもしれませんね。

宗一郎

Re:strcpy関数でのエラーについて

#6

投稿記事 by 宗一郎 » 14年前

回答ありがとうございます^^

このまま使っていたらどのようなエラーが起こりうるのか調べていましたが、
見当たりませんでした。

なので、すみませんがstd::stringを使っていたらどのような危険性があるか、
お教えしていただけないでしょうか?

よろしくお願いしますm(_ _)m

宗一郎

Re:strcpy関数でのエラーについて

#7

投稿記事 by 宗一郎 » 14年前

検索の単語を変えてもう一度調べなおしてみたら、

http://konuma.txt-nifty.com/blog/2006/0 ... _53c9.html
http://konuma.txt-nifty.com/blog/2005/1 ... _2411.html

のようなブログがあっさり見つかりました。

今後は自分でできるかぎり調べてから質問します。失礼しましたm(_ _)m


たかぎさん、ゆーずぃさん
回答ありがとうございました^^

ISLe

Re:strcpy関数でのエラーについて

#8

投稿記事 by ISLe » 14年前

警告メッセージの中にありますが、
ソースファイルの先頭に
#define _CRT_SECURE_NO_WARNINGS
と書いておくと警告を黙らせることができます。

閉鎖

“C言語何でも質問掲示板” へ戻る