extern int printf(const char*, ...);static int glob_i = 0; void incr_glob_i(int *i){ glob_i += *i;} #define INCR_GI { \ int i __attribute__ ((__cleanup__(incr_glob_i))) = 1; \ } #define INCR_GI0 INCR_GI INCR_GI INCR_GI INCR_GI#define INCR_GI1 INCR_GI0 INCR_GI0 INCR_GI0 INCR_GI0#define INCR_GI2 INCR_GI1 INCR_GI1 INCR_GI1 INCR_GI1#define INCR_GI3 INCR_GI2 INCR_GI2 INCR_GI2 INCR_GI2#define INCR_GI4 INCR_GI3 INCR_GI3 INCR_GI3 INCR_GI3#define INCR_GI5 INCR_GI4 INCR_GI4 INCR_GI4 INCR_GI4#define INCR_GI6 INCR_GI5 INCR_GI5 INCR_GI5 INCR_GI5#define INCR_GI7 INCR_GI6 INCR_GI6 INCR_GI6 INCR_GI6 void check2(char **hum); void check(int *j){ char * __attribute__ ((cleanup(check2))) stop_that = "wololo"; int chk = 0; { char * __attribute__ ((cleanup(check2))) stop_that = "plop"; { non_plopage: printf("---- %d\n", chk); } if (!chk) { chk = 1; goto non_plopage; } } { char * __attribute__ ((cleanup(check2))) stop_that = "tata !"; goto out; stop_that = "titi"; } again: chk = 2; { char * __attribute__ ((cleanup(check2))) cascade1 = "1"; { char * __attribute__ ((cleanup(check2))) cascade2 = "2"; { char * __attribute__ ((cleanup(check2))) cascade3 = "3"; goto out; cascade3 = "nope"; } } } out: if (chk != 2) goto again; { { char * __attribute__ ((cleanup(check2))) out = "last goto out"; ++chk; if (chk != 3) goto out; } } return;} void check_oh_i(char *oh_i){ printf("c: %c\n", *oh_i);} void goto_hell(double *f){ printf("oo: %f\n", *f);} char *test(){ char *__attribute__ ((cleanup(check2))) str = "I don't think this should be print(but gcc got it wrong too)"; return str;} void test_ret_subcall(char *that){ printf("should be print before\n");} void test_ret(){ char *__attribute__ ((cleanup(check2))) that = "that"; return test_ret_subcall(that);} void test_ret2(){ char *__attribute__ ((cleanup(check2))) that = "-that"; { char *__attribute__ ((cleanup(check2))) that = "this should appear only once"; } { char *__attribute__ ((cleanup(check2))) that = "-that2"; return; }} void test2(void) { int chk = 0;again: if (!chk) { char * __attribute__ ((cleanup(check2))) stop_that = "test2"; chk++; goto again; }} int test3(void) { char * __attribute__ ((cleanup(check2))) stop_that = "three"; int chk = 0; if (chk) { { outside: { char * __attribute__ ((cleanup(check2))) stop_that = "two"; printf("---- %d\n", chk); } } } if (!chk) { char * __attribute__ ((cleanup(check2))) stop_that = "one"; if (!chk) { chk = 1; goto outside; } } return 0;} void cl(int *ip){ printf("%d\n", *ip);} void loop_cleanups(void){ __attribute__((cleanup(cl))) int l = 1000; printf("-- loop 0 --\n"); for ( __attribute__((cleanup(cl))) int i = 0; i < 10; ++i) { __attribute__((cleanup(cl))) int j = 100; } printf("-- loop 1 --\n"); for (__attribute__((cleanup(cl))) int i = 0; i < 10; ++i) { __attribute__((cleanup(cl))) int j = 200; continue; } printf("-- loop 2 --\n"); for (__attribute__((cleanup(cl))) int i = 0; i < 10; ++i) { __attribute__((cleanup(cl))) int j = 300; break; } printf("-- loop 3 --\n"); for (int i = 0; i < 2; ++i) { __attribute__((cleanup(cl))) int j = 400; switch (i) { case 0: continue; default: { __attribute__((cleanup(cl))) int jj = 500; break; } } } printf("after break\n");} int main(){ int i __attribute__ ((__cleanup__(check))) = 0, not_i; int chk = 0; (void)not_i; { __attribute__ ((__cleanup__(check_oh_i))) char oh_i = 'o', o = 'a'; } INCR_GI7; printf("glob_i: %d\n", glob_i); naaaaaaaa: if (!chk) { __attribute__ ((__cleanup__(check_oh_i))) char oh_i = 'f'; double __attribute__ ((__cleanup__(goto_hell))) f = 2.6; chk = 1; goto naaaaaaaa; } i = 105; printf("because what if free was call inside cleanup function %s\n", test()); test_ret(); test_ret2(); test2(); test3(); loop_cleanups(); return i;} void check2(char **hum){ printf("str: %s\n", *hum);}
extern int printf(const char*, ...);
static int glob_i = 0;
void incr_glob_i(int *i)
{
glob_i += *i;
}
#define INCR_GI { \
int i __attribute__ ((__cleanup__(incr_glob_i))) = 1; \
}
#define INCR_GI0 INCR_GI INCR_GI INCR_GI INCR_GI
#define INCR_GI1 INCR_GI0 INCR_GI0 INCR_GI0 INCR_GI0
#define INCR_GI2 INCR_GI1 INCR_GI1 INCR_GI1 INCR_GI1
#define INCR_GI3 INCR_GI2 INCR_GI2 INCR_GI2 INCR_GI2
#define INCR_GI4 INCR_GI3 INCR_GI3 INCR_GI3 INCR_GI3
#define INCR_GI5 INCR_GI4 INCR_GI4 INCR_GI4 INCR_GI4
#define INCR_GI6 INCR_GI5 INCR_GI5 INCR_GI5 INCR_GI5
#define INCR_GI7 INCR_GI6 INCR_GI6 INCR_GI6 INCR_GI6
void check2(char **hum);
void check(int *j)
{
char * __attribute__ ((cleanup(check2))) stop_that = "wololo";
int chk = 0;
{
char * __attribute__ ((cleanup(check2))) stop_that = "plop";
{
non_plopage:
printf("---- %d\n", chk);
}
if (!chk) {
chk = 1;
goto non_plopage;
}
}
{
char * __attribute__ ((cleanup(check2))) stop_that = "tata !";
goto out;
stop_that = "titi";
}
again:
chk = 2;
{
char * __attribute__ ((cleanup(check2))) cascade1 = "1";
{
char * __attribute__ ((cleanup(check2))) cascade2 = "2";
{
char * __attribute__ ((cleanup(check2))) cascade3 = "3";
goto out;
cascade3 = "nope";
}
}
}
out:
if (chk != 2)
goto again;
{
{
char * __attribute__ ((cleanup(check2))) out = "last goto out";
++chk;
if (chk != 3)
goto out;
}
}
return;
}
void check_oh_i(char *oh_i)
{
printf("c: %c\n", *oh_i);
}
void goto_hell(double *f)
{
printf("oo: %f\n", *f);
}
char *test()
{
char *__attribute__ ((cleanup(check2))) str = "I don't think this should be print(but gcc got it wrong too)";
return str;
}
void test_ret_subcall(char *that)
{
printf("should be print before\n");
}
void test_ret()
{
char *__attribute__ ((cleanup(check2))) that = "that";
return test_ret_subcall(that);
}
void test_ret2()
{
char *__attribute__ ((cleanup(check2))) that = "-that";
{
char *__attribute__ ((cleanup(check2))) that = "this should appear only once";
}
{
char *__attribute__ ((cleanup(check2))) that = "-that2";
return;
}
}
void test2(void) {
int chk = 0;
again:
if (!chk) {
char * __attribute__ ((cleanup(check2))) stop_that = "test2";
chk++;
goto again;
}
}
int test3(void) {
char * __attribute__ ((cleanup(check2))) stop_that = "three";
int chk = 0;
if (chk) {
{
outside:
{
char * __attribute__ ((cleanup(check2))) stop_that = "two";
printf("---- %d\n", chk);
}
}
}
if (!chk)
{
char * __attribute__ ((cleanup(check2))) stop_that = "one";
if (!chk) {
chk = 1;
goto outside;
}
}
return 0;
}
void cl(int *ip)
{
printf("%d\n", *ip);
}
void loop_cleanups(void)
{
__attribute__((cleanup(cl))) int l = 1000;
printf("-- loop 0 --\n");
for ( __attribute__((cleanup(cl))) int i = 0; i < 10; ++i) {
__attribute__((cleanup(cl))) int j = 100;
}
printf("-- loop 1 --\n");
for (__attribute__((cleanup(cl))) int i = 0; i < 10; ++i) {
__attribute__((cleanup(cl))) int j = 200;
continue;
}
printf("-- loop 2 --\n");
for (__attribute__((cleanup(cl))) int i = 0; i < 10; ++i) {
__attribute__((cleanup(cl))) int j = 300;
break;
}
printf("-- loop 3 --\n");
for (int i = 0; i < 2; ++i) {
__attribute__((cleanup(cl))) int j = 400;
switch (i) {
case 0:
continue;
default:
{
__attribute__((cleanup(cl))) int jj = 500;
break;
}
}
}
printf("after break\n");
}
int main()
{
int i __attribute__ ((__cleanup__(check))) = 0, not_i;
int chk = 0;
(void)not_i;
{
__attribute__ ((__cleanup__(check_oh_i))) char oh_i = 'o', o = 'a';
}
INCR_GI7;
printf("glob_i: %d\n", glob_i);
naaaaaaaa:
if (!chk) {
__attribute__ ((__cleanup__(check_oh_i))) char oh_i = 'f';
double __attribute__ ((__cleanup__(goto_hell))) f = 2.6;
chk = 1;
goto naaaaaaaa;
}
i = 105;
printf("because what if free was call inside cleanup function %s\n", test());
test_ret();
test_ret2();
test2();
test3();
loop_cleanups();
return i;
}
void check2(char **hum)
{
printf("str: %s\n", *hum);
}