電子書籍の厳選無料作品が豊富!

お世話になっております。
現在、Windows XP、VC++2005 にてプログラム中なのですが、
「strcpy()」についてです。

本ライブラリはセキュリティ強化のため「strcpy_s()」の使用を
奨励されていますが、箇所が多いので取り合えずWarningだけでも
取りたいと思っています。

--
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
charszBuf[10];
strcpy( szBuf, "test" );

return 0;
}
--

というサンプルコードに対して

warning C4996: 'strcpy' が古い形式として宣言されました。
'strcpy' の宣言を確認してください。
'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

と出たので、ファイルの先頭に

#define_CRT_SECURE_NO_DEPRECATE

と加えたのですがWarningが取れません。
同様に

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

としても駄目でした。

他に何か必要なことはあるのでしょうか?
#pragmaは出来るだけ避けたいのですが。

以上、よろしくお願い致します。

A 回答 (3件)

stdafx.hがあるならstdafx.hに


#define _CRT_SECURE_NO_DEPRECATE
を記述されたら良いと思います

この回答への補足

ありがとうございます。

stdafx.h とか、いろいろと場所を変えて挿入してみたのですが、
最初はうまく行かなかったんですよ。

だけど、海外の教えてサイトを読んで、stdafx.h の #pragma の下に入れて、
「リビルド」すればいいみたいなことが書いてあったので、
やってみたらうまく行きました。

なんでだろ~???

補足日時:2008/05/21 13:52
    • good
    • 0

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1


を stdafx.hの stdio.hをインクリュードする前に定義してみてください

strcpyなどを strcpy_sとしてコンパイルしてくれますよ

この回答への補足

ありがとうございます。

最終的にはそのようにするつもりでしたが、どんな感じかな~
と試してる時にどうにもコンパイルが通らなかったので質問を
いたした次第でして・・・

それでもやっぱり ANo.2 と同様な疑問が起きます。

まあ、strcpy() でも strcpy_s() でも、バッファのチェックぐらい
コールの前にやってなきゃいけないのでしょうがね。

それに strcpy_s() に変えてエラーになっちゃったとしても、
現状ではどうにもならない作りになってますし。

補足日時:2008/05/21 14:04
    • good
    • 0

#defineで置換してしまえばいいのでは ・・・



#define strcpy(x,y) strcpy_s((x),(y))
といった具合で

この回答への補足

追加で質問なのですが、その場合だと"x"のバッファサイズは
チェックされているのでしょうか?

例えば、質問で書いた記述ならsizeof()で10だと分かりますが、
new とかで領域を確保してそのアドレスを渡しちゃうとstrcpy_s()の中だけでは
"x"のサイズは分からないですよね?

ヘルプにも、動的に確保した時は手作業で修正してね、
みたいな記述がありましたが、やっぱりそうしないと駄目なんでしょうかね?

char szBuf[10];
strcpy( szBuf, "test" );

だろうが、

char *szBuf;
szBuf = new char[10];
strcpy( szBuf, "test" );

だろうが、中で行われる処理が同じなら機械的に置換してやれば
いいのですが・・・

補足日時:2008/05/21 13:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!