新しいC言語には
classical int x = f(x) ; // エラー
int x = f(x) ; // OK
という風にclassicalキーワードを用意してみては

struct _tag {
struct _tag *next, *prev;
} a = {&a, &a}; // えらー 無効なaを参照した