メインコンテンツ

旧式の標準関数が使用されています

旧式のルーチンがセキュリティの脆弱性や移植性の問題の原因となることがある

説明

この欠陥は、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

修正方法

修正方法は欠陥の根本原因によって異なります。上の表に記載されている修正と以下の修正付きのコード例を参照してください。

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

すべて展開する

#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));
}

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

結果情報

グループ: セキュリティ
言語: C | C++
既定値: オフ
コマンド ライン構文: OBSOLETE_STD_FUNC
影響度: Low
タグ: #deprecatedFunctions
PQL 名: std.defects.OBSOLETE_STD_FUNC

バージョン履歴

R2015b で導入