
お世話になっております。
現在、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は出来るだけ避けたいのですが。
以上、よろしくお願い致します。
No.3
- 回答日時:
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
を stdafx.hの stdio.hをインクリュードする前に定義してみてください
strcpyなどを strcpy_sとしてコンパイルしてくれますよ
この回答への補足
ありがとうございます。
最終的にはそのようにするつもりでしたが、どんな感じかな~
と試してる時にどうにもコンパイルが通らなかったので質問を
いたした次第でして・・・
それでもやっぱり ANo.2 と同様な疑問が起きます。
まあ、strcpy() でも strcpy_s() でも、バッファのチェックぐらい
コールの前にやってなきゃいけないのでしょうがね。
それに strcpy_s() に変えてエラーになっちゃったとしても、
現状ではどうにもならない作りになってますし。
No.2
- 回答日時:
#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" );
だろうが、中で行われる処理が同じなら機械的に置換してやれば
いいのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++のvirtual関数および継承に...
-
_tcscat がうまくいきません(V...
-
opencvを使って画像比較
-
C++で大量のエラーが出る
-
std::wstringのメモリリークに...
-
gccでコンパイル時のエラー
-
#defineの使い方について
-
constexprについて
-
DLLでダイアログ
-
標準の例外の全種類と、発生す...
-
enumの値から定義名を文字列化...
-
wstringの主力
-
iostream インクルード時に発生...
-
構造体配列のvectorへの変換と...
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
20'(角度)の計算がわかりま...
-
プログラミング C言語 課題でプ...
-
#if 1 #elseの意味について
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
switch文のエラーについて
-
enumの値から定義名を文字列化...
-
【C++】ヘッダ内でstringを格納...
-
なぜ、C++の標準ヘッダをインク...
-
gccでコンパイル時のエラー
-
C++でShowCursorを使いたい。
-
#defineの使い方について
-
VxWorks 6.4ソケット接続につい...
-
空ENTERの判別
-
OpenCVでRAW画像(カラー)を開...
-
CStringとString
-
途中からMFCを使用したい
-
snprintfが使用できない。
-
_tcscat がうまくいきません(V...
-
#define中の#のエスケープ
-
リモートデスクトップの接続元I...
-
C++での <iostream.h>と<iostre...
-
C++ 数値データファイルから2次...
-
コーディング
おすすめ情報