次の例のソースコードを考えてみましょう。
struct foo { int f1; int f2; } *fp; struct bar { int b1; int b2; } *bp; struct cat { int c1; struct foo cf; int c2; int c3; } *cp; struct dog { int d1; int d2; struct bar db; int d3; } *dp;
この例が -xalias_level=weak オプションでコンパイルされる場合、コンパイラは、次の別名情報を仮定します。
fp->f1 は、bp->b1、cp->c1、dp->d1、cp->cf.f1、および df->db.b1 を別名設定できます。
fp->f2 は、bp->b2、cp->cf.f1、dp->d2、cp->cf.f2、df->db.b2、cp->c2 を別名設定できます。
bp->b1 は、fp->f1、cp->c1、dp->d1、cp->cf.f1、および df->db.b1 を別名設定できます。
bp->b2 は、fp->f2、cp->cf.f1、dp->d2、cp->cf.f1、および df->db.b2 を別名設定できます。
*dp が *cp を別名設定でき、*fp が dp->db を別名設定できるため、fp->f2 は、cp->c2 を別名設定できます。
cp->c1 は、fp->f1、bp->b1、dp->d1、および dp->db.b1 を別名設定できます。
cp->cf.f1 は、fp->f1、fp->f2、bp->b1、bp->b2、dp->d2、および dp->d1 を別名設定できます。
cp->cf.f1 は dp->db.b1 を別名設定しません。
cp->cf.f2 は、fp->f2、bp->b2、dp->db.b1、および dp->d2 を別名設定できます。
cp->c2 は、dp->db.b2 を別名設定できます。
cp->c2 は dp->db.b1 を別名設定せず、cp->c2 は dp->d3 を別名設定しません。
オフセットに関連して、*dp が cp->cf を別名設定する場合にかぎり、cp->c2 は db->db.b1 を別名設定できます。ただし、*dp が cp->cf を別名設定する場合、dp->db.b1 は foo cf の末尾を超えて別名設定する必要がありますが、これはオブジェクトの制限事項で禁じられています。そのため、コンパイラは、cp->c2 が db->db.b1 を別名設定できないと仮定します。
cp->c3 は、dp->d3 を別名設定できます。
cp->c3 は dp->db.b2 を別名設定しません。参照解除に関連する型のフィールドのオフセットが異なり、重複することがないため、これらのメモリー参照は別名設定を行いません。この事実に基づき、コンパイラは、それらのメモリー参照が別名設定できないと仮定します。
dp->d1 は、fp->f1、bp->b1、および cp->c1 を別名設定できます。
dp->d2 は、fp->f2、bp->b2、および cp->cf.f1 を別名設定できます。
dp->db.b1 は、fp->f1、bp->b1、および cp->c1 を別名設定できます。
dp->db.b2 は、fp->f2、bp->b2、cp->c2、および cp->cf.f1 を別名設定できます。
dp->d3 は、cp->c3 を別名設定できます。
dp->d3 は cp->cf.f2 を別名設定しません。参照解除に関連する型のフィールドのオフセットが異なり、重複することがないため、これらのメモリー参照は別名設定を行いません。この解析に基づき、コンパイラは、それらが別名設定できないと仮定します。
この例が -xalias_level=layout オプションでコンパイルされる場合、コンパイラでは、次の別名情報だけを想定します。
fp->f1、bp->b1、cp->c1、および dp->d1 はすべて相互に別名設定できます。
fp->f2、bp->b2、および dp->d2 はすべて相互に別名設定できます。
fp->f1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。
bp->b1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。
fp->f2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。
bp->b2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。
この例が -xalias_level=strict オプションでコンパイルされる場合、コンパイラでは、次の別名情報だけを想定します。
fp->f1 および bp->b1 は相互に別名設定できます。
fp->f2 および bp->b2 は相互に別名設定できます。
fp->f1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。
bp->b1 は、cp->cf.f1 および dp->db.b1 を別名設定できます。
fp->f2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。
bp->b2 は、cp->cf.f2 および dp->db.b2 を別名設定できます。
この例が -xalias_level=std オプションでコンパイルされる場合、コンパイラでは、次の別名情報だけを想定します。
fp->f1 は、cp->cf.f1 を別名設定できます。
bp->b1 は、dp->db.b1 を別名設定できます。
fp->f2 は、cp->cf.f2 を別名設定できます。
bp->b2 は、dp->db.b2 を別名設定できます。