メインコンテンツ

ナロー文字列またはワイド文字列の不適切な使用

ワイド (ナロー) 文字列関数に渡されるナロー (ワイド) 文字列

説明

この欠陥は、ナロー文字列をワイド文字列関数に渡したり、ワイド文字列をナロー文字列関数に渡したりした場合に発生します。

ナロー文字列またはワイド文字列の不適切な使用は、ナロー文字列とワイド文字列が同じサイズになるオペレーティング システムでは欠陥を報告しません。

リスク

ワイド文字列関数にナロー文字列 (またはその逆) を使用すると、予期しない動作または未定義の動作になる可能性があります。

ワイド文字列をナロー文字列関数に渡す場合、以下の問題が発生する可能性があります。

  • データの切り捨て。文字列に null バイトが含まれている場合、strncpy() を使用するコピー操作が早期に終了する可能性があります。

  • 不適切な文字列長。strlen() は最初の null バイトまでの文字列の文字数を返します。ワイド文字列には、その最初の null バイトの後ろに追加文字が含まれている場合があります。

ナロー文字列をワイド文字列関数に渡す場合、以下の問題が発生する可能性があります。

  • バッファー オーバーフロー。wcsncpy() を使用するコピー操作で、格納先文字列に、コピーの結果を格納するためのメモリが十分にない場合があります。

修正方法

ナロー文字列関数にナロー文字列を使用します。ワイド文字列関数にワイド文字列を使用します。

すべて展開する

#include <string.h>
#include <wchar.h>

void func(void)
{
    wchar_t wide_str1[]  = L"0123456789";
    wchar_t wide_str2[] =  L"0000000000";
    strncpy(wide_str2, wide_str1, 10);
}

この例では、strncpy() は 10 個のワイド文字列を wide_strt1 から wide_str2 にコピーします。wide_str1 に null バイトが含まれている場合、コピー操作が途中で終了し、ワイド文字列が打ち切られる可能性があります。

修正 — wcsncpy() を使用してワイド文字列をコピー

1 つの修正方法として、wcsncpy() を使用して wide_str1wide_str2 にコピーします。

#include <string.h>
#include <wchar.h>

void func(void)
{
    wchar_t wide_str1[]  = L"0123456789";
    wchar_t wide_str2[] =  L"0000000000";
    wcsncpy(wide_str2, wide_str1, 10);
}

結果情報

グループ: プログラミング
言語: C | C++
既定値: オフ
コマンド ライン構文: NARROW_WIDE_STR_MISUSE
影響度: High

バージョン履歴

R2018b で導入