April 3, 2009

Visual Studio 2005: 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 として定義する というのは

_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

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

解決策

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

書いてあった。
でも、なんか自信がない。

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

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

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

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

プリプロセッサ

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

ババリンのバイオメカニクス/ウェブリブログ: warning C4996

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

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

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