考虑以下源代码示例。
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 作为别名。
fp->f2 可将 cp->c2 作为别名,因为 *dp 可将 *cp 作为别名,且 *fp 可将 dp->db 作为别名。
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 作为别名。