set_constraint_handler_s | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


set_constraint_handler_s関数

概要

実行時制約ハンドラを設定する。

ヘッダ

stdlib.h

形式

constraint_handler_t set_constraint_handler_s(constraint_handler_t handler);

引数

handler

新しく設定する実行時制約ハンドラ。

ヌルポインタを指定した場合は、デフォルトの実行時制約ハンドラが設定される。

戻り値

以前に設定されていた実行時制約ハンドラ。

最後に set_constraint_handler_s関数を呼び出したときの実引数がヌルポインタだった場合や、初回の呼び出しであった場合は、処理系のデフォルトの実行時制約ハンドラが返される。

詳細

実行時制約に違反したときに呼び出される実行時制約ハンドラを設定する。

実行時制約ハンドラは同時に1つだけであり、最後に設定したものだけが有効である。また、初期状態では、デフォルトの実行時制約ハンドラが設定されている。デフォルトの実行時制約ハンドラの実装は処理系定義であり、プログラムを終了させたり、中断させたりする可能性がある。

標準には、何もしないという挙動を実装した ignore_handler_s関数と、プログラムを異常終了させるという挙動を実装した abort_handler_s関数が定義されており、これらを設定することもできる。

実行時制約ハンドラが呼び出されるとき、その実引数は以下の順番で渡される。

第1引数: 違反した実行時制約について説明する文字列へのポインタ。

第2引数: ヌルポインタ、または実装定義のオブジェクトへのポインタ。

第3引数: 実行時制約違反を検出した関数の戻り値が errno_t型であれば、その戻り値。そうでなければ、errno_t型の正の値。

この関数は、__STDC_LIB_EXT1__ が定義されている処理系でのみ使用できる。また、この関数を使用するのなら、<stdlib.h> をインクルードする前に、__STDC_WANT_LIB_EXT1__ という名前のマクロを、置換結果 1 として定義することが作法となっているが、これを行わずとも関数を使用できる処理系もあり得る。

注意

デフォルトの実行時制約ハンドラの挙動は処理系定義である。これが問題であれば、独自の実行時制約ハンドラを定義して設定しておくべきだろう。

Visual Studio 2017 では使用できない。代わりの仕組みとして、_set_invalid_parameter_handler関数による方法があるが、Microsoft 独自の仕様のものになる。

使用例

// Visual Studio 2017 には、set_constraint_handler_s関数がなく、
// そもそも、実行時制約に関する仕様も異なるため、
// このサンプルプログラムはコンパイルできない。

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void my_constraint_handler(const char* msg, void* ptr, errno_t error)
{
    fputs("実行時制約違反が発生: ", stderr);
    fputs(msg, stderr);
    fprintf(stderr, "error code: %d\n", error);

    exit(error);
}

int main(void)
{
    set_constraint_handler_s(my_constraint_handler);

    char s[5];
    if (strcpy_s(s, sizeof(s), "xxxxxxxx") == 0) {
        puts(s);
    }
}

実行結果 (stderr):

(※実行を確認できる環境がないため、一部 * で伏せている)
実行時制約違反が発生: 
******
error code: **

関連

実引数に指定する実行時制約ハンドラとして、何もしないという挙動を実装した ignore_handler_s関数と、プログラムを異常終了させるという挙動を実装した abort_handler_s関数が定義されている。

解説章


参考リンク


更新履歴

’2019/8/27 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る