[cfe-users] Problems with block

W.Boeke via cfe-users cfe-users at lists.llvm.org
Sun Aug 7 10:41:08 PDT 2016


I wanted to investigate how Clang facilitates a kind of object-oriented programming style, using blocks. A first experiment was as follows:

// crash1.c
#include <stdio.h>

int (^f)();

void func() {
   __block int ext;
   f=^int {
     ext=7;
     printf("ext=%d\n",ext);
     return ext;
   };
}

int main() {
   func();
   for(int i=0;i<2;++i)
     printf("-> ext=%d\n",f());
}

I compiled with: clang -fblocks -lBlocksRuntime crash1.c. The result:

ext=7
-> ext=-1217394584
Segmentation fault (core dumped)

Thus a crash. The valgrind tool revealed that there were problems with the stack. Thus I tried to compile with option -fsanitize=safe-stack, and bingo!, the result as expected:

ext=7
-> ext=7
ext=7
-> ext=7

Then I tried a somewhat bigger program, inspired by an example for the Go language. It's a generator for fibonacci numbers.

// crash2.c
#include <stdio.h>
#include <stdlib.h>

typedef struct {
   int a,b;
   int (^f)();
} XX;

XX xx1,
    xx2;

void init(XX *x) {
   x->a=0; x->b=1;
   x->f= ^int {
     int out=x->a + x->b;
     x->a=x->b; x->b=out;
     return out;
   };
}

int main() {
   init(&xx1);
   init(&xx2);

   for (int i=0;i<3;++i) {
     printf("xx1: n=%d\n",xx1.f());
   };
   for (int i=0;i<3;++i) {
     printf("xx2: n=%d\n",xx2.f());
   };
}

The output was:

xx1: n=1
Segmentation fault (core dumped)

Another crash! Compiled with -fsanitize=safe-stack:

xx1: n=1
xx1: n=2
xx1: n=3
xx2: n=5
xx2: n=8
xx2: n=13

No crash, but no correct result either. There are 2 struct's, xx1 and xx2, so the output should be 1,2,3,1,2,3. It seems like only one struct was used however. Probably I don't understand how blocks 
exactly operate, but finally, by try and error, I found a way that seemed to work. But how was this code incorrect? The compiler version: 3.8.0-2ubuntu4.

W.Boeke




More information about the cfe-users mailing list