/*@-paramuse@*/
/*@only@*/ int *globonly;
/*@shared@*/ int *globshared1;
/*@shared@*/ int *globshared2;
/*@only@*/ int *zonly;
void f(/*@only@*/ int *x, /*@temp@*/ int *y, /*@shared@*/ int *z)
{
*x = 3;
if (3 > *x)
return; /* 1. bad x not released */
} /* 2. bad x not released */
int f2(/*@temp@*/ int *x, /*@only@*/ int *y)
{
*x = 3;
*y = 6;
return 3; /* 3. bad y not released */
}
void f3(/*@only@*/ int *x)
{
globshared1 = x; /* 4. bad shared globshared1 <- only x */
} /* 5. only not released */
void f4(/*@only@*/ int *x)
{
zonly = x; /* 6. bad - didn't release zonly */
} /* okay */
int g(int *imp)
{
int x = 3;
int *y = malloc(sizeof(int));
int *y2 = malloc(sizeof(int));
int *y3 = malloc(sizeof(int));
if (y2) *y2 = 3;
f3 (imp); /* 7. bad if +memimplicit --- unqualified as only */
*imp = 5; /* 8. uses released */
(void) f(&x, /* 9, 10. pass immediate as only, only parameter aliased */
&x,
globshared1);
(void) f2 (y3, y3); /* 11-15. --- 2 * null passed as nonnull, 2 * not completely def
only parameter y3 aliased */
*y3 = 6; /* 16, 17. bad --- y3 was released, null */
(void) f(y, globshared1, globshared1); /* 18, 19. null as non-null, y not completely def */
(void) f(globshared1, /* 20. pass shared as only */
globshared2,
globshared2);
free (globshared2); /* 21. bad --- free's shared! (pass shared as only) */
free (globonly);
return *y; /* 22-25. y used after release, possible null,
locally allocated y2 not released,
globonly is released */
}
syntax highlighted by Code2HTML, v. 0.9.1