メインコンテンツ

CERT C: Rec.MSC24-C

Do not use deprecated or obsolescent functions

説明

Do not use deprecated or obsolescent functions. 1

Polyspace 実装

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

すべて展開する

問題

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

旧式の関数規格リスク置換関数
asctime POSIX.1-2008 で使用終了スレッドセーフでない。 strftime または asctime_s
asctime_r POSIX.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_signal POSIX.1–2008 で削除済み  sigaction
bzero POSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。  memset
ctime POSIX.1-2008 で使用終了スレッドセーフでない。 strftime または asctime_s
ctime_r POSIX.1-2008 で使用終了安全でない関数 sprintf に基づく実装。 strftime または asctime_s
cuserid POSIX.1–2001 で削除済み。再呼び出し可能でない。正確な機能が標準化されておらず、移植性の問題の原因となる。 getpwuid
ecvt および fcvtPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み再呼び出し可能でない snprintf
ecvt_r および fcvt_rPOSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み  snprintf
ftime POSIX.1–2008 で削除済み  time, gettimeofday, clock_gettime
gamma, gammaf, gammal履歴が錯綜しているため、関数はどの規格でも指定されていない移植性の問題。 tgamma, lgamma
gcvt POSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。  snprintf
getcontext POSIX.1–2008 で削除済み。移植性の問題。 POSIX スレッドを代わりに使用。
getdtablesize BSD API 関数が POSIX.1-2001 に含まれていない移植性の問題。 sysconf( _SC_OPEN_MAX )
gethostbyaddr POSIX.1–2008 で削除済み再呼び出し可能でない getaddrinfo
gethostbyname POSIX.1–2008 で削除済み再呼び出し可能でない getnameinfo
getpagesize BSD API 関数が POSIX.1-2001 に含まれていない移植性の問題。 sysconf( _SC_PAGESIZE )
getpass POSIX.1–2001 で削除済み。再呼び出し可能でない。 getpwuid
getw POSIX.1-2001 に存在しない。  fread
getwd POSIX.1-2001 でレガシとマークされている。POSIX.1–2008 で削除済み。  getcwd
index POSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。  strchr
makecontext POSIX.1–2008 で削除済み。移植性の問題。 POSIX スレッドを代わりに使用。
memalign SunOS 4.1.3 で登場。4.4 BSD または POSIX.1-2001 にはなし  posix_memalign
mktemp POSIX.1–2008 で削除済み。生成された名前が予測可能であり、競合状態の原因となることがある。 mkstemp は競合リスクを除去
pthread_attr_getstackaddr および pthread_attr_setstackaddr  stackaddr 属性の仕様にあいまいさがあり、移植性の問題の原因となる pthread_attr_getstack および pthread_attr_setstack
putw POSIX.1-2001 に存在しない。移植性の問題。 fwrite
qecvt および qfcvtPOSIX.1-2001 でレガシとマークされ、POSIX.1-2008 で削除済み  snprintf
qecvt_r および qfcvt_rPOSIX.1-2001 でレガシとマークされ、POSIX.1-2008 で削除済み  snprintf
rand_r POSIX.1-2008 で旧式とマークされている  
re_comp BSD API 関数移植性の問題 regcomp
re_exes BSD API 関数移植性の問題 regexec
rindex POSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。  strrchr
scalb POSIX.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
swapcontext POSIX.1–2008 で削除済み移植性の問題。 POSIX スレッドを使用。
tmpnam および tmpnam_rPOSIX.1–2008 で旧式とマークされている。この関数は、呼び出されるたびに TMP_MAX 回目まで異なる文字列を生成。呼び出される回数が TMP_MAX 回を超えると、動作が処理系定義になる。 mkstemp, tmpfile
ttyslot POSIX.1–2001 で削除済み。  
ualarm POSIX.1–2001 でレガシとマークされている。POSIX.1–2008 で削除済み。エラーの指定が不十分。 setitimer または POSIX timer_create
usleep POSIX.1–2008 で削除済み。  nanosleep
utime SVr4、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
WinExec WinAPI ではこの関数を 16 ビット Windows 互換でのみ提供。  CreateProcess
LoadModule WinAPI ではこの関数を 16 ビット Windows 互換でのみ提供。  CreateProcess
修正方法

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

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

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

例 - 時刻を出力
#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);
}

チェック情報

グループ: Rec.48.その他 (MSC)
PQL 名: std.cert.MSC24_C

バージョン履歴

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.