CWE Rule 754
説明
ルールの説明
The product does not check or incorrectly checks for unusual or exceptional conditions that are not expected to occur frequently during day to day operation of the product.
Polyspace 実装
このルール チェッカーは、[要注意の関数の戻り値がチェックされていません] をチェックします。
例
この問題は、エラー発生の可能性に関する情報を返す要注意の標準関数を呼び出し、以下のいずれかを行った場合に発生します。
戻り値を無視。
戻り値を変数に単純に代入することも、戻り値を明示的に
voidにキャストすることもしていない。エラーの戻り値をテストすることなく関数の出力 (戻り値または引数の参照渡し) を使用。
以下のような理由で関数呼び出しで障害を発生する可能性が高い場合、チェッカーはその関数を要注意と見なします。
システム リソースが使い尽くされた状態 (リソースを割り当てるときなど)。
権限またはアクセス許可が変更された状態。
外部ソースからのデータを読み取り、書き込みまたは変換する際にソースが汚染された状態。
既存の API があってもサポートされない機能。
チェッカーは、関数がエラーなしで終了したかどうかを "戻り値" が示す関数のみを考慮します。
このような関数の一部では、以下のような重要なタスクを実行する可能性があります。
権限の設定 (
setuidなど)jail の作成 (
chrootなど)プロセスの作成 (
forkなど)スレッドの作成 (
pthread_createなど)ミューテックスのロックまたはロック解除 (
pthread_mutex_lockなど)メモリ セグメントのロックまたはロック解除 (
mlockなど)
要注意のタスクを実行する関数の戻り値をチェックせず、戻り値を通してエラー情報を示さない場合は、プログラムが予期せぬ動作をする可能性があります。これらの関数のエラーはプログラム全体に伝播し、不適切な出力、セキュリティの脆弱性およびシステム障害の原因となる可能性があります。
プログラムを続行する前に、"重要で要注意" の関数の戻り値をテストします。
要注意の関数ではない場合は、その関数を void にキャストすることによって戻り値を明示的に無視することができます。Polyspace® は、要注意の関数が void にキャストされている場合はこの欠陥を発生させません。"重要で要注意の関数" の場合、さらに脆弱なタスクが実行されるため、この解決策は許容されません。
#include <pthread.h>
#include <string.h>
#include <stddef.h>
#include <stdio.h>
void initialize() {
pthread_attr_t attr;
pthread_attr_init(&attr);//Noncompliant //Noncompliant
}
int read_file(int argc, char *argv[])
{
FILE *in;
if (argc != 2) {
/* Handle error */
}
in = fmemopen (argv[1], strlen (argv[1]), "r");
return 0; //Noncompliant //Noncompliant
}この例は、要注意の POSIX 関数 pthread_attr_init および fmemopen の呼び出しを示しています。それらの戻り値が無視され、欠陥の原因になっています。
(void) にキャスト考えられる 1 つの修正方法として、関数を void にキャストします。この修正では Polyspace およびレビュー担当者に、要注意の関数の戻り値を明示的に無視していることを伝えます。
#include <pthread.h>
#include <string.h>
#include <stddef.h>
#include <stdio.h>
void initialize() {
pthread_attr_t attr;
(void)pthread_attr_init(&attr);//Compliant
}
int read_file(int argc, char *argv[])
{
FILE *in;
if (argc != 2) {
/* Handle error */
}
(void)fmemopen (argv[1], strlen (argv[1]), "r"); //Compliant
return 0;
}1 つの修正方法として、pthread_attr_init と fmemopen の戻り値をテストして、エラーをチェックします。
#include <pthread.h>
#include <string.h>
#include <stddef.h>
#include <stdio.h>
void initialize() {
pthread_attr_t attr;
int result = pthread_attr_init(&attr);//Compliant
if(result != 0){
//Handle fatal error
}
}
int read_file(int argc, char *argv[])
{
FILE *in;
if (argc != 2) {
/* Handle error */
}
in = fmemopen (argv[1], strlen (argv[1]), "r");
if (in==NULL){
// Handle error
}
return 0;//Compliant
}#include <pthread.h>
extern void *start_routine(void *);
void returnnotchecked() {
pthread_t thread_id;
pthread_attr_t attr;
void *res;
(void)pthread_attr_init(&attr);
(void)pthread_create(&thread_id, &attr, &start_routine, ((void *)0)); //Noncompliant
pthread_join(thread_id, &res); //Noncompliant
}
この例では、2 つの重要な関数 pthread_create および pthread_join を呼び出しています。pthread_create の戻り値は void にキャストすることで無視されますが、pthread_create は (要注意の関数であるだけでなく) 重要な関数であるため、Polyspace ではこの "要注意の関数の戻り値がチェックされていません" という欠陥が無視されません。他の重要な関数 pthread_join は暗黙的に無視される値を返します。pthread_join は、pthread_create の戻り値を使用しますが、この戻り値はチェックされていません。
この欠陥の修正として、これらの重要な関数の戻り値をチェックして、関数が想定どおりに実行されることを検証します。
#include <pthread.h>
#include <stdlib.h>
#define fatal_error() abort()
extern void *start_routine(void *);
void returnnotchecked() {
pthread_t thread_id;
pthread_attr_t attr;
void *res;
int result;
(void)pthread_attr_init(&attr);
result = pthread_create(&thread_id, &attr, &start_routine, NULL);
if (result != 0) {
/* Handle error */
fatal_error();
}
result = pthread_join(thread_id, &res);
if (result != 0) {
/* Handle error */
fatal_error();
}
}チェック情報
| カテゴリ: その他 |
バージョン履歴
R2024a で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)