メインコンテンツ

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

CERT C++: MSC33-C

Do not pass invalid data to the asctime() function

説明

ルール定義

無効なデータを関数 asctime() に渡さないようにします。1

Polyspace 実装

ルール チェッカーは、"旧式の標準関数が使用されています" をチェックします。

すべて展開する

問題

旧式の標準関数が使用されていますは、C/C++ コーディング規約でレガシ、削除済み、非推奨または旧式とされている標準関数ルーチンの呼び出しを検出します。

旧式の関数規格リスク置換関数
asctimePOSIX.1-2008 で使用終了スレッドセーフでない。strftime または asctime_s
asctime_rPOSIX.1-2008 で使用終了安全でない関数 sprintf に基づく実装。strftime または asctime_s
bcmp

4.3BSD で使用終了

POSIX.1–2001 でレガシとマークされている。

最初の異なるバイトを見つけたら関数から戻るため、タイミング攻撃に対して脆弱になる。 memcmp
bcopy

4.3BSD で使用終了

POSIX.1–2001 でレガシとマークされている。

最初の異なるバイトを見つけたら関数から戻るため、タイミング攻撃に対して脆弱になる。 memcpy または memmove
brk および sbrkSUSv2 および POSIX.1-2001 でレガシとマークされている。 malloc
bsd_signalPOSIX.1–2008 で削除済み sigaction
bzeroPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。 memset
ctimePOSIX.1-2008 で使用終了スレッドセーフでない。strftime または asctime_s
ctime_rPOSIX.1-2008 で使用終了安全でない関数 sprintf に基づく実装。strftime または asctime_s
cuseridPOSIX.1–2001 で削除済み。再呼び出し可能でない。正確な機能が標準化されておらず、移植性の問題の原因となる。getpwuid
ecvt および fcvtPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み再呼び出し可能でないsnprintf
ecvt_r および fcvt_rPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み snprintf
ftimePOSIX.1–2008 で削除済み time, gettimeofday, clock_gettime
gamma, gammaf, gammal履歴が錯綜しているため、関数はどの規格でも指定されていない移植性の問題。tgamma, lgamma
gcvtPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。 snprintf
getcontextPOSIX.1–2008 で削除済み。移植性の問題。 POSIX スレッドを代わりに使用。
getdtablesizeBSD API 関数が POSIX.1-2001 に含まれていない移植性の問題。sysconf( _SC_OPEN_MAX )
gethostbyaddrPOSIX.1–2008 で削除済み再呼び出し可能でないgetaddrinfo
gethostbynamePOSIX.1–2008 で削除済み再呼び出し可能でないgetnameinfo
getpagesizeBSD API 関数が POSIX.1-2001 に含まれていない移植性の問題。sysconf( _SC_PAGESIZE )
getpassPOSIX.1–2001 で削除済み。再呼び出し可能でない。getpwuid
getwPOSIX.1-2001 に存在しない。 fread
getwdPOSIX.1-2001 でレガシとマークされている。POSIX.1–2008 で削除済み。 getcwd
indexPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。 strchr
makecontextPOSIX.1–2008 で削除済み。移植性の問題。 POSIX スレッドを代わりに使用。
memalignSunOS 4.1.3 で登場。4.4 BSD または POSIX.1-2001 にはなし posix_memalign
mktempPOSIX.1–2008 で削除済み。生成された名前が予測可能であり、競合状態の原因となることがある。mkstemp は競合リスクを除去
pthread_attr_getstackaddr および pthread_attr_setstackaddr stackaddr 属性の仕様にあいまいさがあり、移植性の問題の原因となるpthread_attr_getstack および pthread_attr_setstack
putwPOSIX.1-2001 に存在しない。移植性の問題。fwrite
qecvt および qfcvtPOSIX.1-2001 でレガシとマークされ、POSIX.1-2008 で削除済み snprintf
qecvt_r および qfcvt_rPOSIX.1-2001 でレガシとマークされ、POSIX.1-2008 で削除済み snprintf
rand_rPOSIX.1-2008 で旧式とマークされている  
re_compBSD API 関数移植性の問題regcomp
re_exesBSD API 関数移植性の問題regexec
rindexPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。 strrchr
scalbPOSIX.1–2008 で削除済み scalblnscalblnf または scalblnl
sigblock出典が不明な 4.3BSD シグナル API sigprocmask
sigmask出典が不明な 4.3BSD シグナル API sigprocmask
sigsetmask出典が不明な 4.3BSD シグナル API sigprocmask
sigstackインターフェイスが旧式であり、ほとんどのプラットフォームで実装されていない。移植性の問題。sigaltstack
sigvec出典が不明な 4.3BSD シグナル API sigaction
swapcontextPOSIX.1–2008 で削除済み移植性の問題。 POSIX スレッドを使用。
tmpnam および tmpnam_rPOSIX.1–2008 で旧式とマークされている。この関数は、呼び出されるたびに TMP_MAX 回目まで異なる文字列を生成。呼び出される回数が TMP_MAX 回を超えると、動作が処理系定義になる。 mkstemp, tmpfile
ttyslotPOSIX.1–2001 で削除済み。  
ualarmPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。エラーの指定が不十分。setitimer または POSIX timer_create
usleepPOSIX.1–2008 で削除済み。 nanosleep
utimeSVr4、POSIX.1-2001。POSIX.1-2008 で旧式とマークされている。  
valloc

4.3BSD で旧式とマークされている。

SUSv2 でレガシとマークされている。

POSIX.1-2001 から削除済み

 posix_memalign
vfork

POSIX.1-2008 から削除済み

以前の規格で指定が不十分。fork
wcswcsこの関数は最終的な ISO/IEC 9899:1990/Amendment 1:1995 (E) に含まれていなかった。  wcsstr
WinExecWinAPI ではこの関数を 16 ビット Windows 互換でのみ提供。 CreateProcess
LoadModuleWinAPI ではこの関数を 16 ビット Windows 互換でのみ提供。 CreateProcess
修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して逆のトレースを行い、これまでの関連するイベントを確認できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈も参照してください。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

例 - 時刻を出力
#include <stdio.h>
#include <time.h> 

void timecheck_bad(int argc, char *argv[])
{
    time_t ticks; 

    ticks = time(NULL);
    printf("%.24s\r\n", ctime(&ticks)); //Noncompliant
}

この例では、関数 ctime が現在の時刻を書式設定して出力します。しかし、ctime はマルチスレッド プログラムで機能しないため、C99 以降で削除されています。

修正 — 別の時間関数

1 つの修正方法として、strftime を代わりに使用します。この関数は一定のバッファー サイズを使用するためです。

#include <stdio.h>
#include <string.h>
#include <time.h> 

void timecheck_good(int argc, char *argv[])
{
    char outBuff[1025];
    time_t ticks; 
    struct tm * timeinfo;
    
    memset(outBuff, 0, sizeof(outBuff)); 
    
    ticks = time(NULL);
    timeinfo = localtime(&ticks);
    strftime(outBuff,sizeof(outBuff),"%I:%M%p.",timeinfo);
    fprintf(stdout, outBuff);
}

チェック情報

グループ: 49.その他 (MSC)

バージョン履歴

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.