test/testutil/tests.c:412: error: NULL_DEREFERENCE
  pointer `aa` last assigned on line 411 could be null and is dereferenced by call to `BN_set_negative()` at line 412, column 5.
Showing all 47 steps of the trace


test/testutil/tests.c:403:1: start of procedure test_BN_abs_eq_word()
401.   }
402.   
403. > int test_BN_abs_eq_word(const char *file, int line, const char *bns,
404.                           const char *ws, const BIGNUM *a, BN_ULONG w)
405.   {

test/testutil/tests.c:408:9: Taking true branch
406.       BIGNUM *bw, *aa;
407.   
408.       if (a != NULL && BN_abs_is_word(a, w))
               ^
409.           return 1;
410.       bw = BN_new();

test/testutil/tests.c:408:22: 
406.       BIGNUM *bw, *aa;
407.   
408. >     if (a != NULL && BN_abs_is_word(a, w))
409.           return 1;
410.       bw = BN_new();

crypto/bn/bn_lib.c:841:1: start of procedure BN_abs_is_word()
  839.   }
  840.   
  841. > int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
  842.   {
  843.       return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));

crypto/bn/bn_lib.c:843:14: Condition is false
  841.   int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
  842.   {
  843.       return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
                      ^
  844.   }
  845.   

crypto/bn/bn_lib.c:843:51: Condition is false
  841.   int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
  842.   {
  843.       return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
                                                           ^
  844.   }
  845.   

crypto/bn/bn_lib.c:843:12: 
  841.   int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
  842.   {
  843. >     return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
  844.   }
  845.   

crypto/bn/bn_lib.c:843:5: 
  841.   int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)
  842.   {
  843. >     return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
  844.   }
  845.   

crypto/bn/bn_lib.c:844:1: return from a call to BN_abs_is_word
  842.   {
  843.       return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));
  844. > }
  845.   
  846.   int BN_is_zero(const BIGNUM *a)

test/testutil/tests.c:408:22: Taking false branch
406.       BIGNUM *bw, *aa;
407.   
408.       if (a != NULL && BN_abs_is_word(a, w))
                            ^
409.           return 1;
410.       bw = BN_new();

test/testutil/tests.c:410:5: Skipping BN_new(): empty list of specs
408.       if (a != NULL && BN_abs_is_word(a, w))
409.           return 1;
410.       bw = BN_new();
           ^
411.       aa = BN_dup(a);
412.       BN_set_negative(aa, 0);

test/testutil/tests.c:411:5: 
409.           return 1;
410.       bw = BN_new();
411. >     aa = BN_dup(a);
412.       BN_set_negative(aa, 0);
413.       BN_set_word(bw, w);

crypto/bn/bn_lib.c:261:1: start of procedure BN_dup()
  259.   }
  260.   
  261. > BIGNUM *BN_dup(const BIGNUM *a)
  262.   {
  263.       BIGNUM *t;

crypto/bn/bn_lib.c:265:9: Taking false branch
  263.       BIGNUM *t;
  264.   
  265.       if (a == NULL)
                 ^
  266.           return NULL;
  267.       bn_check_top(a);

crypto/bn/bn_lib.c:269:9: 
  267.       bn_check_top(a);
  268.   
  269. >     t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
  270.       if (t == NULL)
  271.           return NULL;

crypto/bn/bn_lib.c:912:1: start of procedure BN_get_flags()
    910.   }
    911.   
    912. > int BN_get_flags(const BIGNUM *b, int n)
    913.   {
    914.       return b->flags & n;

crypto/bn/bn_lib.c:914:5: 
    912.   int BN_get_flags(const BIGNUM *b, int n)
    913.   {
    914. >     return b->flags & n;
    915.   }
    916.   

crypto/bn/bn_lib.c:915:1: return from a call to BN_get_flags
    913.   {
    914.       return b->flags & n;
    915. > }
    916.   
    917.   /* Populate a BN_GENCB structure with an "old"-style callback */

crypto/bn/bn_lib.c:269:9: Condition is false
  267.       bn_check_top(a);
  268.   
  269.       t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
                 ^
  270.       if (t == NULL)
  271.           return NULL;

crypto/bn/bn_lib.c:269:5: 
  267.       bn_check_top(a);
  268.   
  269. >     t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
  270.       if (t == NULL)
  271.           return NULL;

crypto/bn/bn_lib.c:270:9: Taking false branch
  268.   
  269.       t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();
  270.       if (t == NULL)
                 ^
  271.           return NULL;
  272.       if (!BN_copy(t, a)) {

crypto/bn/bn_lib.c:272:10: 
  270.       if (t == NULL)
  271.           return NULL;
  272. >     if (!BN_copy(t, a)) {
  273.           BN_free(t);
  274.           return NULL;

crypto/bn/bn_lib.c:280:1: start of procedure BN_copy()
    278.   }
    279.   
    280. > BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)
    281.   {
    282.       bn_check_top(b);

crypto/bn/bn_lib.c:284:9: Taking false branch
    282.       bn_check_top(b);
    283.   
    284.       if (a == b)
                   ^
    285.           return a;
    286.       if (bn_wexpand(a, b->top) == NULL)

crypto/bn/bn_lib.c:286:9: 
    284.       if (a == b)
    285.           return a;
    286. >     if (bn_wexpand(a, b->top) == NULL)
    287.           return NULL;
    288.   

crypto/bn/bn_lib.c:942:1: start of procedure bn_wexpand()
      940.   }
      941.   
      942. > BIGNUM *bn_wexpand(BIGNUM *a, int words)
      943.   {
      944.       return (words <= a->dmax) ? a : bn_expand2(a, words);

crypto/bn/bn_lib.c:944:13: Condition is false
      942.   BIGNUM *bn_wexpand(BIGNUM *a, int words)
      943.   {
      944.       return (words <= a->dmax) ? a : bn_expand2(a, words);
                         ^
      945.   }
      946.   

crypto/bn/bn_lib.c:944:12: 
      942.   BIGNUM *bn_wexpand(BIGNUM *a, int words)
      943.   {
      944. >     return (words <= a->dmax) ? a : bn_expand2(a, words);
      945.   }
      946.   

crypto/bn/bn_lib.c:244:1: start of procedure bn_expand2()
        242.    */
        243.   
        244. > BIGNUM *bn_expand2(BIGNUM *b, int words)
        245.   {
        246.       if (words > b->dmax) {

crypto/bn/bn_lib.c:246:9: Taking true branch
        244.   BIGNUM *bn_expand2(BIGNUM *b, int words)
        245.   {
        246.       if (words > b->dmax) {
                       ^
        247.           BN_ULONG *a = bn_expand_internal(b, words);
        248.           if (!a)

crypto/bn/bn_lib.c:247:9: Skipping bn_expand_internal(): empty list of specs
        245.   {
        246.       if (words > b->dmax) {
        247.           BN_ULONG *a = bn_expand_internal(b, words);
                       ^
        248.           if (!a)
        249.               return NULL;

crypto/bn/bn_lib.c:248:14: Taking true branch
        246.       if (words > b->dmax) {
        247.           BN_ULONG *a = bn_expand_internal(b, words);
        248.           if (!a)
                            ^
        249.               return NULL;
        250.           if (b->d) {

crypto/bn/bn_lib.c:249:13: 
        247.           BN_ULONG *a = bn_expand_internal(b, words);
        248.           if (!a)
        249. >             return NULL;
        250.           if (b->d) {
        251.               OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0]));

crypto/bn/bn_lib.c:259:1: return from a call to bn_expand2
        257.   
        258.       return b;
        259. > }
        260.   
        261.   BIGNUM *BN_dup(const BIGNUM *a)

crypto/bn/bn_lib.c:944:5: 
      942.   BIGNUM *bn_wexpand(BIGNUM *a, int words)
      943.   {
      944. >     return (words <= a->dmax) ? a : bn_expand2(a, words);
      945.   }
      946.   

crypto/bn/bn_lib.c:945:1: return from a call to bn_wexpand
      943.   {
      944.       return (words <= a->dmax) ? a : bn_expand2(a, words);
      945. > }
      946.   
      947.   void bn_correct_top(BIGNUM *a)

crypto/bn/bn_lib.c:286:9: Taking true branch
    284.       if (a == b)
    285.           return a;
    286.       if (bn_wexpand(a, b->top) == NULL)
                   ^
    287.           return NULL;
    288.   

crypto/bn/bn_lib.c:287:9: 
    285.           return a;
    286.       if (bn_wexpand(a, b->top) == NULL)
    287. >         return NULL;
    288.   
    289.       if (b->top > 0)

crypto/bn/bn_lib.c:297:1: return from a call to BN_copy
    295.       bn_check_top(a);
    296.       return a;
    297. > }
    298.   
    299.   #define FLAGS_DATA(flags) ((flags) & (BN_FLG_STATIC_DATA \

crypto/bn/bn_lib.c:272:10: Taking true branch
  270.       if (t == NULL)
  271.           return NULL;
  272.       if (!BN_copy(t, a)) {
                  ^
  273.           BN_free(t);
  274.           return NULL;

crypto/bn/bn_lib.c:273:9: Skipping BN_free(): empty list of specs
  271.           return NULL;
  272.       if (!BN_copy(t, a)) {
  273.           BN_free(t);
                 ^
  274.           return NULL;
  275.       }

crypto/bn/bn_lib.c:274:9: 
  272.       if (!BN_copy(t, a)) {
  273.           BN_free(t);
  274. >         return NULL;
  275.       }
  276.       bn_check_top(t);

crypto/bn/bn_lib.c:278:1: return from a call to BN_dup
  276.       bn_check_top(t);
  277.       return t;
  278. > }
  279.   
  280.   BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)

test/testutil/tests.c:412:5: 
410.       bw = BN_new();
411.       aa = BN_dup(a);
412. >     BN_set_negative(aa, 0);
413.       BN_set_word(bw, w);
414.       test_fail_bignum_message(NULL, file, line, "BIGNUM", bns, ws, "abs==",

crypto/bn/bn_lib.c:665:1: start of procedure BN_set_negative()
  663.   }
  664.   
  665. > void BN_set_negative(BIGNUM *a, int b)
  666.   {
  667.       if (b && !BN_is_zero(a))

crypto/bn/bn_lib.c:667:9: Taking false branch
  665.   void BN_set_negative(BIGNUM *a, int b)
  666.   {
  667.       if (b && !BN_is_zero(a))
                 ^
  668.           a->neg = 1;
  669.       else

crypto/bn/bn_lib.c:670:9: 
  668.           a->neg = 1;
  669.       else
  670. >         a->neg = 0;
  671.   }
  672.   

int test_BN_abs_eq_word(const char *file, int line, const char *bns,
                        const char *ws, const BIGNUM *a, BN_ULONG w)
{
    BIGNUM *bw, *aa;
    if (a != NULL && BN_abs_is_word(a, w))
        return 1;
    bw = BN_new();
    aa = BN_dup(a);
    BN_set_negative(aa, 0);
    BN_set_word(bw, w);
    test_fail_bignum_message(NULL, file, line, "BIGNUM", bns, ws, "abs==",
                             aa, bw);
    BN_free(bw);
    BN_free(aa);
    return 0;
}
['int test_BN_abs_eq_word(const char *file, int line, const char *bns,\n                        const char *ws, const BIGNUM *a, BN_ULONG w)\n{\n    BIGNUM *bw, *aa;\n    if (a != NULL && BN_abs_is_word(a, w))\n        return 1;\n    bw = BN_new();\n    aa = BN_dup(a);\n    BN_set_negative(aa, 0);\n    BN_set_word(bw, w);\n    test_fail_bignum_message(NULL, file, line, "BIGNUM", bns, ws, "abs==",\n                             aa, bw);\n    BN_free(bw);\n    BN_free(aa);\n    return 0;\n}', 'int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w)\n{\n    return ((a->top == 1) && (a->d[0] == w)) || ((w == 0) && (a->top == 0));\n}', 'BIGNUM *BN_dup(const BIGNUM *a)\n{\n    BIGNUM *t;\n    if (a == NULL)\n        return NULL;\n    bn_check_top(a);\n    t = BN_get_flags(a, BN_FLG_SECURE) ? BN_secure_new() : BN_new();\n    if (t == NULL)\n        return NULL;\n    if (!BN_copy(t, a)) {\n        BN_free(t);\n        return NULL;\n    }\n    bn_check_top(t);\n    return t;\n}', 'int BN_get_flags(const BIGNUM *b, int n)\n{\n    return b->flags & n;\n}', 'BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b)\n{\n    bn_check_top(b);\n    if (a == b)\n        return a;\n    if (bn_wexpand(a, b->top) == NULL)\n        return NULL;\n    if (b->top > 0)\n        memcpy(a->d, b->d, sizeof(b->d[0]) * b->top);\n    a->neg = b->neg;\n    a->top = b->top;\n    a->flags |= b->flags & BN_FLG_FIXED_TOP;\n    bn_check_top(a);\n    return a;\n}', 'BIGNUM *bn_wexpand(BIGNUM *a, int words)\n{\n    return (words <= a->dmax) ? a : bn_expand2(a, words);\n}', 'BIGNUM *bn_expand2(BIGNUM *b, int words)\n{\n    if (words > b->dmax) {\n        BN_ULONG *a = bn_expand_internal(b, words);\n        if (!a)\n            return NULL;\n        if (b->d) {\n            OPENSSL_cleanse(b->d, b->dmax * sizeof(b->d[0]));\n            bn_free_d(b);\n        }\n        b->d = a;\n        b->dmax = words;\n    }\n    return b;\n}', 'void BN_set_negative(BIGNUM *a, int b)\n{\n    if (b && !BN_is_zero(a))\n        a->neg = 1;\n    else\n        a->neg = 0;\n}']