プログラム

C++:C4996エラー回避4選|sprintf_s、fopen_s、strcpy_s

概要

エラーパータン1

fopen()関数や、strcpy()関数、sprintf()関数などを使用すると、ビルド時にxxx_s()関数に変えてくれっていうエラーが表示されます。

ここでは、エラー解除方法を4つほど紹介します。

エラー C4996 ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

エラーパターン2

もうひとつのエラーパターン。xxx_s()関数に変えてくれっていうエラーじゃないほう。こちらも一緒に試してみたいと思います。

エラー C4996 ‘stricmp’: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _stricmp. See online help for details. c4996

エラー解除方法

1つ目:_CRT_SECURE_NO_WARNINGS

メニュー[プロジェクト]-[プロパティ]を選択。

プロパティページ画面の、[構成プロパティ]-[C/C++]-[プリプロセッサの定義]で編集を選択

プリプロセッサの定義画面で、「_CRT_SECURE_NO_WARNINGS」を入力

ちなみにソース上に定義しても効果なし。

#define _CRT_SECURE_NO_WARNINGS		// 効果なし

エラーパターン1は、解除できますが、エラーパターン2では解除できませんでした。

2つ目:SDLチェック

メニュー[プロジェクト]-[プロパティ]を選択。

プロパティページ画面の、[構成プロパティ]-[C/C++]-[全般]-[SDLチェック]の「はい(/sdl)」→「いいえ(/sdl-)」に変更

3つ目:ソース上で定義

ソースコード内に以下「エラー回避の定義」を追加。

#pragma warning(disable:4996)

4つ目:xxx_s()に置き換える

エラーメッセージ通り、xxx_s()に置き換える。
引数に最大サイズ指定が増えたぐらい。

メモリオーバーしないように使ってほしいからって事なんでしょうね。

ちなみにエラーパターン2のstricmp()の例の場合は、_stricmp()を推奨してました。こっちはサイズ指定は気にしないんですね・・・。

    char a[10];
    //sprintf(a, "test");
    sprintf_s(a, 10, "test");

    //strcpy(a, "test");
    strcpy(a, 10, "test");

    //stricmp("test1", "test2");
    _stricmp("test1", "test2");

sprintf_s()やstrcpy_s()の引数に指定している「10」という数値は、aの配列数を指してます。_countof(a)とかでもOK。

最後に

試作や勉強目的であれば、1~3つ目の方法でよいと思います。

本番は4つ目がいいかも。
変な使い方しなければ、無理に_s()に置きかえなくても良さそうですけどね。

最後まで見てくれてありがとう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA