1295367Sdes/* $OpenBSD: test_helper.c,v 1.6 2015/03/03 20:42:49 djm Exp $ */ 2276707Sdes/* 3276707Sdes * Copyright (c) 2011 Damien Miller <djm@mindrot.org> 4276707Sdes * 5276707Sdes * Permission to use, copy, modify, and distribute this software for any 6276707Sdes * purpose with or without fee is hereby granted, provided that the above 7276707Sdes * copyright notice and this permission notice appear in all copies. 8276707Sdes * 9276707Sdes * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10276707Sdes * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11276707Sdes * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12276707Sdes * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13276707Sdes * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14276707Sdes * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15276707Sdes * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16276707Sdes */ 17276707Sdes 18276707Sdes/* Utility functions/framework for regress tests */ 19276707Sdes 20276707Sdes#include "includes.h" 21276707Sdes 22276707Sdes#include <sys/types.h> 23276707Sdes#include <sys/param.h> 24295367Sdes#include <sys/uio.h> 25276707Sdes 26276707Sdes#include <fcntl.h> 27276707Sdes#include <stdio.h> 28276707Sdes#ifdef HAVE_STDINT_H 29276707Sdes# include <stdint.h> 30276707Sdes#endif 31276707Sdes#include <stdlib.h> 32276707Sdes#include <string.h> 33276707Sdes#include <assert.h> 34276707Sdes#include <unistd.h> 35295367Sdes#include <signal.h> 36276707Sdes 37276707Sdes#include <openssl/bn.h> 38276707Sdes 39276707Sdes#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS) 40276707Sdes# include <vis.h> 41276707Sdes#endif 42276707Sdes 43276707Sdes#include "test_helper.h" 44295367Sdes#include "atomicio.h" 45276707Sdes 46276707Sdes#define TEST_CHECK_INT(r, pred) do { \ 47276707Sdes switch (pred) { \ 48276707Sdes case TEST_EQ: \ 49276707Sdes if (r == 0) \ 50276707Sdes return; \ 51276707Sdes break; \ 52276707Sdes case TEST_NE: \ 53276707Sdes if (r != 0) \ 54276707Sdes return; \ 55276707Sdes break; \ 56276707Sdes case TEST_LT: \ 57276707Sdes if (r < 0) \ 58276707Sdes return; \ 59276707Sdes break; \ 60276707Sdes case TEST_LE: \ 61276707Sdes if (r <= 0) \ 62276707Sdes return; \ 63276707Sdes break; \ 64276707Sdes case TEST_GT: \ 65276707Sdes if (r > 0) \ 66276707Sdes return; \ 67276707Sdes break; \ 68276707Sdes case TEST_GE: \ 69276707Sdes if (r >= 0) \ 70276707Sdes return; \ 71276707Sdes break; \ 72276707Sdes default: \ 73276707Sdes abort(); \ 74276707Sdes } \ 75276707Sdes } while (0) 76276707Sdes 77276707Sdes#define TEST_CHECK(x1, x2, pred) do { \ 78276707Sdes switch (pred) { \ 79276707Sdes case TEST_EQ: \ 80276707Sdes if (x1 == x2) \ 81276707Sdes return; \ 82276707Sdes break; \ 83276707Sdes case TEST_NE: \ 84276707Sdes if (x1 != x2) \ 85276707Sdes return; \ 86276707Sdes break; \ 87276707Sdes case TEST_LT: \ 88276707Sdes if (x1 < x2) \ 89276707Sdes return; \ 90276707Sdes break; \ 91276707Sdes case TEST_LE: \ 92276707Sdes if (x1 <= x2) \ 93276707Sdes return; \ 94276707Sdes break; \ 95276707Sdes case TEST_GT: \ 96276707Sdes if (x1 > x2) \ 97276707Sdes return; \ 98276707Sdes break; \ 99276707Sdes case TEST_GE: \ 100276707Sdes if (x1 >= x2) \ 101276707Sdes return; \ 102276707Sdes break; \ 103276707Sdes default: \ 104276707Sdes abort(); \ 105276707Sdes } \ 106276707Sdes } while (0) 107276707Sdes 108276707Sdesextern char *__progname; 109276707Sdes 110276707Sdesstatic int verbose_mode = 0; 111276707Sdesstatic int quiet_mode = 0; 112276707Sdesstatic char *active_test_name = NULL; 113276707Sdesstatic u_int test_number = 0; 114276707Sdesstatic test_onerror_func_t *test_onerror = NULL; 115276707Sdesstatic void *onerror_ctx = NULL; 116276707Sdesstatic const char *data_dir = NULL; 117295367Sdesstatic char subtest_info[512]; 118276707Sdes 119276707Sdesint 120276707Sdesmain(int argc, char **argv) 121276707Sdes{ 122276707Sdes int ch; 123276707Sdes 124276707Sdes /* Handle systems without __progname */ 125276707Sdes if (__progname == NULL) { 126276707Sdes __progname = strrchr(argv[0], '/'); 127276707Sdes if (__progname == NULL || __progname[1] == '\0') 128276707Sdes __progname = argv[0]; 129276707Sdes else 130276707Sdes __progname++; 131276707Sdes if ((__progname = strdup(__progname)) == NULL) { 132276707Sdes fprintf(stderr, "strdup failed\n"); 133276707Sdes exit(1); 134276707Sdes } 135276707Sdes } 136276707Sdes 137276707Sdes while ((ch = getopt(argc, argv, "vqd:")) != -1) { 138276707Sdes switch (ch) { 139276707Sdes case 'd': 140276707Sdes data_dir = optarg; 141276707Sdes break; 142276707Sdes case 'q': 143276707Sdes verbose_mode = 0; 144276707Sdes quiet_mode = 1; 145276707Sdes break; 146276707Sdes case 'v': 147276707Sdes verbose_mode = 1; 148276707Sdes quiet_mode = 0; 149276707Sdes break; 150276707Sdes default: 151276707Sdes fprintf(stderr, "Unrecognised command line option\n"); 152276707Sdes fprintf(stderr, "Usage: %s [-v]\n", __progname); 153276707Sdes exit(1); 154276707Sdes } 155276707Sdes } 156276707Sdes setvbuf(stdout, NULL, _IONBF, 0); 157276707Sdes if (!quiet_mode) 158276707Sdes printf("%s: ", __progname); 159276707Sdes if (verbose_mode) 160276707Sdes printf("\n"); 161276707Sdes 162276707Sdes tests(); 163276707Sdes 164276707Sdes if (!quiet_mode) 165276707Sdes printf(" %u tests ok\n", test_number); 166276707Sdes return 0; 167276707Sdes} 168276707Sdes 169276707Sdesconst char * 170276707Sdestest_data_file(const char *name) 171276707Sdes{ 172276707Sdes static char ret[PATH_MAX]; 173276707Sdes 174276707Sdes if (data_dir != NULL) 175276707Sdes snprintf(ret, sizeof(ret), "%s/%s", data_dir, name); 176276707Sdes else 177276707Sdes strlcpy(ret, name, sizeof(ret)); 178276707Sdes if (access(ret, F_OK) != 0) { 179276707Sdes fprintf(stderr, "Cannot access data file %s: %s\n", 180276707Sdes ret, strerror(errno)); 181276707Sdes exit(1); 182276707Sdes } 183276707Sdes return ret; 184276707Sdes} 185276707Sdes 186276707Sdesvoid 187295367Sdestest_info(char *s, size_t len) 188295367Sdes{ 189295367Sdes snprintf(s, len, "In test %u: \"%s\"%s%s\n", test_number, 190295367Sdes active_test_name == NULL ? "<none>" : active_test_name, 191295367Sdes *subtest_info != '\0' ? " - " : "", subtest_info); 192295367Sdes} 193295367Sdes 194295367Sdes#ifdef SIGINFO 195295367Sdesstatic void 196295367Sdessiginfo(int unused __attribute__((__unused__))) 197295367Sdes{ 198295367Sdes char buf[256]; 199295367Sdes 200295367Sdes test_info(buf, sizeof(buf)); 201295367Sdes atomicio(vwrite, STDERR_FILENO, buf, strlen(buf)); 202295367Sdes} 203295367Sdes#endif 204295367Sdes 205295367Sdesvoid 206276707Sdestest_start(const char *n) 207276707Sdes{ 208276707Sdes assert(active_test_name == NULL); 209276707Sdes assert((active_test_name = strdup(n)) != NULL); 210295367Sdes *subtest_info = '\0'; 211276707Sdes if (verbose_mode) 212276707Sdes printf("test %u - \"%s\": ", test_number, active_test_name); 213276707Sdes test_number++; 214295367Sdes#ifdef SIGINFO 215295367Sdes signal(SIGINFO, siginfo); 216295367Sdes#endif 217276707Sdes} 218276707Sdes 219276707Sdesvoid 220276707Sdesset_onerror_func(test_onerror_func_t *f, void *ctx) 221276707Sdes{ 222276707Sdes test_onerror = f; 223276707Sdes onerror_ctx = ctx; 224276707Sdes} 225276707Sdes 226276707Sdesvoid 227276707Sdestest_done(void) 228276707Sdes{ 229295367Sdes *subtest_info = '\0'; 230276707Sdes assert(active_test_name != NULL); 231276707Sdes free(active_test_name); 232276707Sdes active_test_name = NULL; 233276707Sdes if (verbose_mode) 234276707Sdes printf("OK\n"); 235276707Sdes else if (!quiet_mode) { 236276707Sdes printf("."); 237276707Sdes fflush(stdout); 238276707Sdes } 239276707Sdes} 240276707Sdes 241276707Sdesvoid 242295367Sdestest_subtest_info(const char *fmt, ...) 243295367Sdes{ 244295367Sdes va_list ap; 245295367Sdes 246295367Sdes va_start(ap, fmt); 247295367Sdes vsnprintf(subtest_info, sizeof(subtest_info), fmt, ap); 248295367Sdes va_end(ap); 249295367Sdes} 250295367Sdes 251295367Sdesvoid 252276707Sdesssl_err_check(const char *file, int line) 253276707Sdes{ 254276707Sdes long openssl_error = ERR_get_error(); 255276707Sdes 256276707Sdes if (openssl_error == 0) 257276707Sdes return; 258276707Sdes 259276707Sdes fprintf(stderr, "\n%s:%d: uncaught OpenSSL error: %s", 260276707Sdes file, line, ERR_error_string(openssl_error, NULL)); 261276707Sdes abort(); 262276707Sdes} 263276707Sdes 264276707Sdesstatic const char * 265276707Sdespred_name(enum test_predicate p) 266276707Sdes{ 267276707Sdes switch (p) { 268276707Sdes case TEST_EQ: 269276707Sdes return "EQ"; 270276707Sdes case TEST_NE: 271276707Sdes return "NE"; 272276707Sdes case TEST_LT: 273276707Sdes return "LT"; 274276707Sdes case TEST_LE: 275276707Sdes return "LE"; 276276707Sdes case TEST_GT: 277276707Sdes return "GT"; 278276707Sdes case TEST_GE: 279276707Sdes return "GE"; 280276707Sdes default: 281276707Sdes return "UNKNOWN"; 282276707Sdes } 283276707Sdes} 284276707Sdes 285276707Sdesstatic void 286276707Sdestest_die(void) 287276707Sdes{ 288276707Sdes if (test_onerror != NULL) 289276707Sdes test_onerror(onerror_ctx); 290276707Sdes abort(); 291276707Sdes} 292276707Sdes 293276707Sdesstatic void 294276707Sdestest_header(const char *file, int line, const char *a1, const char *a2, 295276707Sdes const char *name, enum test_predicate pred) 296276707Sdes{ 297295367Sdes fprintf(stderr, "\n%s:%d test #%u \"%s\"%s%s\n", 298295367Sdes file, line, test_number, active_test_name, 299295367Sdes *subtest_info != '\0' ? " - " : "", subtest_info); 300276707Sdes fprintf(stderr, "ASSERT_%s_%s(%s%s%s) failed:\n", 301276707Sdes name, pred_name(pred), a1, 302276707Sdes a2 != NULL ? ", " : "", a2 != NULL ? a2 : ""); 303276707Sdes} 304276707Sdes 305276707Sdesvoid 306276707Sdesassert_bignum(const char *file, int line, const char *a1, const char *a2, 307276707Sdes const BIGNUM *aa1, const BIGNUM *aa2, enum test_predicate pred) 308276707Sdes{ 309276707Sdes int r = BN_cmp(aa1, aa2); 310276707Sdes 311276707Sdes TEST_CHECK_INT(r, pred); 312276707Sdes test_header(file, line, a1, a2, "BIGNUM", pred); 313276707Sdes fprintf(stderr, "%12s = 0x%s\n", a1, BN_bn2hex(aa1)); 314276707Sdes fprintf(stderr, "%12s = 0x%s\n", a2, BN_bn2hex(aa2)); 315276707Sdes test_die(); 316276707Sdes} 317276707Sdes 318276707Sdesvoid 319276707Sdesassert_string(const char *file, int line, const char *a1, const char *a2, 320276707Sdes const char *aa1, const char *aa2, enum test_predicate pred) 321276707Sdes{ 322295367Sdes int r; 323276707Sdes 324295367Sdes /* Verify pointers are not NULL */ 325295367Sdes assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE); 326295367Sdes assert_ptr(file, line, a2, "NULL", aa2, NULL, TEST_NE); 327295367Sdes 328295367Sdes r = strcmp(aa1, aa2); 329276707Sdes TEST_CHECK_INT(r, pred); 330276707Sdes test_header(file, line, a1, a2, "STRING", pred); 331276707Sdes fprintf(stderr, "%12s = %s (len %zu)\n", a1, aa1, strlen(aa1)); 332276707Sdes fprintf(stderr, "%12s = %s (len %zu)\n", a2, aa2, strlen(aa2)); 333276707Sdes test_die(); 334276707Sdes} 335276707Sdes 336276707Sdesstatic char * 337276707Sdestohex(const void *_s, size_t l) 338276707Sdes{ 339276707Sdes u_int8_t *s = (u_int8_t *)_s; 340276707Sdes size_t i, j; 341276707Sdes const char *hex = "0123456789abcdef"; 342276707Sdes char *r = malloc((l * 2) + 1); 343276707Sdes 344276707Sdes assert(r != NULL); 345276707Sdes for (i = j = 0; i < l; i++) { 346276707Sdes r[j++] = hex[(s[i] >> 4) & 0xf]; 347276707Sdes r[j++] = hex[s[i] & 0xf]; 348276707Sdes } 349276707Sdes r[j] = '\0'; 350276707Sdes return r; 351276707Sdes} 352276707Sdes 353276707Sdesvoid 354276707Sdesassert_mem(const char *file, int line, const char *a1, const char *a2, 355276707Sdes const void *aa1, const void *aa2, size_t l, enum test_predicate pred) 356276707Sdes{ 357295367Sdes int r; 358276707Sdes 359295367Sdes if (l == 0) 360295367Sdes return; 361295367Sdes /* If length is >0, then verify pointers are not NULL */ 362295367Sdes assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE); 363295367Sdes assert_ptr(file, line, a2, "NULL", aa2, NULL, TEST_NE); 364295367Sdes 365295367Sdes r = memcmp(aa1, aa2, l); 366276707Sdes TEST_CHECK_INT(r, pred); 367276707Sdes test_header(file, line, a1, a2, "STRING", pred); 368276707Sdes fprintf(stderr, "%12s = %s (len %zu)\n", a1, tohex(aa1, MIN(l, 256)), l); 369276707Sdes fprintf(stderr, "%12s = %s (len %zu)\n", a2, tohex(aa2, MIN(l, 256)), l); 370276707Sdes test_die(); 371276707Sdes} 372276707Sdes 373276707Sdesstatic int 374276707Sdesmemvalcmp(const u_int8_t *s, u_char v, size_t l, size_t *where) 375276707Sdes{ 376276707Sdes size_t i; 377276707Sdes 378276707Sdes for (i = 0; i < l; i++) { 379276707Sdes if (s[i] != v) { 380276707Sdes *where = i; 381276707Sdes return 1; 382276707Sdes } 383276707Sdes } 384276707Sdes return 0; 385276707Sdes} 386276707Sdes 387276707Sdesvoid 388276707Sdesassert_mem_filled(const char *file, int line, const char *a1, 389276707Sdes const void *aa1, u_char v, size_t l, enum test_predicate pred) 390276707Sdes{ 391276707Sdes size_t where = -1; 392295367Sdes int r; 393276707Sdes char tmp[64]; 394276707Sdes 395276707Sdes if (l == 0) 396276707Sdes return; 397295367Sdes /* If length is >0, then verify the pointer is not NULL */ 398295367Sdes assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE); 399295367Sdes 400295367Sdes r = memvalcmp(aa1, v, l, &where); 401276707Sdes TEST_CHECK_INT(r, pred); 402276707Sdes test_header(file, line, a1, NULL, "MEM_ZERO", pred); 403276707Sdes fprintf(stderr, "%20s = %s%s (len %zu)\n", a1, 404276707Sdes tohex(aa1, MIN(l, 20)), l > 20 ? "..." : "", l); 405276707Sdes snprintf(tmp, sizeof(tmp), "(%s)[%zu]", a1, where); 406276707Sdes fprintf(stderr, "%20s = 0x%02x (expected 0x%02x)\n", tmp, 407276707Sdes ((u_char *)aa1)[where], v); 408276707Sdes test_die(); 409276707Sdes} 410276707Sdes 411276707Sdesvoid 412276707Sdesassert_int(const char *file, int line, const char *a1, const char *a2, 413276707Sdes int aa1, int aa2, enum test_predicate pred) 414276707Sdes{ 415276707Sdes TEST_CHECK(aa1, aa2, pred); 416276707Sdes test_header(file, line, a1, a2, "INT", pred); 417276707Sdes fprintf(stderr, "%12s = %d\n", a1, aa1); 418276707Sdes fprintf(stderr, "%12s = %d\n", a2, aa2); 419276707Sdes test_die(); 420276707Sdes} 421276707Sdes 422276707Sdesvoid 423276707Sdesassert_size_t(const char *file, int line, const char *a1, const char *a2, 424276707Sdes size_t aa1, size_t aa2, enum test_predicate pred) 425276707Sdes{ 426276707Sdes TEST_CHECK(aa1, aa2, pred); 427276707Sdes test_header(file, line, a1, a2, "SIZE_T", pred); 428276707Sdes fprintf(stderr, "%12s = %zu\n", a1, aa1); 429276707Sdes fprintf(stderr, "%12s = %zu\n", a2, aa2); 430276707Sdes test_die(); 431276707Sdes} 432276707Sdes 433276707Sdesvoid 434276707Sdesassert_u_int(const char *file, int line, const char *a1, const char *a2, 435276707Sdes u_int aa1, u_int aa2, enum test_predicate pred) 436276707Sdes{ 437276707Sdes TEST_CHECK(aa1, aa2, pred); 438276707Sdes test_header(file, line, a1, a2, "U_INT", pred); 439276707Sdes fprintf(stderr, "%12s = %u / 0x%x\n", a1, aa1, aa1); 440276707Sdes fprintf(stderr, "%12s = %u / 0x%x\n", a2, aa2, aa2); 441276707Sdes test_die(); 442276707Sdes} 443276707Sdes 444276707Sdesvoid 445276707Sdesassert_long_long(const char *file, int line, const char *a1, const char *a2, 446276707Sdes long long aa1, long long aa2, enum test_predicate pred) 447276707Sdes{ 448276707Sdes TEST_CHECK(aa1, aa2, pred); 449276707Sdes test_header(file, line, a1, a2, "LONG LONG", pred); 450276707Sdes fprintf(stderr, "%12s = %lld / 0x%llx\n", a1, aa1, aa1); 451276707Sdes fprintf(stderr, "%12s = %lld / 0x%llx\n", a2, aa2, aa2); 452276707Sdes test_die(); 453276707Sdes} 454276707Sdes 455276707Sdesvoid 456276707Sdesassert_char(const char *file, int line, const char *a1, const char *a2, 457276707Sdes char aa1, char aa2, enum test_predicate pred) 458276707Sdes{ 459276707Sdes char buf[8]; 460276707Sdes 461276707Sdes TEST_CHECK(aa1, aa2, pred); 462276707Sdes test_header(file, line, a1, a2, "CHAR", pred); 463276707Sdes fprintf(stderr, "%12s = '%s' / 0x02%x\n", a1, 464276707Sdes vis(buf, aa1, VIS_SAFE|VIS_NL|VIS_TAB|VIS_OCTAL, 0), aa1); 465276707Sdes fprintf(stderr, "%12s = '%s' / 0x02%x\n", a1, 466276707Sdes vis(buf, aa2, VIS_SAFE|VIS_NL|VIS_TAB|VIS_OCTAL, 0), aa2); 467276707Sdes test_die(); 468276707Sdes} 469276707Sdes 470276707Sdesvoid 471276707Sdesassert_u8(const char *file, int line, const char *a1, const char *a2, 472276707Sdes u_int8_t aa1, u_int8_t aa2, enum test_predicate pred) 473276707Sdes{ 474276707Sdes TEST_CHECK(aa1, aa2, pred); 475276707Sdes test_header(file, line, a1, a2, "U8", pred); 476276707Sdes fprintf(stderr, "%12s = 0x%02x %u\n", a1, aa1, aa1); 477276707Sdes fprintf(stderr, "%12s = 0x%02x %u\n", a2, aa2, aa2); 478276707Sdes test_die(); 479276707Sdes} 480276707Sdes 481276707Sdesvoid 482276707Sdesassert_u16(const char *file, int line, const char *a1, const char *a2, 483276707Sdes u_int16_t aa1, u_int16_t aa2, enum test_predicate pred) 484276707Sdes{ 485276707Sdes TEST_CHECK(aa1, aa2, pred); 486276707Sdes test_header(file, line, a1, a2, "U16", pred); 487276707Sdes fprintf(stderr, "%12s = 0x%04x %u\n", a1, aa1, aa1); 488276707Sdes fprintf(stderr, "%12s = 0x%04x %u\n", a2, aa2, aa2); 489276707Sdes test_die(); 490276707Sdes} 491276707Sdes 492276707Sdesvoid 493276707Sdesassert_u32(const char *file, int line, const char *a1, const char *a2, 494276707Sdes u_int32_t aa1, u_int32_t aa2, enum test_predicate pred) 495276707Sdes{ 496276707Sdes TEST_CHECK(aa1, aa2, pred); 497276707Sdes test_header(file, line, a1, a2, "U32", pred); 498276707Sdes fprintf(stderr, "%12s = 0x%08x %u\n", a1, aa1, aa1); 499276707Sdes fprintf(stderr, "%12s = 0x%08x %u\n", a2, aa2, aa2); 500276707Sdes test_die(); 501276707Sdes} 502276707Sdes 503276707Sdesvoid 504276707Sdesassert_u64(const char *file, int line, const char *a1, const char *a2, 505276707Sdes u_int64_t aa1, u_int64_t aa2, enum test_predicate pred) 506276707Sdes{ 507276707Sdes TEST_CHECK(aa1, aa2, pred); 508276707Sdes test_header(file, line, a1, a2, "U64", pred); 509276707Sdes fprintf(stderr, "%12s = 0x%016llx %llu\n", a1, 510276707Sdes (unsigned long long)aa1, (unsigned long long)aa1); 511276707Sdes fprintf(stderr, "%12s = 0x%016llx %llu\n", a2, 512276707Sdes (unsigned long long)aa2, (unsigned long long)aa2); 513276707Sdes test_die(); 514276707Sdes} 515276707Sdes 516276707Sdesvoid 517276707Sdesassert_ptr(const char *file, int line, const char *a1, const char *a2, 518276707Sdes const void *aa1, const void *aa2, enum test_predicate pred) 519276707Sdes{ 520276707Sdes TEST_CHECK(aa1, aa2, pred); 521276707Sdes test_header(file, line, a1, a2, "PTR", pred); 522276707Sdes fprintf(stderr, "%12s = %p\n", a1, aa1); 523276707Sdes fprintf(stderr, "%12s = %p\n", a2, aa2); 524276707Sdes test_die(); 525276707Sdes} 526276707Sdes 527