Visual Studio 2005: warning C4996

Warning C4996を非表示にする方法を調べました。

理由はセキュリティ上の都合

Liquid のコンパイルしていたときに warning C4996 というのが大量に出てきた。

最初のころは、エラーではないから飛ばしておこうと思っていたのですが、 量があるだけに邪魔に感じてきました(笑

そこで一時だけだけでも非表示にできないかネットで調べてみたら、解決策が載っていました。

こういうときって、とりあえずは MSDN で調べればいいのかな。
いまいち、どこで調べていけばいいのかがよくわからない(笑

CRT のセキュリティは大幅に強化されています。多くの CRT 関数にセキュリティが強化されたバージョンができました。セキュリティが強化された新しい関数が存在する場合、セキュリティが弱い古いバージョンは推奨されないバージョンとしてマークされ、新しいバージョンには _s ("secure") のサフィックスが付いています。

セキュリティ上の都合でってことですよね。

ここで、"推奨されない" ということは、その関数が CRT から削除される予定だということではありません。

―ということは、別に無視してても大丈夫ってことになるんでしょうか。関数が消えることはなさそうなのでそう思いました。でも、解決できるんだったらした方がいいですよね。もうちょっと調べる。

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES を 1 として定義すると、strcpy の呼び出しが、バッファ オーバーランを防ぐ strcpy_s の呼び出しに変更され、警告は除去されます。

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES を 1 として定義する というのは

1
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

―ってことなんでしょうか。これをソースコードに追記すればいいのかなぁ。
でも、なんか足りない感じがするんですよね(笑
#include じゃないけど、そういったやつが必要な気がする。

解決策

以下のページを参照しました。

そこには以下の記述がありました。

1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

ソースの先頭に以下を書いておけば、自動的に関数を置き換えてくれます。 ただし、これは、C++の関数オーバーロードの機能を用いているので、 C言語では使えません。

1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

なるほど。オーバーロードの機能はC言語は対応してなさそうってことも情報として手に入った!<br />とりあえず、ソースコードの文頭に以下のコードを追記する。

1
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

・・・、ソースファイルの量を考えると気が滅入ります。 本当に、量がハンパない。なんか良い方法はないものか。

プリプロセッサ

_CRT_SECURE_NO_WARNINGS を書き加えればいいみたいです。

今のところよくわからないが、プリプロセッサ(事前処理)で、 「_CRT_SECURE_NO_WARNINGS」を指定すると、 str***-&gt;str***_sにしましょうwerningは消せるようです。

もっと詳しいところまで、書いてあるサイトがありました。画像の通りにやれば、うまくいくと思います。

1
2
CRTのセキュリティの強化の結果、コンパイル時に出力される警告メッセージを削除する為に、
プリプロセッサの定義に「_CRT_SECURE_NO_WARNINGS」を追加する。