- ベストアンサー
_CRT_SECURE_NO_DEPRECATE が効かない?
お世話になっております。 現在、Windows XP、VC++2005 にてプログラム中なのですが、 「strcpy()」についてです。 本ライブラリはセキュリティ強化のため「strcpy_s()」の使用を 奨励されていますが、箇所が多いので取り合えずWarningだけでも 取りたいと思っています。 -- #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char szBuf[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は出来るだけ避けたいのですが。 以上、よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
stdafx.hがあるならstdafx.hに #define _CRT_SECURE_NO_DEPRECATE を記述されたら良いと思います
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 を stdafx.hの stdio.hをインクリュードする前に定義してみてください strcpyなどを strcpy_sとしてコンパイルしてくれますよ
補足
ありがとうございます。 最終的にはそのようにするつもりでしたが、どんな感じかな~ と試してる時にどうにもコンパイルが通らなかったので質問を いたした次第でして・・・ それでもやっぱり ANo.2 と同様な疑問が起きます。 まあ、strcpy() でも strcpy_s() でも、バッファのチェックぐらい コールの前にやってなきゃいけないのでしょうがね。 それに strcpy_s() に変えてエラーになっちゃったとしても、 現状ではどうにもならない作りになってますし。
- redfox63
- ベストアンサー率71% (1325/1856)
#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" ); だろうが、中で行われる処理が同じなら機械的に置換してやれば いいのですが・・・
補足
ありがとうございます。 stdafx.h とか、いろいろと場所を変えて挿入してみたのですが、 最初はうまく行かなかったんですよ。 だけど、海外の教えてサイトを読んで、stdafx.h の #pragma の下に入れて、 「リビルド」すればいいみたいなことが書いてあったので、 やってみたらうまく行きました。 なんでだろ~???