xref: /src/crypto/openssl/test/stack_test.c (revision f25b8c9fb4f58cf61adb47d7570abe7caa6d385d)
19dd13e84SCy Schubert /*
29dd13e84SCy Schubert  * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.
39dd13e84SCy Schubert  * Copyright (c) 2017, Oracle and/or its affiliates.  All rights reserved.
49dd13e84SCy Schubert  *
59dd13e84SCy Schubert  * Licensed under the Apache License 2.0 (the "License").  You may not use
69dd13e84SCy Schubert  * this file except in compliance with the License.  You can obtain a copy
79dd13e84SCy Schubert  * in the file LICENSE in the source distribution or at
89dd13e84SCy Schubert  * https://www.openssl.org/source/license.html
99dd13e84SCy Schubert  */
109dd13e84SCy Schubert 
119dd13e84SCy Schubert #include <stdio.h>
129dd13e84SCy Schubert #include <string.h>
139dd13e84SCy Schubert 
149dd13e84SCy Schubert #include <openssl/opensslconf.h>
159dd13e84SCy Schubert #include <openssl/safestack.h>
169dd13e84SCy Schubert #include <openssl/err.h>
179dd13e84SCy Schubert #include <openssl/crypto.h>
189dd13e84SCy Schubert 
199dd13e84SCy Schubert #include "internal/nelem.h"
209dd13e84SCy Schubert #include "testutil.h"
219dd13e84SCy Schubert 
229dd13e84SCy Schubert /* The macros below generate unused functions which error out one of the clang
239dd13e84SCy Schubert  * builds.  We disable this check here.
249dd13e84SCy Schubert  */
259dd13e84SCy Schubert #ifdef __clang__
269dd13e84SCy Schubert #pragma clang diagnostic ignored "-Wunused-function"
279dd13e84SCy Schubert #endif
289dd13e84SCy Schubert 
299dd13e84SCy Schubert typedef struct {
309dd13e84SCy Schubert     int n;
319dd13e84SCy Schubert     char c;
329dd13e84SCy Schubert } SS;
339dd13e84SCy Schubert 
349dd13e84SCy Schubert typedef union {
359dd13e84SCy Schubert     int n;
369dd13e84SCy Schubert     char c;
379dd13e84SCy Schubert } SU;
389dd13e84SCy Schubert 
DEFINE_SPECIAL_STACK_OF(sint,int)399dd13e84SCy Schubert DEFINE_SPECIAL_STACK_OF(sint, int)
409dd13e84SCy Schubert DEFINE_SPECIAL_STACK_OF_CONST(uchar, unsigned char)
419dd13e84SCy Schubert DEFINE_STACK_OF(SS)
429dd13e84SCy Schubert DEFINE_STACK_OF_CONST(SU)
439dd13e84SCy Schubert 
449dd13e84SCy Schubert static int int_compare(const int *const *a, const int *const *b)
459dd13e84SCy Schubert {
469dd13e84SCy Schubert     if (**a < **b)
479dd13e84SCy Schubert         return -1;
489dd13e84SCy Schubert     if (**a > **b)
499dd13e84SCy Schubert         return 1;
509dd13e84SCy Schubert     return 0;
519dd13e84SCy Schubert }
529dd13e84SCy Schubert 
test_int_stack(int reserve)539dd13e84SCy Schubert static int test_int_stack(int reserve)
549dd13e84SCy Schubert {
559dd13e84SCy Schubert     static int v[] = { 1, 2, -4, 16, 999, 1, -173, 1, 9 };
569dd13e84SCy Schubert     static int notpresent = -1;
579dd13e84SCy Schubert     const int n = OSSL_NELEM(v);
589dd13e84SCy Schubert     static struct {
599dd13e84SCy Schubert         int value;
609dd13e84SCy Schubert         int unsorted;
619dd13e84SCy Schubert         int sorted;
629dd13e84SCy Schubert         int ex;
639dd13e84SCy Schubert     } finds[] = {
649dd13e84SCy Schubert         { 2, 1, 5, 5 },
659dd13e84SCy Schubert         { 9, 7, 6, 6 },
669dd13e84SCy Schubert         { -173, 5, 0, 0 },
679dd13e84SCy Schubert         { 999, 3, 8, 8 },
689dd13e84SCy Schubert         { 0, -1, -1, 1 }
699dd13e84SCy Schubert     };
709dd13e84SCy Schubert     const int n_finds = OSSL_NELEM(finds);
719dd13e84SCy Schubert     static struct {
729dd13e84SCy Schubert         int value;
739dd13e84SCy Schubert         int ex;
749dd13e84SCy Schubert     } exfinds[] = {
759dd13e84SCy Schubert         { 3, 5 },
769dd13e84SCy Schubert         { 1000, 8 },
779dd13e84SCy Schubert         { 20, 8 },
789dd13e84SCy Schubert         { -999, 0 },
799dd13e84SCy Schubert         { -5, 0 },
809dd13e84SCy Schubert         { 8, 5 }
819dd13e84SCy Schubert     };
829dd13e84SCy Schubert     const int n_exfinds = OSSL_NELEM(exfinds);
839dd13e84SCy Schubert     STACK_OF(sint) *s = sk_sint_new_null();
849dd13e84SCy Schubert     int i;
859dd13e84SCy Schubert     int testresult = 0;
869dd13e84SCy Schubert 
879dd13e84SCy Schubert     if (!TEST_ptr(s)
889dd13e84SCy Schubert         || (reserve > 0 && !TEST_true(sk_sint_reserve(s, 5 * reserve))))
899dd13e84SCy Schubert         goto end;
909dd13e84SCy Schubert 
919dd13e84SCy Schubert     /* Check push and num */
929dd13e84SCy Schubert     for (i = 0; i < n; i++) {
939dd13e84SCy Schubert         if (!TEST_int_eq(sk_sint_num(s), i)) {
949dd13e84SCy Schubert             TEST_info("int stack size %d", i);
959dd13e84SCy Schubert             goto end;
969dd13e84SCy Schubert         }
979dd13e84SCy Schubert         sk_sint_push(s, v + i);
989dd13e84SCy Schubert     }
999dd13e84SCy Schubert     if (!TEST_int_eq(sk_sint_num(s), n))
1009dd13e84SCy Schubert         goto end;
1019dd13e84SCy Schubert 
1029dd13e84SCy Schubert     /* check the values */
1039dd13e84SCy Schubert     for (i = 0; i < n; i++)
1049dd13e84SCy Schubert         if (!TEST_ptr_eq(sk_sint_value(s, i), v + i)) {
1059dd13e84SCy Schubert             TEST_info("int value %d", i);
1069dd13e84SCy Schubert             goto end;
1079dd13e84SCy Schubert         }
1089dd13e84SCy Schubert 
1099dd13e84SCy Schubert     /* find unsorted -- the pointers are compared */
1109dd13e84SCy Schubert     for (i = 0; i < n_finds; i++) {
1119dd13e84SCy Schubert         int *val = (finds[i].unsorted == -1) ? &notpresent
1129dd13e84SCy Schubert                                              : v + finds[i].unsorted;
1139dd13e84SCy Schubert 
1149dd13e84SCy Schubert         if (!TEST_int_eq(sk_sint_find(s, val), finds[i].unsorted)) {
1159dd13e84SCy Schubert             TEST_info("int unsorted find %d", i);
1169dd13e84SCy Schubert             goto end;
1179dd13e84SCy Schubert         }
1189dd13e84SCy Schubert     }
1199dd13e84SCy Schubert 
1209dd13e84SCy Schubert     /* find_ex unsorted */
1219dd13e84SCy Schubert     for (i = 0; i < n_finds; i++) {
1229dd13e84SCy Schubert         int *val = (finds[i].unsorted == -1) ? &notpresent
1239dd13e84SCy Schubert                                              : v + finds[i].unsorted;
1249dd13e84SCy Schubert 
1259dd13e84SCy Schubert         if (!TEST_int_eq(sk_sint_find_ex(s, val), finds[i].unsorted)) {
1269dd13e84SCy Schubert             TEST_info("int unsorted find_ex %d", i);
1279dd13e84SCy Schubert             goto end;
1289dd13e84SCy Schubert         }
1299dd13e84SCy Schubert     }
1309dd13e84SCy Schubert 
1319dd13e84SCy Schubert     /* sorting */
1329dd13e84SCy Schubert     if (!TEST_false(sk_sint_is_sorted(s)))
1339dd13e84SCy Schubert         goto end;
1349dd13e84SCy Schubert     (void)sk_sint_set_cmp_func(s, &int_compare);
1359dd13e84SCy Schubert     sk_sint_sort(s);
1369dd13e84SCy Schubert     if (!TEST_true(sk_sint_is_sorted(s)))
1379dd13e84SCy Schubert         goto end;
1389dd13e84SCy Schubert 
1399dd13e84SCy Schubert     /* find sorted -- the value is matched so we don't need to locate it */
1409dd13e84SCy Schubert     for (i = 0; i < n_finds; i++)
1419dd13e84SCy Schubert         if (!TEST_int_eq(sk_sint_find(s, &finds[i].value), finds[i].sorted)) {
1429dd13e84SCy Schubert             TEST_info("int sorted find %d", i);
1439dd13e84SCy Schubert             goto end;
1449dd13e84SCy Schubert         }
1459dd13e84SCy Schubert 
1469dd13e84SCy Schubert     /* find_ex sorted */
1479dd13e84SCy Schubert     for (i = 0; i < n_finds; i++)
1489dd13e84SCy Schubert         if (!TEST_int_eq(sk_sint_find_ex(s, &finds[i].value), finds[i].ex)) {
1499dd13e84SCy Schubert             TEST_info("int sorted find_ex present %d", i);
1509dd13e84SCy Schubert             goto end;
1519dd13e84SCy Schubert         }
1529dd13e84SCy Schubert     for (i = 0; i < n_exfinds; i++)
1539dd13e84SCy Schubert         if (!TEST_int_eq(sk_sint_find_ex(s, &exfinds[i].value), exfinds[i].ex)) {
1549dd13e84SCy Schubert             TEST_info("int sorted find_ex absent %d", i);
1559dd13e84SCy Schubert             goto end;
1569dd13e84SCy Schubert         }
1579dd13e84SCy Schubert 
1589dd13e84SCy Schubert     /* shift */
1599dd13e84SCy Schubert     if (!TEST_ptr_eq(sk_sint_shift(s), v + 6))
1609dd13e84SCy Schubert         goto end;
1619dd13e84SCy Schubert 
1629dd13e84SCy Schubert     testresult = 1;
1639dd13e84SCy Schubert end:
1649dd13e84SCy Schubert     sk_sint_free(s);
1659dd13e84SCy Schubert     return testresult;
1669dd13e84SCy Schubert }
1679dd13e84SCy Schubert 
uchar_compare(const unsigned char * const * a,const unsigned char * const * b)1689dd13e84SCy Schubert static int uchar_compare(const unsigned char *const *a,
1699dd13e84SCy Schubert     const unsigned char *const *b)
1709dd13e84SCy Schubert {
1719dd13e84SCy Schubert     return **a - (signed int)**b;
1729dd13e84SCy Schubert }
1739dd13e84SCy Schubert 
test_uchar_stack(int reserve)1749dd13e84SCy Schubert static int test_uchar_stack(int reserve)
1759dd13e84SCy Schubert {
1769dd13e84SCy Schubert     static const unsigned char v[] = { 1, 3, 7, 5, 255, 0 };
1779dd13e84SCy Schubert     const int n = OSSL_NELEM(v);
1789dd13e84SCy Schubert     STACK_OF(uchar) *s = sk_uchar_new(&uchar_compare), *r = NULL;
1799dd13e84SCy Schubert     int i;
1809dd13e84SCy Schubert     int testresult = 0;
1819dd13e84SCy Schubert 
1829dd13e84SCy Schubert     if (!TEST_ptr(s)
1839dd13e84SCy Schubert         || (reserve > 0 && !TEST_true(sk_uchar_reserve(s, 5 * reserve))))
1849dd13e84SCy Schubert         goto end;
1859dd13e84SCy Schubert 
1869dd13e84SCy Schubert     /* unshift and num */
1879dd13e84SCy Schubert     for (i = 0; i < n; i++) {
1889dd13e84SCy Schubert         if (!TEST_int_eq(sk_uchar_num(s), i)) {
1899dd13e84SCy Schubert             TEST_info("uchar stack size %d", i);
1909dd13e84SCy Schubert             goto end;
1919dd13e84SCy Schubert         }
1929dd13e84SCy Schubert         sk_uchar_unshift(s, v + i);
1939dd13e84SCy Schubert     }
1949dd13e84SCy Schubert     if (!TEST_int_eq(sk_uchar_num(s), n))
1959dd13e84SCy Schubert         goto end;
1969dd13e84SCy Schubert 
1979dd13e84SCy Schubert     /* dup */
1989dd13e84SCy Schubert     r = sk_uchar_dup(NULL);
1999dd13e84SCy Schubert     if (sk_uchar_num(r) != 0)
2009dd13e84SCy Schubert         goto end;
2019dd13e84SCy Schubert     sk_uchar_free(r);
2029dd13e84SCy Schubert     r = sk_uchar_dup(s);
2039dd13e84SCy Schubert     if (!TEST_int_eq(sk_uchar_num(r), n))
2049dd13e84SCy Schubert         goto end;
2059dd13e84SCy Schubert     sk_uchar_sort(r);
2069dd13e84SCy Schubert 
2079dd13e84SCy Schubert     /* pop */
2089dd13e84SCy Schubert     for (i = 0; i < n; i++)
2099dd13e84SCy Schubert         if (!TEST_ptr_eq(sk_uchar_pop(s), v + i)) {
2109dd13e84SCy Schubert             TEST_info("uchar pop %d", i);
2119dd13e84SCy Schubert             goto end;
2129dd13e84SCy Schubert         }
2139dd13e84SCy Schubert 
2149dd13e84SCy Schubert     /* free -- we rely on the debug malloc to detect leakage here */
2159dd13e84SCy Schubert     sk_uchar_free(s);
2169dd13e84SCy Schubert     s = NULL;
2179dd13e84SCy Schubert 
2189dd13e84SCy Schubert     /* dup again */
2199dd13e84SCy Schubert     if (!TEST_int_eq(sk_uchar_num(r), n))
2209dd13e84SCy Schubert         goto end;
2219dd13e84SCy Schubert 
2229dd13e84SCy Schubert     /* zero */
2239dd13e84SCy Schubert     sk_uchar_zero(r);
2249dd13e84SCy Schubert     if (!TEST_int_eq(sk_uchar_num(r), 0))
2259dd13e84SCy Schubert         goto end;
2269dd13e84SCy Schubert 
2279dd13e84SCy Schubert     /* insert */
2289dd13e84SCy Schubert     sk_uchar_insert(r, v, 0);
2299dd13e84SCy Schubert     sk_uchar_insert(r, v + 2, -1);
2309dd13e84SCy Schubert     sk_uchar_insert(r, v + 1, 1);
2319dd13e84SCy Schubert     for (i = 0; i < 3; i++)
2329dd13e84SCy Schubert         if (!TEST_ptr_eq(sk_uchar_value(r, i), v + i)) {
2339dd13e84SCy Schubert             TEST_info("uchar insert %d", i);
2349dd13e84SCy Schubert             goto end;
2359dd13e84SCy Schubert         }
2369dd13e84SCy Schubert 
2379dd13e84SCy Schubert     /* delete */
2389dd13e84SCy Schubert     if (!TEST_ptr_null(sk_uchar_delete(r, 12)))
2399dd13e84SCy Schubert         goto end;
2409dd13e84SCy Schubert     if (!TEST_ptr_eq(sk_uchar_delete(r, 1), v + 1))
2419dd13e84SCy Schubert         goto end;
2429dd13e84SCy Schubert 
2439dd13e84SCy Schubert     /* set */
2449dd13e84SCy Schubert     (void)sk_uchar_set(r, 1, v + 1);
2459dd13e84SCy Schubert     for (i = 0; i < 2; i++)
2469dd13e84SCy Schubert         if (!TEST_ptr_eq(sk_uchar_value(r, i), v + i)) {
2479dd13e84SCy Schubert             TEST_info("uchar set %d", i);
2489dd13e84SCy Schubert             goto end;
2499dd13e84SCy Schubert         }
2509dd13e84SCy Schubert 
2519dd13e84SCy Schubert     testresult = 1;
2529dd13e84SCy Schubert end:
2539dd13e84SCy Schubert     sk_uchar_free(r);
2549dd13e84SCy Schubert     sk_uchar_free(s);
2559dd13e84SCy Schubert     return testresult;
2569dd13e84SCy Schubert }
2579dd13e84SCy Schubert 
SS_copy(const SS * p)2589dd13e84SCy Schubert static SS *SS_copy(const SS *p)
2599dd13e84SCy Schubert {
2609dd13e84SCy Schubert     SS *q = OPENSSL_malloc(sizeof(*q));
2619dd13e84SCy Schubert 
2629dd13e84SCy Schubert     if (q != NULL)
2639dd13e84SCy Schubert         memcpy(q, p, sizeof(*q));
2649dd13e84SCy Schubert     return q;
2659dd13e84SCy Schubert }
2669dd13e84SCy Schubert 
SS_free(SS * p)267808413daSEnji Cooper static void SS_free(SS *p)
268808413daSEnji Cooper {
2699dd13e84SCy Schubert     OPENSSL_free(p);
2709dd13e84SCy Schubert }
2719dd13e84SCy Schubert 
test_SS_stack(void)2729dd13e84SCy Schubert static int test_SS_stack(void)
2739dd13e84SCy Schubert {
2749dd13e84SCy Schubert     STACK_OF(SS) *s = sk_SS_new_null();
2759dd13e84SCy Schubert     STACK_OF(SS) *r = NULL;
2769dd13e84SCy Schubert     SS *v[10], *p;
2779dd13e84SCy Schubert     const int n = OSSL_NELEM(v);
2789dd13e84SCy Schubert     int i;
2799dd13e84SCy Schubert     int testresult = 0;
2809dd13e84SCy Schubert 
2819dd13e84SCy Schubert     /* allocate and push */
2829dd13e84SCy Schubert     for (i = 0; i < n; i++) {
2839dd13e84SCy Schubert         v[i] = OPENSSL_malloc(sizeof(*v[i]));
2849dd13e84SCy Schubert 
2859dd13e84SCy Schubert         if (!TEST_ptr(v[i]))
2869dd13e84SCy Schubert             goto end;
2879dd13e84SCy Schubert         v[i]->n = i;
2889dd13e84SCy Schubert         v[i]->c = 'A' + i;
2899dd13e84SCy Schubert         if (!TEST_int_eq(sk_SS_num(s), i)) {
2909dd13e84SCy Schubert             TEST_info("SS stack size %d", i);
2919dd13e84SCy Schubert             goto end;
2929dd13e84SCy Schubert         }
2939dd13e84SCy Schubert         sk_SS_push(s, v[i]);
2949dd13e84SCy Schubert     }
2959dd13e84SCy Schubert     if (!TEST_int_eq(sk_SS_num(s), n))
2969dd13e84SCy Schubert         goto end;
2979dd13e84SCy Schubert 
2989dd13e84SCy Schubert     /* deepcopy */
2999dd13e84SCy Schubert     r = sk_SS_deep_copy(NULL, &SS_copy, &SS_free);
3009dd13e84SCy Schubert     if (sk_SS_num(r) != 0)
3019dd13e84SCy Schubert         goto end;
3029dd13e84SCy Schubert     sk_SS_free(r);
3039dd13e84SCy Schubert     r = sk_SS_deep_copy(s, &SS_copy, &SS_free);
3049dd13e84SCy Schubert     if (!TEST_ptr(r))
3059dd13e84SCy Schubert         goto end;
3069dd13e84SCy Schubert     for (i = 0; i < n; i++) {
3079dd13e84SCy Schubert         p = sk_SS_value(r, i);
3089dd13e84SCy Schubert         if (!TEST_ptr_ne(p, v[i])) {
3099dd13e84SCy Schubert             TEST_info("SS deepcopy non-copy %d", i);
3109dd13e84SCy Schubert             goto end;
3119dd13e84SCy Schubert         }
3129dd13e84SCy Schubert         if (!TEST_int_eq(p->n, v[i]->n)) {
3139dd13e84SCy Schubert             TEST_info("test SS deepcopy int %d", i);
3149dd13e84SCy Schubert             goto end;
3159dd13e84SCy Schubert         }
3169dd13e84SCy Schubert         if (!TEST_char_eq(p->c, v[i]->c)) {
3179dd13e84SCy Schubert             TEST_info("SS deepcopy char %d", i);
3189dd13e84SCy Schubert             goto end;
3199dd13e84SCy Schubert         }
3209dd13e84SCy Schubert     }
3219dd13e84SCy Schubert 
3229dd13e84SCy Schubert     /* pop_free - we rely on the malloc debug to catch the leak */
3239dd13e84SCy Schubert     sk_SS_pop_free(r, &SS_free);
3249dd13e84SCy Schubert     r = NULL;
3259dd13e84SCy Schubert 
3269dd13e84SCy Schubert     /* delete_ptr */
3279dd13e84SCy Schubert     p = sk_SS_delete_ptr(s, v[3]);
3289dd13e84SCy Schubert     if (!TEST_ptr(p))
3299dd13e84SCy Schubert         goto end;
3309dd13e84SCy Schubert     SS_free(p);
3319dd13e84SCy Schubert     if (!TEST_int_eq(sk_SS_num(s), n - 1))
3329dd13e84SCy Schubert         goto end;
3339dd13e84SCy Schubert     for (i = 0; i < n - 1; i++)
3349dd13e84SCy Schubert         if (!TEST_ptr_eq(sk_SS_value(s, i), v[i < 3 ? i : 1 + i])) {
3359dd13e84SCy Schubert             TEST_info("SS delete ptr item %d", i);
3369dd13e84SCy Schubert             goto end;
3379dd13e84SCy Schubert         }
3389dd13e84SCy Schubert 
3399dd13e84SCy Schubert     testresult = 1;
3409dd13e84SCy Schubert end:
3419dd13e84SCy Schubert     sk_SS_pop_free(r, &SS_free);
3429dd13e84SCy Schubert     sk_SS_pop_free(s, &SS_free);
3439dd13e84SCy Schubert     return testresult;
3449dd13e84SCy Schubert }
3459dd13e84SCy Schubert 
test_SU_stack(void)3469dd13e84SCy Schubert static int test_SU_stack(void)
3479dd13e84SCy Schubert {
3489dd13e84SCy Schubert     STACK_OF(SU) *s = sk_SU_new_null();
3499dd13e84SCy Schubert     SU v[10];
3509dd13e84SCy Schubert     const int n = OSSL_NELEM(v);
3519dd13e84SCy Schubert     int i;
3529dd13e84SCy Schubert     int testresult = 0;
3539dd13e84SCy Schubert 
3549dd13e84SCy Schubert     /* allocate and push */
3559dd13e84SCy Schubert     for (i = 0; i < n; i++) {
3569dd13e84SCy Schubert         if ((i & 1) == 0)
3579dd13e84SCy Schubert             v[i].n = i;
3589dd13e84SCy Schubert         else
3599dd13e84SCy Schubert             v[i].c = 'A' + i;
3609dd13e84SCy Schubert         if (!TEST_int_eq(sk_SU_num(s), i)) {
3619dd13e84SCy Schubert             TEST_info("SU stack size %d", i);
3629dd13e84SCy Schubert             goto end;
3639dd13e84SCy Schubert         }
3649dd13e84SCy Schubert         sk_SU_push(s, v + i);
3659dd13e84SCy Schubert     }
3669dd13e84SCy Schubert     if (!TEST_int_eq(sk_SU_num(s), n))
3679dd13e84SCy Schubert         goto end;
3689dd13e84SCy Schubert 
3699dd13e84SCy Schubert     /* check the pointers are correct */
3709dd13e84SCy Schubert     for (i = 0; i < n; i++)
3719dd13e84SCy Schubert         if (!TEST_ptr_eq(sk_SU_value(s, i), v + i)) {
3729dd13e84SCy Schubert             TEST_info("SU pointer check %d", i);
3739dd13e84SCy Schubert             goto end;
3749dd13e84SCy Schubert         }
3759dd13e84SCy Schubert 
3769dd13e84SCy Schubert     testresult = 1;
3779dd13e84SCy Schubert end:
3789dd13e84SCy Schubert     sk_SU_free(s);
3799dd13e84SCy Schubert     return testresult;
3809dd13e84SCy Schubert }
3819dd13e84SCy Schubert 
setup_tests(void)3829dd13e84SCy Schubert int setup_tests(void)
3839dd13e84SCy Schubert {
3849dd13e84SCy Schubert     ADD_ALL_TESTS(test_int_stack, 4);
3859dd13e84SCy Schubert     ADD_ALL_TESTS(test_uchar_stack, 4);
3869dd13e84SCy Schubert     ADD_TEST(test_SS_stack);
3879dd13e84SCy Schubert     ADD_TEST(test_SU_stack);
3889dd13e84SCy Schubert     return 1;
3899dd13e84SCy Schubert }
390