Visual Studio 2015 / 2017 で発生する可能性がある _snscanf_s 関数の問題について

こんにちは、Visual Studio サポート チームです。 今回は、Visual Studio 2015 / 2017 で発生する可能性がある _snscanf_s 関数の問題とその影響についてご案内します。 この問題は以下のように Stack Overflow でも報告されておりましたが、この度、複数のお客様から弊社へお問い合わせをいただきましたので本ブログでもご紹介させていただきます。より多くの開発者様のお役に立てましたら幸いです。   VC2015で、double変数ddx_textのトラブル https://ja.stackoverflow.com/questions/16592/vc2015%E3%81%A7-double%E5%A4%89%E6%95%B0ddx-text%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB   現象 _snscanf_s 関数で浮動小数点書式を指定した場合、先頭が ‘0’ で始まる場合に終端文字 ‘\0’ が正しく扱われず、_snscanf_s 関数に指定した文字数全体に対して解析が行われます。例えば、文字配列の内容が “0\02\0” であった場合、_snscanf_s 関数で期待される結果は 0 ですが、不具合により実際には 2 が返されます。 また、MFC ライブラリの DDX_Text 関数では内部で _snscanf_s 関数を使用しているため、この問題の影響を受けて、入力した値と異なる値が浮動小数点型変数に格納される可能性があります。エディット コントロールに “0” を入力した場合、文字列バッファの “0\0” 以降の値はスタックの状態によって不定となるため、DDX_Text 関数で変数に格納される値も不定となります。   原因 Visual Studio 2015 以降で利用されている新しい C ランタイム…


Visual C++ 2015 でマルチバイト文字セットを利用するとコマンドライン引数を正しく取得できない

こんにちは、Visual Studioサポートチームです。 今回は、Visual Studio 2015 で マルチバイト文字セット (MBCS) を利用する際に確認されている問題についてご案内します。   現象 マルチバイト文字セット (MBCS) を利用した Visual C++ アプリケーションにおいて、コマンドラインの引数の最初の文字にマルチバイト文字がある場合に、WinMain 関数内で正しく引数を取得できない事象が確認されています。 引数の最初の文字が 1 バイト文字である場合には、正しく引数を得られますが、引数に漢字などのマルチバイト文字が利用されている場合、正しく引数を取得することができない場合があります。 マイクロソフトでは、本現象を Visual C++ 2015 のランタイム ライブラリ (ユニバーサル CRT) の問題として認識しており、調査を行っております。   対処方法 本現象は MBCS 固有の問題であるため、プロジェクトで使用する文字セットとして Unicode を利用した場合は、本現象は発生しません。 Unicode を利用することができない場合は、別途、GetCommandLine 関数を使用して引数を取得することができます。 なお、MBCS は既に非推奨となっているため、可能な限り Unicode への移行をご検討ください。   マルチバイト文字セット (MBCS) のサポート(日本語訳) https://msdn.microsoft.com/ja-jp/library/5z097dxa.aspx(英語原文) https://msdn.microsoft.com/en-us/library/5z097dxa.aspx   MBCS のまま対応する方法として、対応例 を2つ紹介します。  …


Visual C++ 2015 アプリケーションでの CRT ローカル配置について

こんにちは。Visual Studio サポート チームです。 8 月 2 日に Windows 10 の大型アップデートである Anniversary Update がリリースされ、本格的に Windows 10 の導入を進められている企業様も多いかと思います。 今回は、Windows 10 にも関係する Visual C++ 2015 のランタイムの変更点についてご紹介します。 ユニバーサル C ランタイム ライブラリについて Visual C++ 2015 では C ランタイム (CRT) ライブラリが大きくリファクタリングされ、Universal CRT (UCRT) とそれ以外のランタイム (vcruntime140.dll など) の 2 種類で構成されています。 UCRT には広く利用される標準的な C ランタイム ライブラリのコードが実装されており、安定した API を備えているため Visual Studio のリリースごとにバージョン変更する必要のない、Windows OS…


Visual Studio 2015 の _utime32 関数で指定可能な時刻の上限が以前と異なる

こんにちは、Visual Studio サポート チームです。 今回は、Visual C++ で提供される _utime32 関数で指定可能な時刻の上限が、Visual Studio 2015 と以前のバージョンとで異なる現象についてご案内します。   現象: Visual Studio 2015 で提供される Visual C++ の _utime32 関数の引数として、UTC 2038 年 1 月 18 日 23:59:59 (日本時間 2038 年 1 月 19 日 08:59:59) より後の時刻を指定すると処理に失敗してエラーとなり、戻り値として -1 が返ります。 これに対し、Visual Studio 2013 以前のVisual C++ では、UTC 2038 年 1 月 19 日 03:14:07 (日本時間…