メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C++: STR38-C

ナロー文字列およびワイド文字列と関数を混同しない

説明

ルール定義

ナロー文字列およびワイド文字列と関数を混同しないようにします。1

Polyspace 実装

ルール チェッカーは、"ナロー文字列またはワイド文字列の不適切な使用" をチェックします。

すべて展開する

問題

ナロー文字列またはワイド文字列の不適切な使用は、ナロー文字列をワイド文字列関数に渡したり、ワイド文字列をナロー文字列関数に渡したりする場合に発生します。

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

リスク

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

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

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

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

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

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

修正方法

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

例 - strncpy() に渡すワイド文字列
#include <string.h>
#include <wchar.h>

void func(void)
{
    wchar_t wide_str1[]  = L"0123456789";
    wchar_t wide_str2[] =  L"0000000000";
    strncpy(reinterpret_cast<char *>(wide_str2), reinterpret_cast<const char *>(wide_str1), 10); //Noncompliant
}

この例では、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);
}

チェック情報

グループ: 05.文字と文字列 (STR)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.