Solaris 動的トレースガイド

第 6 章 文字列

DTrace では、文字列をトレースし、操作できます。この章では、D 言語での文字列の宣言および操作の全機能について説明します。ANSI-C の場合とは異なり、D の文字列では、独自の組み込み型と演算子を使用できます。これらの型と演算子は、意味が明白で、トレースプログラム内で簡単に使用できます。

文字列表現

DTrace では、文字列は NULL バイト (値がゼロのバイトで、通常 '\0' と記述される) で終わる文字配列として表現されます。文字列の可視部分は可変長で、NULL バイトの位置によって長さが決まります。しかし、DTrace では、各プローブが決まった量のデータをトレースするように、各文字列が固定サイズの配列に格納されます。文字列の長さは、あらかじめ定義されたこの制限長内に収まっていなければなりませんが、この制限長は D プログラム内で変更できます。dtrace コマンド行で strsize オプションをチューニングして変更することもできます。チューニング可能な DTrace オプションについては、第 16 章オプションとチューニング可能パラメータを参照してください。デフォルトの制限長は 256 バイトです。

D 言語で文字列を参照するときは、char * 型ではなく、明示的な string 型を使用します。string 型は、文字シーケンスのアドレスであるという点では char * 型と共通していますが、string 型の式では、D コンパイラや trace() などの D 関数の拡張機能を利用できます。たとえば、string 型では、文字列の実バイトをトレースするとき、char * 型のようなあいまいな点がありません。次の D 文を参照してください。

trace(s);

schar * 型の場合、DTrace はポインタ s の値をトレースします。つまり、整数アドレス値がトレースされることになります。次の D 文を参照してください。

trace(*s);

この場合、演算子 * の定義により、D コンパイラはポインタ s を間接参照し、その位置にある単一の文字をトレースします。この動作を利用して、単一の文字や、文字列でなく NULL バイトで終わっていないバイトサイズの整数配列を意図的に参照するような文字ポインタを操作できます。次の D 文を参照してください。

trace(s);

sstring 型の場合、この string 型は、変数 s にアドレスが格納されている NULL で終わる文字列をトレースするように、D コンパイラに指示を送ります。「文字列比較」で説明するように、string 型の式の文字列大小比較を行うこともできます。

文字列定数

文字列定数は、二重引用符 (") で囲まれた形式で表され、D コンパイラにより自動的に string 型が割り当てられます。DTrace に割り当てられたシステムメモリーの容量が許す範囲で、任意の長さの文字列定数を定義できます。文字列定数を宣言すると、D コンパイラにより、自動的に終了 NULL バイト (\0) が付加されます。文字列定数オブジェクトのサイズは、この文字列のバイト数に終了 NULL バイト (1 バイト) を加えた長さです。

文字列定数には、改行文字をそのまま含めることはできません。改行文字を含めたい場合は、実際に改行文字を入力する代わりに、\n というエスケープシーケンスを入力します。文字列定数には、文字定数で使用できる特殊文字エスケープシーケンス (表 2–5 を参照) を含めることができます。

文字列代入

char * 変数の代入の場合とは異なり、文字列は、参照ではなく値ごとにコピーされます。文字列代入では、演算子 = により、元のオペランドの文字列の実バイトと NULL バイトが、左式の変数 (string 型) にコピーされます。string 型の変数を新しく作成するには、この変数に string 型の式を割り当てます。たとえば、次の D 文を参照してください。

s = "hello";

この D 文では、string 型の新しい変数 s が作成され、そこに 6 バイトの文字列 "hello" (出力可能文字 5 バイトおよび NULL バイト) がコピーされます。文字列代入は、C ライブラリ関数 strcpy(3C) とよく似ていますが、元の文字列がコピー先の文字列の記憶容量を超過した場合、最終的な文字列では、超過分が自動的に切り捨てられます。

文字列変数に、文字列と互換性のある型の式を代入することもできます。この場合、元の式が D コンパイラにより自動的に string 型に拡張され、文字列代入が行われます。D コンパイラには、char * 型または char[n] 型 (任意のサイズの char 型のスカラー配列) の任意の式を、string 型へと拡張する機能があります。

文字列変換

その他の型の式は、キャスト式の利用または特殊な演算子 stringof の適用により、明示的に string 型に変換できます。どちらの方法を使用しても同じことです。

s = (string) expression				s = stringof ( expression )

演算子 stringof は、右側のオペランドに非常に緊密に結合されます。通常、わかりやすいように式を丸括弧で囲みますが、必須ではありません。

ポインタ、整数、スカラー配列アドレスなど、スカラー型の式はすべて、文字列に変換できます。void など、その他の型の式は、string 型には変換できません。誤って無効なアドレスを文字列に変換した場合でも、DTrace には保護機能があるので、システムや DTrace 自体に悪影響が及ぶことはありません。しかし、解読不能な文字シーケンスをトレースしてしまうことになります。

文字列比較

D では、二項関係演算子が多重定義されており、これらの演算子を使って、整数の比較だけでなく文字列の比較も行うことができます。関係演算子では、両方のオペランドが string 型であるか、一方のオペランドが string 型でもう一方のオペランドが string 型に拡張可能 (「文字列代入」を参照) であれば、文字列比較が行われます。文字列比較には、すべての関係演算子を使用できます。

表 6–1 文字列で使用できる D の関係演算子

<

左のオペランドは右のオペランドより小さい 

<=

左のオペランドは右のオペランド以下 

>

左のオペランドは右のオペランドより大きい 

>=

左のオペランドは右のオペランド以上 

==

左のオペランドは右のオペランドと等しい 

!=

左のオペランドは右のオペランドと等しくない 

整数で使用する場合と同じく、各演算子は、int 型の値 (条件が真の場合は 1、偽の場合は 0) を返します。

関係演算子では、C ライブラリルーチン strcmp(3C) の場合と同様に、2 つの入力文字列がバイト単位で比較されます。個々のバイトの比較には、ASCII 文字セット内の対応する整数値が使用されます (ascii(5) を参照)。NULL バイトが検出されるか、最大文字列長に達したら、比較は終了します。以下に、D の文字列比較とその結果の例を示します。

"coffee" < "espresso"

... 1 (真) を返す 

"coffee" == "coffee"

... 1 (真) を返す 

"coffee" >= "mocha"

... 0 (偽) を返す