Sun Studio 12: C ユーザーズガイド

5.3 lint によるチェック

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

lint が検出を行い、警告メッセージを生成する状況は 4 つあります。

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

次の例では、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; /* 構造体ポインタへのスカラーポインタのキャストエラー */
}

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; /* 構造体ポインタへの void ポインタのキャストエラー */
}

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

次の例では、構造体メンバー foo.b のアドレスが struct 型のポインタとしてキャストされたあと、p に割り当てられます。lint -Xalias_level=weak (またはそれ以上) を指定すると、警告メッセージが生成されます。


struct foo p{
    int a;
    int b;
  };

struct foo *f1;
struct foo *f2;

void main()
{
    f2 = (struct foo *)&f1->b; /* 構造体ポインタへのスカラーポインタの */
                               /* キャストエラー                       */
}

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

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