ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
Oracle Solaris Studio 12.3: C ユーザーガイド Oracle Solaris Studio 12.3 Information Library (日本語) |
5.2.1 #pragma alias_level level (list)
5.2.1.1 #pragma alias (type, type [, type]...)
5.2.1.2 #pragma alias (pointer, pointer [, pointer] ...)
5.2.1.3 #pragma may_point_to (pointer, variable [, variable] ...)
5.2.1.4 #pragma noalias (type, type [, type]...)
5.2.1.5 #pragma noalias (pointer, pointer [, pointer] ...)
5.2.1.6 #pragma may_not_point_to (pointer, variable [, variable] ...)
lint プログラムは、同一レベルの型に基づく別名の明確化を、コンパイラの -xalias_level コマンドとして認識します。また、lint プログラムは、この章で説明されている型に基づく別名の明確化に関連するプラグマも認識します。-Xalias_level コマンドの詳細は、「4.3.38 -Xalias_level[=l ]」を参照してください。
lint が検出して警告を生成する 4 つの状況を、次に示します。
構造体ポインタへスカラーポインタをキャストする
構造体ポインタへ void ポインタをキャストする
スカラーポインタへ構造体フィールドをキャストする
明示的な別名設定を行わずに、Xalias_level=strict レベルの構造体ポインタへ構造体ポインタをキャストする
次の例では、integer 型のポインタ p が struct foo 型のポインタとしてキャストされます。この例で lint -Xalias_level=weak (またはそれ以上) を指定すると、エラーが生成されます。
struct foo { int a; int b; }; struct foo *f; int *p; void main() { f = (struct foo *)p; /* struct pointer cast of scalar pointer error */ }
次の例では、void ポインタ vp が構造体ポインタとしてキャストされます。この例で lint -Xalias_level=weak (またはそれ以上) を指定すると、警告が生成されます。
struct foo { int a; int b; }; struct foo *f; void *vp; void main() { f = (struct foo *)vp; /* struct pointer cast of void pointer warning */ }
次の例では、構造体メンバーのアドレス foo.b は構造体ポインタとしてキャストされ、f2 に割り当てられます。この例で lint -Xalias_level=weak (またはそれ以上) を指定すると、エラーが生成されます。
struct foo{ int a; int b; }; struct foo *f1; struct foo *f2; void main() { f2 = (struct foo *)&f1->b; /* cast of a scalar pointer to struct pointer error*/ }
次の例では、struct fooa 型のポインタ f1 が型 struct foob 型のポインタとしてキャストされています。lint で -Xalias_level=strict (またはそれ以上) を指定する場合、構造体の型がまったく同じ (同じ型で同数の構造体フィールド) でないかぎり、このようなキャストは明示的な別名設定を必要とします。また、別名レベルが standard と strong の場合、別名設定を実行するにはタグの一致が必要であると仮定されます。f1 への割り当て前に #pragma alias (struct fooa、struct foob) を実行すると、lint は警告メッセージの生成を停止します。
struct fooa { int a; }; struct foob { int b; }; struct fooa *f1; struct foob *f2; void main() { f1 = (struct fooa *)f2; /* explicit aliasing required warning */ }