22

MSVC の「安全な」sprintf機能には、ターゲット バッファのサイズを「認識」するテンプレート バージョンがあります。bytesただし、このコードは...の終了後にスタックに 567890 を喜んでペイントします。

char bytes[5];
_snprintf_s( bytes, _TRUNCATE, "%s", "1234567890" );

私が間違っていること、またはこれは既知のバグですか?

(私はVS2005で作業しています-2008年または2010年にはテストしませんでした)

4

3 に答える 3

21

Visual C ++ 2005のバグのようです(そのリンクにアクセスするのに問題があります。Googleにもキャッシュされています)。

Visual C ++2005で問題を再現することができました。VisualC++2008および2010では、文字列は正しく切り捨てられ(bytes含む1234\0)、-1期待どおりに返されます。

于 2010-04-29T14:50:32.950 に答える
1

例は確かに正しいです。バージョンの時点で --

Microsoft Visual Studio 2005
Version 8.0.50727.867 (vsvista.050727-8600)
...
Visual C++ 77626-009-0000007-41722

-- これには、SP1、vista ホットフィックス、およびいくつかのライブラリ ホットフィックスが含まれます -- 上記の機能

template <size_t size>
int _snprintf_s(
   char (&buffer)[size],
   size_t count,
   const char *format [,
      argument] ... 
);

まだバギーです。しかし、本当に魅力的なのは、4つのバリアント機能のうち、この機能だけが機能することです。

  • わかった:int _snprintf_s(char *buffer, size_t sizeOfBuffer, size_t count, :::
  • バギー:template <size_t size> int _snprintf_s(char (&buffer)[size], size_t count, :::
  • OK: int _snwprintf_s(ワイド文字バージョン)
  • OK: template <size_t size> int _snwprintf_s(はい、ワイド文字バージョンは OK)

つまり、非テンプレート バージョンを使用している場合は問題ありません。ワイド文字バージョンのいずれかを使用している場合も問題ありません。すばらしい。

于 2012-10-25T18:10:50.460 に答える
-6

例が間違っていました。

コードは次のようになります。

char bytes[5];
_snprintf_s( bytes, 5, _TRUNCATE, "%s", "1234567890" );

間違ったコードの場合、コンパイラが警告を出さなかったのはバグかもしれませんが、snprintf のチェックが弱いのでしょう。

于 2012-02-02T21:32:48.877 に答える