additive-folding.cpp revision b4954a4175b36d912bdfc43834d09754faddd855
1ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -verify -analyzer-constraints=basic %s 2ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-experimental-checks -verify -analyzer-constraints=range %s 3ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose#include <limits.h> 4ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 5ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// These are used to trigger warnings. 6ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosetypedef typeof(sizeof(int)) size_t; 7ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid *malloc(size_t); 8ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid free(void *); 9ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose#define NULL ((void*)0) 10ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 11ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 12ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Plus/minus 13ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 14ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 15ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid separateExpressions (int a) { 16ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose int b = a + 1; 17ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose --b; 18ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 19ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* buf = malloc(1); 20ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a != 0 && b == 0) 21ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 22ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(buf); 23ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 24ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 25ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid oneLongExpression (int a) { 26ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose // Expression canonicalization should still allow this to work, even though 27ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose // the first term is on the left. 28ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose int b = 15 + a + 15 - 10 - 20; 29ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 30ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* buf = malloc(1); 31ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a != 0 && b == 0) 32ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 33ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(buf); 34ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 35ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 36b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixedTypes (int a) { 37b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose char* buf = malloc(1); 38b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 39b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose // Different additive types should not cause crashes when constant-folding. 40b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose // This is part of PR7406. 41b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose int b = a + 1LL; 42b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a != 0 && (b-1) == 0) // not crash 43b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose return; // no warning 44b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 45b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose int c = a + 1U; 46b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a != 0 && (c-1) == 0) // not crash 47b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose return; // no warning 48b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 49b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose free(buf); 50b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose} 51b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 52ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 53ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Comparisons 54ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose//--------------- 55ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 56ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Equality and inequality only 57ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid eq_ne (unsigned a) { 58ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 59ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == UINT_MAX) 60ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 61ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a+1 != 0) 62ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 63ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a-1 != UINT_MAX-1) 64ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 65ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 66ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 67ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 68ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid ne_eq (unsigned a) { 69ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 70ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a != UINT_MAX) 71ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 72ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a+1 == 0) 73ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 74ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a-1 == UINT_MAX-1) 75ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 76ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 77ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 78ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 79b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// Mixed typed inequalities (part of PR7406) 80b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose// These should not crash. 81b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixed_eq_ne (int a) { 82b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose char* b = NULL; 83b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a == 1) 84b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose b = malloc(1); 85b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a+1U != 2) 86b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose return; // no-warning 87b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a-1U != 0) 88b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose return; // no-warning 89b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose free(b); 90b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose} 91b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 92b4954a4175b36d912bdfc43834d09754faddd855Jordy Rosevoid mixed_ne_eq (int a) { 93b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose char* b = NULL; 94b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a != 1) 95b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose b = malloc(1); 96b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a+1U == 2) 97b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose return; // no-warning 98b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose if (a-1U == 0) 99b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose return; // no-warning 100b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose free(b); 101b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose} 102b4954a4175b36d912bdfc43834d09754faddd855Jordy Rose 103ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 104ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Simple order comparisons with no adjustment 105ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGT (unsigned a) { 106ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 107ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a > 0) 108ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 109ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == 0) 110ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 111ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 112ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 113ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 114ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineGE (unsigned a) { 115ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 116ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a >= UINT_MAX) 117ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 118ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == UINT_MAX) 119ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 120ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 121ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 122ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 123ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLT (unsigned a) { 124ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 125ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a < UINT_MAX) 126ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 127ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == UINT_MAX) 128ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 129ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 130ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 131ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 132ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid baselineLE (unsigned a) { 133ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 134ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a <= 0) 135ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 136ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == 0) 137ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 138ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 139ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 140ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 141ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 142ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Adjustment gives each of these an extra solution! 143ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGT (unsigned a) { 144ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 145ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a-1 > UINT_MAX-1) 146ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 147ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // expected-warning{{leak}} 148ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 149ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 150ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedGE (unsigned a) { 151ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 152ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a-1 >= UINT_MAX-1) 153ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 154ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == UINT_MAX) 155ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 156ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // expected-warning{{leak}} 157ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 158ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 159ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLT (unsigned a) { 160ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 161ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a+1 < 1) 162ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 163ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // expected-warning{{leak}} 164ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 165ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 166ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid adjustedLE (unsigned a) { 167ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = NULL; 168ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a+1 <= 1) 169ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose b = malloc(1); 170ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a == 0) 171ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 172ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // expected-warning{{leak}} 173ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 174ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 175ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 176ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose// Tautologies 177ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyGT (unsigned a) { 178ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = malloc(1); 179ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a > UINT_MAX) 180ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 181ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 182ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 183ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 184ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyGE (unsigned a) { 185ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = malloc(1); 186ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a >= 0) 187ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 188ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 189ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 190ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 191ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyLT (unsigned a) { 192ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = malloc(1); 193ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a < 0) 194ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 195ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 196ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 197ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose 198ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rosevoid tautologyLE (unsigned a) { 199ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose char* b = malloc(1); 200ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose if (a <= UINT_MAX) 201ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose free(b); 202ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose return; // no-warning 203ba0f61cf5363f80e3241dc754235dfb246afe320Jordy Rose} 204