⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 struct-layout-1_generate.c

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
      {	e[0].etype = ETYPE_STRUCT;	e[1].etype = ETYPE_TYPE;	e[1].type = &vector_types[i];	output (e);	e[0].etype = ETYPE_UNION;	output (e);      }}voidchoose_type (enum FEATURE features, struct entry *e, int r, int in_array){  int i;  i = NTYPES2 - NTYPES1;  if (features & FEATURE_COMPLEX)    i += NCTYPES2;  if (features & FEATURE_VECTOR)    i += NVTYPES2;  if ((r & 3) == 0)    {      if (in_array)	{	  i += NAATYPES2;	  if (features & FEATURE_COMPLEX)	    i += NCAATYPES2;	}      else	{	  i += NATYPES2;	  if (features & FEATURE_COMPLEX)	    i += NCATYPES2;	}    }  r >>= 2;  r %= i;  if (r < NTYPES2 - NTYPES1)    e->type = &base_types[r + NTYPES1];  r -= NTYPES2 - NTYPES1;  if (e->type == NULL && (features & FEATURE_COMPLEX))    {      if (r < NCTYPES2)	e->type = &complex_types[r];      r -= NCTYPES2;    }  if (e->type == NULL && (features & FEATURE_VECTOR))    {      if (r < NVTYPES2)	e->type = &vector_types[r];      r -= NVTYPES2;    }  if (e->type == NULL && !in_array)    {      if (r < NATYPES2)	e->type = &attrib_types[r];      r -= NATYPES2;    }  if (e->type == NULL && !in_array && (features & FEATURE_COMPLEX))    {      if (r < NCATYPES2)	e->type = &complex_attrib_types[r];      r -= NCATYPES2;    }  if (e->type == NULL && in_array)    {      if (r < NAATYPES2)	e->type = &attrib_array_types[r];      r -= NAATYPES2;    }  if (e->type == NULL && in_array && (features & FEATURE_COMPLEX))    {      if (r < NCAATYPES2)	e->type = &complex_attrib_array_types[r];      r -= NCAATYPES2;    }  if (e->type == NULL)    abort ();}/* This is from gcc.c-torture/execute/builtin-bitops-1.c.  */static intmy_ffsll (unsigned long long x){  int i;  if (x == 0)    return 0;  /* We've tested LLONG_MAX for 64 bits so this should be safe.  */  for (i = 0; i < 64; i++)    if (x & (1ULL << i))      break;  return i + 1;}voidgenerate_fields (enum FEATURE features, struct entry *e, struct entry *parent,		 int len){  int r, i, j, ret = 1, n, incr, sametype;  for (n = 0; n < len; n += incr)    {      r = generate_random ();      /* 50% ETYPE_TYPE base_types NTYPES1	 12.5% ETYPE_TYPE other	 12.5% ETYPE_ARRAY	 12.5% ETYPE_BITFLD	 12.5% ETYPE_STRUCT|ETYPE_UNION|ETYPE_STRUCT_ARRAY|ETYPE_UNION_ARRAY */      i = (r & 7);      r >>= 3;      incr = 1;      switch (i)	{	case 0:	case 1:	case 2:	case 3:	  e[n].etype = ETYPE_TYPE;	  e[n].type = &base_types[r % NTYPES1];	  break;	case 4:	  e[n].etype = ETYPE_TYPE;	  choose_type (features, &e[n], r, 0);	  break;	case 5:	  e[n].etype = ETYPE_ARRAY;	  i = r & 1;	  r >>= 1;	  if (i)	    e[n].type = &base_types[r % NTYPES1];	  else	    choose_type (features, &e[n], r, 1);	  r = generate_random ();	  if ((features & FEATURE_ZEROARRAY) && (r & 3) == 0)	    {	      e[n].arr_len = 0;	      if (n == len - 1 && (r & 4)		  && (parent->etype == ETYPE_STRUCT		      || parent->etype == ETYPE_STRUCT_ARRAY))		{		  int k;		  for (k = 0; k < n; ++k)		    if (e[k].etype != ETYPE_BITFLD || e[k].len)		      {			e[n].arr_len = 255;			break;		      }		}	    }	  else if ((r & 3) != 3)	    e[n].arr_len = (r >> 2) & 7;	  else	    e[n].arr_len = (r >> 2) & 31;	  break;	case 6:	  sametype = 1;	  switch (r & 7)	    {	    case 0:	    case 1:	    case 2:	      break;	    case 3:	    case 4:	    case 5:	      incr = 1 + (r >> 3) % (len - n);	      break;	    case 6:	    case 7:	      sametype = 0;	      incr = 1 + (r >> 3) % (len - n);	      break;	    }	  for (j = n; j < n + incr; ++j)	    {	      int mi, ma;	      e[j].etype = ETYPE_BITFLD;	      if (j == n || !sametype)		{		  int k;		  r = generate_random ();		  k = r & 3;		  r >>= 2;		  if (!k)		    e[j].type		      = &aligned_bitfld_types[r % n_aligned_bitfld_types];		  else		    e[j].type		      = &bitfld_types[r % n_bitfld_types];		}	      else		e[j].type = e[n].type;	      r = generate_random ();	      mi = 0;	      ma = 0;	      switch (e[j].type->bitfld)	        {	        case 'C': ma = 8; break;	        case 'S': ma = 16; break;	        case 'I': ma = 32; break;	        case 'L':	        case 'Q': ma = 64; break;	        case 'B': ma = 1; break;	        case ' ':		  if (e[j].type->type == TYPE_UENUM)		    mi = my_ffsll (e[j].type->maxval + 1) - 1;		  else if (e[j].type->type == TYPE_SENUM)		    mi = my_ffsll (e[j].type->maxval + 1);		  else		    abort ();		  if (!mi)		    mi = 1;		  if (mi <= 32)		    ma = 32;		  else		    ma = 64;		  break;		default:		  abort ();	        }	      e[j].len = ma + 1;	      if (sametype && (r & 3) == 0 && ma > 1)		{		  int sum = 0, k;		  for (k = n; k < j; ++k)		    sum += e[k].len;		  sum %= ma;		  e[j].len = sum ? ma - sum : ma;		}	      r >>= 2;	      if (! (features & FEATURE_ZEROBITFLD) && mi == 0)		mi = 1;	      if (e[j].len < mi || e[j].len > ma)		e[j].len = mi + (r % (ma + 1 - mi));	      r >>= 6;	      if ((features & FEATURE_ZEROBITFLD) && (r & 3) == 0		  && mi == 0)		e[j].len = 0;	    }	  break;	case 7:	  switch (r & 7)	    {	    case 0:	    case 1:	    case 2:	      e[n].etype = ETYPE_STRUCT;	      break;	    case 3:	    case 4:	      e[n].etype = ETYPE_UNION;	      break;	    case 5:	    case 6:	      e[n].etype = ETYPE_STRUCT_ARRAY;	      break;	    case 7:	      e[n].etype = ETYPE_UNION_ARRAY;	      break;	    }	  r >>= 3;	  e[n].len = r % (len - n);	  incr = 1 + e[n].len;	  generate_fields (features, &e[n + 1], &e[n], e[n].len);	  if (e[n].etype == ETYPE_STRUCT_ARRAY	      || e[n].etype == ETYPE_UNION_ARRAY)	    {	      r = generate_random ();	      if ((features & FEATURE_ZEROARRAY) && (r & 3) == 0)		{		  e[n].arr_len = 0;		  if (n + incr == len && (r & 4)		      && (parent->etype == ETYPE_STRUCT			  || parent->etype == ETYPE_STRUCT_ARRAY))		    {		      int k;		      for (k = 0; k < n; ++k)			if (e[k].etype != ETYPE_BITFLD || e[k].len)			  {			    e[n].arr_len = 255;			    break;			  }		    }		}	      else if ((r & 3) != 3)		e[n].arr_len = (r >> 2) & 7;	      else		e[n].arr_len = (r >> 2) & 31;	    }	  break;	}      r = generate_random ();      if ((r & 7) == 0)	{	  r >>= 3;	  i = (features & FEATURE_ALIGNEDPACKED) ? NATTRIBS2 : NATTRIBS1;	  e[n].attrib = attributes[r % i];	  if (! (features & FEATURE_ALIGNEDPACKED)	      && strcmp (e[n].attrib, "atpa") == 0	      && ((e[n].type >= &attrib_types[0]		   && e[n].type < &attrib_types[NATYPES2])		  || (e[n].type >= &complex_attrib_types[0]		      && e[n].type < &complex_attrib_types[NCATYPES2])		  || (e[n].type >= &attrib_array_types[0]		      && e[n].type < &attrib_array_types[NAATYPES2])		  || (e[n].type >= &complex_attrib_array_types[0]		      && e[n].type < &complex_attrib_array_types[NAATYPES2])		  || (e[n].type >= &aligned_bitfld_types[0]		      && e[n].type < &aligned_bitfld_types[n_aligned_bitfld_types])))	    e[n].attrib = NULL;	}    }}voidgenerate_random_tests (enum FEATURE features, int len){  struct entry e[len + 1];  int i, r;  if (len > 'z' - 'a' + 1)    abort ();  memset (e, 0, sizeof (e));  r = generate_random ();  if ((r & 7) == 0)    e[0].etype = ETYPE_UNION;  else    e[0].etype = ETYPE_STRUCT;  r >>= 3;  e[0].len = len;  if ((r & 31) == 0)    {      r >>= 5;      if (features & FEATURE_ALIGNEDPACKED)	r %= NATTRIBS2;      else	r %= NATTRIBS1;      e[0].attrib = attributes[r];    }  generate_fields (features, &e[1], &e[0], len);  output (e);}struct { const char *name; enum FEATURE f; }features[] = {{ "normal", 0 },{ "complex", FEATURE_COMPLEX },{ "vector", FEATURE_VECTOR },{ "[0] :0", FEATURE_ZEROARRAY | FEATURE_ZEROBITFLD },{ "complex vector [0]",  FEATURE_COMPLEX | FEATURE_VECTOR | FEATURE_ZEROARRAY },{ "aligned packed complex vector [0] :0",  FEATURE_COMPLEX | FEATURE_VECTOR | FEATURE_ZEROARRAY  | FEATURE_ALIGNEDPACKED | FEATURE_ZEROBITFLD },};intmain (int argc, char **argv){  int i, j, count, c, n = 3000;  char *optarg;  if (sizeof (int) != 4 || sizeof (long long) != 8)    return 1;    i = 1;  while (i < argc)     {      c = '\0';      if (argv[i][0] == '-' && argv[i][2] == '\0')	c = argv[i][1];      optarg = argv[i + 1];      if (!optarg)	goto usage;      switch (c)	{	case 'n':	  n = atoi (optarg);	  break;	case 'd':	  destdir = optarg;	  break;	case 's':	  srcdir = optarg;	  break;	case 'i':	  output_one = 1;	  limidx = atoi (optarg);	  break;	default:	  fprintf (stderr, "unrecognized option %s\n", argv[i]);	  goto usage;      }      i += 2;    }  if (output_one)    {      outfile = fopen ("/dev/null", "w");      if (outfile == NULL)        {	  fputs ("could not open /dev/null", stderr);	  return 1;        }      n = limidx + 1;    }  if (destdir == NULL && !output_one)    {    usage:      fprintf (stderr, "Usage:\n\%s [-s srcdir -d destdir] [-n count] [-i idx]\n\Either -s srcdir -d destdir or -i idx must be used\n", argv[0]);      return 1;    }  if (srcdir == NULL && !output_one)    goto usage;  for (i = 0; i < NTYPES2; ++i)    if (base_types[i].bitfld)      bitfld_types[n_bitfld_types++] = base_types[i];  for (i = 0; i < NATYPES2; ++i)    if (attrib_types[i].bitfld)      aligned_bitfld_types[n_aligned_bitfld_types++] = attrib_types[i];  for (i = 0; i < sizeof (features) / sizeof (features[0]); ++i)    {      int startidx = idx;      if (! output_one)	limidx = idx;      if (!i)        count = 200;      else        count = 20;      for (j = 1; j <= 9; ++j)        while (idx < startidx + j * count)	  generate_random_tests (features[i].f, j);      while (idx < startidx + count * 10)	generate_random_tests (features[i].f, 10 + (generate_random () % 16));    }  for (i = 0; n > 3000 && i < sizeof (features) / sizeof (features[0]); ++i)    {      int startidx;      startidx = idx;      if (! output_one)	limidx = idx;      singles (features[i].f);      if (!i)	{	  count = 1000;	  while (idx < startidx + 1000)	    generate_random_tests (features[i].f, 1);	}      else	{	  startidx = idx;	  count = 100;	  while (idx < startidx + 100)	    generate_random_tests (features[i].f, 1);	}      startidx = idx;      for (j = 2; j <= 9; ++j)	while (idx < startidx + (j - 1) * count)	  generate_random_tests (features[i].f, j);      while (idx < startidx + count * 9)        generate_random_tests (features[i].f, 10 + (generate_random () % 16));    }  if (! output_one)    limidx = idx;  while (idx < n)    generate_random_tests (ALL_FEATURES, 1 + (generate_random () % 25));  fclose (outfile);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -