JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

3.  C コードの並列化

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

5.1 型に基づく解析の概要

5.2 微調整におけるプラグマの使用

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] ...)

5.2.1.7 #pragma ivdep

5.3 lint によるチェック

5.3.1 構造体ポインタへのスカラーポインタのキャスト

5.3.2 構造体ポインタへの void ポインタのキャスト

5.3.3 構造体ポインタへの構造体フィールドのキャスト

5.3.4 明示的な別名設定が必要

5.4 メモリー参照の制限の例

5.4.1 例: 別名のレベル

5.4.2 例: さまざまな別名レベルでのコンパイル

5.4.3 例: 内部ポインタ

5.4.4 例: 構造体のフィールド

5.4.5 例: 共用体

5.4.6 例: 構造体の構造体

5.4.7 例: プラグマの使用

6.  ISO C への移行

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 の機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

G.  パフォーマンスチューニング

H.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

5.3 lint によるチェック

lint プログラムは、同一レベルの型に基づく別名の明確化を、コンパイラの -xalias_level コマンドとして認識します。また、lint プログラムは、この章で説明されている型に基づく別名の明確化に関連するプラグマも認識します。-Xalias_level コマンドの詳細は、「4.3.38 -Xalias_level[=l ]を参照してください。

lint が検出して警告を生成する 4 つの状況を、次に示します。

5.3.1 構造体ポインタへのスカラーポインタのキャスト

次の例では、integer 型のポインタ pstruct 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 */
}

5.3.2 構造体ポインタへの void ポインタのキャスト

次の例では、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 */
}

5.3.3 構造体ポインタへの構造体フィールドのキャスト

次の例では、構造体メンバーのアドレス 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*/
}

5.3.4 明示的な別名設定が必要

次の例では、struct fooa 型のポインタ f1 が型 struct foob 型のポインタとしてキャストされています。lint で -Xalias_level=strict (またはそれ以上) を指定する場合、構造体の型がまったく同じ (同じ型で同数の構造体フィールド) でないかぎり、このようなキャストは明示的な別名設定を必要とします。また、別名レベルが standardstrong の場合、別名設定を実行するにはタグの一致が必要であると仮定されます。f1 への割り当て前に #pragma alias (struct fooastruct 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 */
}