jcs's openbsd hax
openbsd

Test bitstring macro evaluation.

For all bitstring macros, add a test with side effects in the
arguments. Also fix compiler warnings and wrap long line. In
main() replace exit(0) with return(0) to check stack canary. Create
expected test files with make target create-good.

OK florian deraadt@

bluhm a4a66a2b 4491bd90

+136 -26
+11 -18
regress/include/bitstring/Makefile
··· 1 - # $OpenBSD: Makefile,v 1.4 2002/09/02 20:01:43 avsm Exp $ 1 + # $OpenBSD: Makefile,v 1.5 2024/08/26 12:15:40 bluhm Exp $ 2 2 # $NetBSD: Makefile,v 1.4 1995/04/20 22:37:50 cgd Exp $ 3 3 4 - PROG= ./bitstring_test 4 + PROG= bitstring_test 5 5 6 - REGRESS_TARGETS=test-8 test-27 test-32 test-49 test-64 test-67 6 + REGRESS_TARGETS= 7 7 8 - test-8: ${PROG} 9 - ${PROG} 8 | diff - ${.CURDIR}/good/8 8 + .for i in 8 27 32 49 64 67 10 9 11 - test-27: ${PROG} 12 - ${PROG} 27 | diff - ${.CURDIR}/good/27 10 + REGRESS_TARGETS+= run-test-$i 11 + run-test-$i: ${PROG} 12 + ./${PROG} $i | diff - ${.CURDIR}/good/$i 13 13 14 - test-32: ${PROG} 15 - ${PROG} 32 | diff - ${.CURDIR}/good/32 16 - 17 - test-49: ${PROG} 18 - ${PROG} 49 | diff - ${.CURDIR}/good/49 19 - 20 - test-64: ${PROG} 21 - ${PROG} 64 | diff - ${.CURDIR}/good/64 14 + create-good: create-$i 15 + create-$i: ${PROG} 16 + ./${PROG} $i >${.CURDIR}/good/$i 22 17 23 - test-67: ${PROG} 24 - ${PROG} 67 | diff - ${.CURDIR}/good/67 25 - 18 + .endfor 26 19 27 20 .include <bsd.regress.mk>
+41 -8
regress/include/bitstring/bitstring_test.c
··· 1 - /* $OpenBSD: bitstring_test.c,v 1.6 2024/08/23 17:19:16 florian Exp $ */ 1 + /* $OpenBSD: bitstring_test.c,v 1.7 2024/08/26 12:15:40 bluhm Exp $ */ 2 2 /* $NetBSD: bitstring_test.c,v 1.4 1995/04/29 05:44:35 cgd Exp $ */ 3 3 4 4 /* ··· 6 6 * inspect the output, you should notice problems 7 7 * choose the ATT or BSD flavor 8 8 */ 9 - /* #define ATT /*- */ 9 + // #define ATT /*-*/ 10 10 #define BSD /*-*/ 11 11 12 12 /* ··· 39 39 static void 40 40 printbits(bitstr_t *b, int n) 41 41 { 42 - register int i; 42 + register int i, k; 43 43 int jc, js; 44 44 45 45 bit_ffc(b, n, &jc); ··· 54 54 int 55 55 main(int argc, char *argv[]) 56 56 { 57 - int i; 57 + int i, j, k, *p; 58 58 bitstr_t *bs; 59 59 bitstr_t bit_decl(bss, DECL_TEST_LENGTH); 60 60 ··· 64 64 TEST_LENGTH = DECL_TEST_LENGTH; 65 65 66 66 if (TEST_LENGTH < 4) { 67 - fprintf(stderr, "TEST_LENGTH must be at least 4, but it is %d\n", 67 + fprintf(stderr, 68 + "TEST_LENGTH must be at least 4, but it is %d\n", 68 69 TEST_LENGTH); 69 70 exit(1); 70 71 } ··· 92 93 } 93 94 (void) printf("be: 1 0 "); 94 95 for (i = 0; i < TEST_LENGTH; i++) 95 - (void) putchar(*("100" + (i % 3))); 96 + (void) putchar("100"[i % 3]); 96 97 (void) printf("\nis: "); 97 98 printbits(bs, TEST_LENGTH); 98 99 ··· 102 103 } 103 104 (void) printf("be: 0 3 "); 104 105 for (i = 0; i < TEST_LENGTH; i++) 105 - (void) putchar(*("000100" + (i % 6))); 106 + (void) putchar("000100"[i % 6]); 106 107 (void) printf("\nis: "); 107 108 printbits(bs, TEST_LENGTH); 108 109 ··· 220 221 printbits(bs, TEST_LENGTH); 221 222 } 222 223 224 + (void) printf("\n"); 225 + (void) printf("macros should evaluate arguments only once\n"); 226 + i = j = 0; 227 + _bit_byte(i++); 228 + (void) printf("_bit_byte(%d) -> %d\n", j++, i); 229 + _bit_mask(i++); 230 + (void) printf("_bit_mask(%d) -> %d\n", j++, i); 231 + bitstr_size(i++); 232 + (void) printf("bitstr_size(%d) -> %d\n", j++, i); 233 + free(bit_alloc(i++)); 234 + (void) printf("bit_alloc(%d) -> %d\n", j++, i); 235 + { bitstr_t bit_decl(bd, i++); } 236 + (void) printf("bit_alloc(%d) -> %d\n", j++, i); 237 + bit_test(bs, i++); 238 + (void) printf("bit_test(%d) -> %d\n", j++, i); 239 + bit_set(bs, i++); 240 + (void) printf("bit_set(%d) -> %d\n", j++, i); 241 + bit_clear(bs, i++); 242 + (void) printf("bit_clear(%d) -> %d\n", j++, i); 243 + i %= TEST_LENGTH; j %= TEST_LENGTH; 244 + bit_nclear(bs, i++, i++); 245 + (void) printf("bit_nclear(%d, %d) -> %d\n", j, j + 1, i); 246 + j += 2; 247 + bit_nset(bs, i++, i++); 248 + (void) printf("bit_nset(%d, %d) -> %d\n", j, j + 1, i); 249 + j += 2; 250 + p = &k; 251 + bit_ffc(bs, i++, p++); 252 + (void) printf("bit_ffc(%d, %ld) -> %d\n", j++, --p - &k, i); 253 + bit_ffs(bs, i++, p++); 254 + (void) printf("bit_ffs(%d, %ld) -> %d\n", j++, --p - &k, i); 255 + 223 256 (void) free(bs); 224 - (void) exit(0); 257 + return (0); 225 258 }
+14
regress/include/bitstring/good/27
··· 290 290 24 0 2 001000000000000000000000100 291 291 25 0 1 010000000000000000000000010 292 292 26 1 0 100000000000000000000000001 293 + 294 + macros should evaluate arguments only once 295 + _bit_byte(0) -> 1 296 + _bit_mask(1) -> 2 297 + bitstr_size(2) -> 3 298 + bit_alloc(3) -> 4 299 + bit_alloc(4) -> 5 300 + bit_test(5) -> 6 301 + bit_set(6) -> 7 302 + bit_clear(7) -> 8 303 + bit_nclear(8, 9) -> 10 304 + bit_nset(10, 11) -> 12 305 + bit_ffc(12, 0) -> 13 306 + bit_ffs(13, 0) -> 14
+14
regress/include/bitstring/good/32
··· 335 335 29 0 2 00100000000000000000000000000100 336 336 30 0 1 01000000000000000000000000000010 337 337 31 1 0 10000000000000000000000000000001 338 + 339 + macros should evaluate arguments only once 340 + _bit_byte(0) -> 1 341 + _bit_mask(1) -> 2 342 + bitstr_size(2) -> 3 343 + bit_alloc(3) -> 4 344 + bit_alloc(4) -> 5 345 + bit_test(5) -> 6 346 + bit_set(6) -> 7 347 + bit_clear(7) -> 8 348 + bit_nclear(8, 9) -> 10 349 + bit_nset(10, 11) -> 12 350 + bit_ffc(12, 0) -> 13 351 + bit_ffs(13, 0) -> 14
+14
regress/include/bitstring/good/49
··· 488 488 46 0 2 0010000000000000000000000000000000000000000000100 489 489 47 0 1 0100000000000000000000000000000000000000000000010 490 490 48 1 0 1000000000000000000000000000000000000000000000001 491 + 492 + macros should evaluate arguments only once 493 + _bit_byte(0) -> 1 494 + _bit_mask(1) -> 2 495 + bitstr_size(2) -> 3 496 + bit_alloc(3) -> 4 497 + bit_alloc(4) -> 5 498 + bit_test(5) -> 6 499 + bit_set(6) -> 7 500 + bit_clear(7) -> 8 501 + bit_nclear(8, 9) -> 10 502 + bit_nset(10, 11) -> 12 503 + bit_ffc(12, 0) -> 13 504 + bit_ffs(13, 0) -> 14
+14
regress/include/bitstring/good/64
··· 623 623 61 0 2 0010000000000000000000000000000000000000000000000000000000000100 624 624 62 0 1 0100000000000000000000000000000000000000000000000000000000000010 625 625 63 1 0 1000000000000000000000000000000000000000000000000000000000000001 626 + 627 + macros should evaluate arguments only once 628 + _bit_byte(0) -> 1 629 + _bit_mask(1) -> 2 630 + bitstr_size(2) -> 3 631 + bit_alloc(3) -> 4 632 + bit_alloc(4) -> 5 633 + bit_test(5) -> 6 634 + bit_set(6) -> 7 635 + bit_clear(7) -> 8 636 + bit_nclear(8, 9) -> 10 637 + bit_nset(10, 11) -> 12 638 + bit_ffc(12, 0) -> 13 639 + bit_ffs(13, 0) -> 14
+14
regress/include/bitstring/good/67
··· 650 650 64 0 2 0010000000000000000000000000000000000000000000000000000000000000100 651 651 65 0 1 0100000000000000000000000000000000000000000000000000000000000000010 652 652 66 1 0 1000000000000000000000000000000000000000000000000000000000000000001 653 + 654 + macros should evaluate arguments only once 655 + _bit_byte(0) -> 1 656 + _bit_mask(1) -> 2 657 + bitstr_size(2) -> 3 658 + bit_alloc(3) -> 4 659 + bit_alloc(4) -> 5 660 + bit_test(5) -> 6 661 + bit_set(6) -> 7 662 + bit_clear(7) -> 8 663 + bit_nclear(8, 9) -> 10 664 + bit_nset(10, 11) -> 12 665 + bit_ffc(12, 0) -> 13 666 + bit_ffs(13, 0) -> 14
+14
regress/include/bitstring/good/8
··· 119 119 5 0 2 00100100 120 120 6 0 1 01000010 121 121 7 1 0 10000001 122 + 123 + macros should evaluate arguments only once 124 + _bit_byte(0) -> 1 125 + _bit_mask(1) -> 2 126 + bitstr_size(2) -> 3 127 + bit_alloc(3) -> 4 128 + bit_alloc(4) -> 5 129 + bit_test(5) -> 6 130 + bit_set(6) -> 7 131 + bit_clear(7) -> 8 132 + bit_nclear(0, 1) -> 2 133 + bit_nset(2, 3) -> 4 134 + bit_ffc(4, 0) -> 5 135 + bit_ffs(5, 0) -> 6