comparison test/suite_aggrs/main.c @ 461:236015fdf7a8

suite_aggrs: - added support to gen unions in addition to structs - regenerated struct/union-mixed and nested cases - made rand-sig.lua ignore closing struct/union chars if not opened, effectively reducing number of empty aggregates as it now generated way too much
author Tassilo Philipp
date Mon, 31 Jan 2022 14:41:11 +0100
parents 0ae555528709
children 653b65580cb4
comparison
equal deleted inserted replaced
460:0ae555528709 461:236015fdf7a8
59 59
60 clear_V(); 60 clear_V();
61 61
62 dcReset(p); 62 dcReset(p);
63 63
64 if(*sig == '{') { 64 if(*sig == '{' || *sig == '<') {
65 int len; 65 int len;
66 int i = find_agg_idx(&len, sig); 66 int i = find_agg_idx(&len, sig);
67 if(i == -1) { 67 if(i == -1) {
68 printf("unknown rtype sig at '%s' ;", sig); 68 printf("unknown rtype sig at '%s' ;", sig);
69 return 0; 69 return 0;
90 case 'j': dcArgLong (p,K_j[pos]); break; 90 case 'j': dcArgLong (p,K_j[pos]); break;
91 case 'l': dcArgLongLong(p,K_l[pos]); break; 91 case 'l': dcArgLongLong(p,K_l[pos]); break;
92 case 'p': dcArgPointer (p,K_p[pos]); break; 92 case 'p': dcArgPointer (p,K_p[pos]); break;
93 case 'f': dcArgFloat (p,K_f[pos]); break; 93 case 'f': dcArgFloat (p,K_f[pos]); break;
94 case 'd': dcArgDouble (p,K_d[pos]); break; 94 case 'd': dcArgDouble (p,K_d[pos]); break;
95 case '{': { 95 case '<': /* union */
96 /* find struct sig */ 96 case '{': /* struct */
97 {
98 /* find aggregate sig */
97 int len; 99 int len;
98 DCstruct *st; 100 DCstruct *st;
99 int i = find_agg_idx(&len, sig); 101 int i = find_agg_idx(&len, sig);
100 if(i == -1) { 102 if(i == -1) {
101 printf("unknown sig at '%s' ;", sig); 103 printf("unknown sig at '%s' ;", sig);
120 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break; 122 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break;
121 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break; 123 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break;
122 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break; 124 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break;
123 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break; 125 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break;
124 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break; 126 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break;
125 case '{': { 127 case '<': /* union */
126 /* bound check memory adjacent to returned struct, to check for overflows by dcCallStruct */ 128 case '{': /* struct */
129 {
130 /* bound check memory adjacent to returned aggregate, to check for overflows by dcCallStruct */
127 long long* adj_ll = (get_max_aggr_size() - rtype_size) > sizeof(long long) ? (long long*)((char*)V_a[0] + rtype_size) : NULL; 131 long long* adj_ll = (get_max_aggr_size() - rtype_size) > sizeof(long long) ? (long long*)((char*)V_a[0] + rtype_size) : NULL;
128 if(adj_ll) 132 if(adj_ll)
129 *adj_ll = 0x0123456789abcdef; 133 *adj_ll = 0x0123456789abcdef;
130 134
131 s = ((int(*)(const void*,const void*))rtype_st_cmp)(dcCallStruct(p, t, rtype_st, V_a[0]), K_a[pos]); 135 s = ((int(*)(const void*,const void*))rtype_st_cmp)(dcCallStruct(p, t, rtype_st, V_a[0]), K_a[pos]);
152 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break; 156 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break;
153 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break; 157 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break;
154 case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ", pos, V_p[pos], K_p[pos]); break; 158 case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ", pos, V_p[pos], K_p[pos]); break;
155 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break; 159 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break;
156 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break; 160 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break;
157 case '{': { 161 case '<': /* union */
162 case '{': /* struct */
163 {
158 /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */ 164 /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */
159 int len; 165 int len;
160 int i = find_agg_idx(&len, sig); 166 int i = find_agg_idx(&len, sig);
161 s = ((int(*)(const void*,const void*))G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]); 167 s = ((int(*)(const void*,const void*))G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
162 if (!s) printf("'{':%d: *%p != *%p ; ", pos, V_a[pos], K_a[pos]); 168 if (!s) printf("'%c':%d: *%p != *%p ; ", atype, pos, V_a[pos], K_a[pos]);
163 sig += len-1; /* advance to next arg char */ 169 sig += len-1; /* advance to next arg char */
164 break; 170 break;
165 } 171 }
166 default: printf("unknown atype '%c' ; ", atype); return 0; 172 default: printf("unknown atype '%c' ; ", atype); return 0;
167 } 173 }
215 dcFreeStruct(((DCstruct*(*)())G_agg_touchdcstfuncs[i])()); 221 dcFreeStruct(((DCstruct*(*)())G_agg_touchdcstfuncs[i])());
216 222
217 dcFree(G_callvm); 223 dcFree(G_callvm);
218 deinit_test_data(G_maxargs); 224 deinit_test_data(G_maxargs);
219 225
220 printf("result: suite_aggrs: %d\n", total); 226 printf("result: suite_aggrs: %d %d\n", total, get_max_aggr_size());
221 227
222 dcTest_deInitPlatform(); 228 dcTest_deInitPlatform();
223 229
224 return !total; 230 return !total;
225 } 231 }