質問: ここに投稿自体初めてで不足等あった場合すいません。エラーになる理由を教えていただけますでしょうか。 ``` #include "pch.h" #include #include #include int main(void) { char str[10]; **strcpy (str, "MARIO");** printf("%s\n", str); return 0; } ``` 返信ありがとうございます。エラーは以下のように出ました。 **エラーメッセージ** ``` C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. ConsoleApplication4 c:\users\takuy\source\repos\consoleapplication4\consoleapplication4.cpp 12 ``` 最初は文字の打ち間違いと思いましたが参考書通りに入力したためそれも違い、何をまちがっているのか分からなくなってしまいました。
回答: 結論としてはVisual Studioに対応した参考書を参照されることをお勧めします。 kunifさんの回答と被りますが、時系列に整理します。 C4996(英語)は > > コンパイラの警告 (レベル 3) > > > とあるようにあくまで警告です。今回の場合、Visual Studio 2005で導入されたCRTのセキュリティ機能及びCRT関数のセキュリティが強化されたバージョンによって警告が出力されています。具体的には > > たとえば、`strcpy`関数には、コピーする文字列が大きすぎてコピー先のバッファーに入らない場合、これを通知する方法がありません。ただし、セキュリティで保護されたバージョンの`strcpy_s`では、バッファーのサイズをパラメーターとして取り、バッファーオーバーランが発生するかどうかを事前に判断できます。`strcpy_s`を使用して、11文字を10文字バッファーにコピーしようとすると、これはエラーになります。`strcpy_s`でこの間違いを訂正することはできませんが、このエラーを検出して、無効なパラメーター ハンドラーを呼び出すことにより、エラーの発生を通知できます。 > > > と説明されている通りで、開発者の記述したソースコード通りに正常に動作する実行ファイルが生成されます。 次になぜエラーとなるかですが、Visaul Studio 2012でコンパイルオプション/sdl (追加のセキュリティ チェックの有効化)(英語)が導入されました。セキュリティ上の脅威となり得るため、C4996を含むいくつかの警告はエラーとして扱います。ただし、この機能は明示的に有効化しなければ、引き続き警告のままです。 更にVisual Studio2017ではプロジェクトファイル作成ウィザードに/sdlを有効化するチェックボックスを用意し、既定でチェックをつけました。明示的にチェックを外すか、後からプロジェクトの設定を変更することで無効化できます。またこれはあくまでプロジェクト設定であり、コンパイラー本体は引き続き既定で警告として扱います。 更にVisual Studio 2019ではプロジェクトファイル作成時に既定で/sdlを有効化しました。チェックボックスは廃止されましたが、後からプロジェクトの設定を変更することで無効化できます。コンパイラー本体は既定で警告として扱います。 こういったセキュリティ強化の変遷がありますので、参照された参考書がVisual Studioに対応していなかったり、対応していても古い場合には、エラーとなってしまいます。 一時的な対策としては、上記の`/sdl`追加のセキュリティチェックを無効化することです。ただし、セキュリティ上の脅威となるため無効化するのではなく、最新のVisual Studioに対応した参考書で学習されることをお勧めします。