C4996ワーニングについて

今更なネタだけども,C4996ワーニングについて.
各所で人に教えてる割に,自分のとこには書いてなかったなーと思い書く.

よくVC++6.0で書いたプログラムをそのままVC2005とかに移植すると,
C4996ワーニングで,scanfなどがセキュアじゃないと怒られる.
これを消そうと思うと,scanf_sってセキュアな関数に書き直す必要があるけど,
扱うデータ型によっては引数でバッファサイズを指定してやる必要があったりする.

そんなわけで,情報系の人間ならばともかくとして,
僕らのように理工系の人間は数値計算がしたいだけなので,
ワーニングを手っ取り早く消せば良いやって発想になる.

そこで,ワーニングを消すには以下の2つの方法がある.

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#define _CRT_SECURE_NO_WARNINGS
はセキュア関数に関するワーニングだけを消す.
ようは,***_sっていうのに関するワーニングだけを消す.

それに対して,
#pragma warning(disable:4996)
はC4996ワーニングを無効にする.

C4996はセキュリティ上の理由から使用されなくなった
MFC 関数または ATL 関数を使用している場合以外にも,
<hash_map> ヘッダー ファイルと <hash_set> ヘッダー ファイルの
メンバを std 名前空間で使用している場合に発生する.
(参考:コンパイラの警告 (レベル 1) C4996

なので,C4996そのものを無効にするってのは,
必ずしも・・というか,余り好ましくない.

そんなわけで,出来ればpragmaでC4996をdisableするよりは,
#define _CRT_SECURE_NO_WARNINGS
でセキュア関数関連のワーニングだけを消すほうが良い.

ただまあ,getch()みたいにdeprecatedな関数を使用してる場合,
しかも,ただVC++で使ってたのをVC2005でちょいとビルドしたい場合,
わざわざ書き換えるのも面倒なので,
pragmaでC4996をdisableしたりするけどね.

まあ・・・そもそもとして,そういう標準でない関数を使うなって話かもしれないけど.

カテゴリー: 未分類 パーマリンク