2.15.1. ISO C ライブラリの実装定義

ISO 仕様では、一部実装者の選択に任せられている機能がありますが、その場合も実装の選択内容を文書化する必要があります。 このセクションでは、ARM ライブラリの実装について説明します。

一般的な ARM C ライブラリでは、次のようになります。

以下の関数は、EOF(-1)〜 255 (境界値を含む)の範囲内にある文字の値をテストします。

ISO C ライブラリのバリアントは ライブラリの命名規則に示します。

数学関数

Table 2.14 は、数学関数に範囲外の引数が渡された場合の応答を示します。

Table 2.14. 数学関数

関数条件戻り値エラー番号
acos(x)abs(x) > 1QNaNEDOM
asin(x)abs(x) > 1QNaNEDOM
atan2(x,y)x =0, y = 0QNaNEDOM
atan2(x,y)x = Inf, y = InfQNaNEDOM
cos(x)x=InfQNaNEDOM
cosh(x)オーバーフロー+InfERANGE
exp(x)オーバーフロー+InfERANGE
exp(x)アンダーフロー+0ERANGE
fmod(x,y)x=InfQNaNEDOM
fmod(x,y)y = 0QNaNEDOM
log(x)x < 0QNaNEDOM
log(x)x = 0-InfEDOM
log10(x)x < 0QNaNEDOM
log10(x)x = 0-InfEDOM
pow(x,y)オーバーフロー+InfERANGE
pow(x,y)アンダーフロー0ERANGE
pow(x,y)x=0 or x=Inf, y=0+1EDOM
pow(x,y)x=+0, y<0-InfEDOM
pow(x,y)x=-0, y<0 and y integer-InfEDOM
pow(x,y)x= -0, y<0 and y non-integerQNaNEDOM
pow(x,y)x<0, y non-integerQNaNEDOM
pow(x,y)x=1, y=InfQNaNEDOM
sqrt(x)x < 0QNaNEDOM
sin(x)x=InfQNaNEDOM
sinh(x)オーバーフロー+InfERANGE
tan(x)x=InfQNaNEDOM
atan(x)SNaNSNaNなし
ceil(x)SNaNSNaNなし
floor(x)SNaNSNaNなし
frexp(x)SNaNSNaNなし
ldexp(x)SNaNSNaNなし
modf(x)SNaNSNaNなし
tanh(x)SNaNSNaNなし

HUGE_VALInf のエイリアスです。 エラー番号については、errno 変数を参照して下さい。 Table 2.14 に示す以外のケースでは、いずれの関数も、QNaN を渡されると QNaN を返し、SNaN を渡されると無効演算例外を生成します。

C99 nan() 関数に渡された文字列は無視され、常に同じ NaN、すなわち、最上位ビットを除いて、すべての小数部ビットがクリアされた NaN が返されます。 符号ビットもクリアされます。 NAN(xxxx) 形式の文字列を strtod に渡しても同じ結果となります。

シグナル関数

Table 2.15 は、signal() 関数によってサポートされるシグナルを示しています。

Table 2.15. シグナル関数

シグナル番号説明追加引数
SIGABRT1このシグナルは、アプリケーションが abort() または assert() を呼び出した場合にのみ使用されます。なし
SIGFPE2ゼロによる除算などの算術例外を通知するために使用されます。 ハードウェアおよびソフトウェア浮動小数点と整数除算に使用されます。{FE_EX_INEXACT, FE_EX_UNDERFLOW, FE_EX_OVERFLOW, FE_EX_DIVBYZERO, FE_EX_INVALID, DIVBYZERO} からのビット群
SIGILL3不正な命令なし
SIGINT4ユーザからのアテンション要求なし
SIGSEGV5不正なメモリアクセスなし
SIGTERM6終了要求なし
SIGSTAK7スタックオーバーフローが検出されたなし
SIGRTRED8ランタイムライブラリの入出力ストリームでリダイレクトが失敗した標準ストリームをリダイレクトするために再度開かれたファイルまたはデバイスの名前
SIGRTMEM9初期化中または破損後のヒープ空間の不足失敗した要求のサイズ
SIGUSR110ユーザ定義ユーザ定義
SIGUSR211ユーザ定義ユーザ定義
SIGPVFN12C++ から純仮想関数が呼び出された-
SIGCPPL13C++ からの例外-
SIGOUTOFHEAP14ヒープ空間の不足。C++ 関数 ::operator new によって返されます。失敗した要求のサイズ
予約 15 〜 31予約予約
その他 31 より大きいユーザ定義ユーザ定義

SIGUSR2 よりも大きなシグナル番号は、__raise() を使用すれば渡すことができ、デフォルトのシグナルハンドラでは捕捉できますが、signal() を使用して登録されるハンドラでは捕捉できません。

SIGUSR2 よりも大きなシグナル番号用のハンドラを登録しようとすると、signal() によってエラーコードが返されます。

認識されたすべてのシグナルのデフォルト処理では、診断メッセージが出力され、exit() を呼び出します。 このデフォルトの動作は、変更しない限りプログラムの起動時に適用されます。

Caution

浮動小数点の処理に関する IEEE 754 標準では、例外に対するデフォルトのアクションとしてトラップなしで続行することが定義されています。 デフォルトでは、浮動小数点演算で発生した例外によって SIGFPE が生成されることはありません。 fenv.h 内の関数と定義をカスタマイズすることで、浮動小数点エラーの処理方法を修正することができます。 詳細については、エラー通知、エラー処理、プログラム終了処理のカスタマイズおよびChapter 4 浮動小数点サポートを参照して下さい。

Table 2.15 に示すすべてのシグナルにおいて、シグナルの発生時にハンドラによって関数が参照されている場合は、ハンドラへの呼び出しの前に signal(sig, SIG_DFL) と等価の処理が実行されます。

SIGILL シグナルが signal() 関数によって指定されたハンドラに受信されると、デフォルトの処理がリセットされます。

入出力特性

汎用 ARM C ライブラリには以下の入出力特性があります。

  • テキストストリームの最終行に終了改行文字は必要ありません。

  • テキストストリームに書き込まれる改行文字の直前にスペース文字があった場合は、読み出し時にもそのスペース文字が読み出されます。

  • バイナリ出力ストリームには NULL 文字は追加されません。

  • 追加モードストリームのファイル位置インジケータは、最初はファイルの終わりに配置されています。

  • テキストストリームへの書き込みによって、書き込みが発生した場所以降の関連ファイルの内容は切り捨てられる場合があります。これは、書き込み発生場所以降の内容切り捨てが、そのファイルのデバイスカテゴリの動作である場合に発生します。

  • セミホスティングが使用される場合、開かれるファイルの最大数は、使用できるターゲットメモリによって制限されます。

  • 長さがゼロのファイル、つまり出力ストリームによって文字が書き込まれなかったファイルも作成されます。

  • ファイルは読み出し用には何回でも開くことができますが、書き込みまたは更新用に開くことは 1 回しかできません。1 つのファイルをあるストリーム上で読み出し中に、別のストリーム上で書き込みまたは更新する目的で同時に開くことはできません。

  • ローカルタイムゾーンとサマータイムは実装されていません。 戻り値は、これらの情報を使用できないことを示します。 例えば、gmtime() 関数は必ず NULL を返します。

  • exit() によって返されるステータスは、渡された値と同じです。 EXIT_SUCCESSEXIT_FAILURE の定義については、ヘッダファイル stdlib.h を参照して下さい。 ただし、セミホスティングが実行環境にステータスを返すことはありません。

  • strerror() 関数によって返されるエラーメッセージは、perror() 関数によって返されるエラーメッセージと同じです。

  • 要求されたエリアのサイズがゼロである場合、calloc()realloc()NULL を返します。

  • 要求されたエリアのサイズがゼロである場合、malloc() はゼロサイズのブロックを指すポインタを返します。

  • abort() は開いているファイルをすべて閉じ、すべての一時ファイルを削除します。

  • fprintf()%p 引数では、精度に 8 が指定された場合と同様に小文字の 16 進数形式を出力します。 バリアント形式(%#p)の場合は、数値の前に文字 @ が付きます。

  • fscanf() は、%p 引数を %x 引数とまったく同じように処理します。

  • fscanf() は、%...[...] 引数内の文字 "-" を常にリテラル文字として処理します。

  • ftell() および fgetpos() は、失敗時には errno の値を EDOM に設定します。

  • perror() は、Table 2.16 に示すメッセージを生成します。

Table 2.16. perror() メッセージ

エラーメッセージ
0No error (errno = 0)
EDOM

EDOM - function argument out of range

ERANGE

ERANGE - function result not representable

ESIGNUM

ESIGNUM - illegal signal number

その他

Unknown error

ISO 準拠の実装で規定する必要のある以下の特性は、ARM C ライブラリでは規定されていません。

  • ファイル名の妥当性

  • remove() によって開いているファイルを削除できるかどうか

  • 新しい名前が既に存在している場合に、rename() 関数を呼び出したときの影響

  • getenv() の呼び出しによる影響(デフォルトでは NULL が返され、使用できる値はありません)

  • system() の呼び出しによる影響

  • clock(). によって返される値

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0349AJ
Non-Confidential