1cdc3a89d5de90b2299c56f4a46c3de590c5184d1Ted Kremenek// RUN: %clang_cc1 -analyze -analyzer-checker=alpha.security.MallocOverflow -verify %s 217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 36479c664f0ea191e72224578b655d8846f919befAnna Zaks#define NULL ((void *) 0) 417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenektypedef __typeof__(sizeof(int)) size_t; 517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekextern void * malloc(size_t); 617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f1(int n) 817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 1017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 1117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 1217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f2(int n) 1317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 1417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(sizeof(int) * n); // // expected-warning {{the computation of the size of the memory allocation may overflow}} 1517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 1617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 1717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f3() 1817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 1917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(4 * sizeof(int)); // no-warning 2017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 2117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 2217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekstruct s4 2317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 2417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int n; 2517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek}; 2617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 2717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f4(struct s4 *s) 2817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 2917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(s->n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 3017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 3117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 3217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f5(struct s4 *s) 3317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 3417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek struct s4 s2 = *s; 3517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(s2.n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 3617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 3717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 3817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f6(int n) 3917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 4017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc((n + 1) * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 4117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 4217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 4317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekextern void * malloc (size_t); 4417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 4517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f7(int n) 4617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 4717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek if (n > 10) 4817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return NULL; 4917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(n * sizeof(int)); // no-warning 5017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 5117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 5217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f8(int n) 5317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 5417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek if (n < 10) 5517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(n * sizeof(int)); // no-warning 5617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek else 5717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return NULL; 5817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 5917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 6017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f9(int n) 6117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 6217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int * x = malloc(n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 6317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek for (int i = 0; i < n; i++) 6417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek x[i] = i; 6517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return x; 6617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 6717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 6817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f10(int n) 6917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 7017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int * x = malloc(n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 7117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int i = 0; 7217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek while (i < n) 7317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek x[i++] = 0; 7417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return x; 7517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 7617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 7717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f11(int n) 7817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 7917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int * x = malloc(n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 8017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int i = 0; 8117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek do { 8217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek x[i++] = 0; 8317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek } while (i < n); 8417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return x; 8517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 8617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 8717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f12(int n) 8817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 8917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek n = (n > 10 ? 10 : n); 9017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int * x = malloc(n * sizeof(int)); // no-warning 9117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek for (int i = 0; i < n; i++) 9217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek x[i] = i; 9317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return x; 9417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 9517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 9617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekstruct s13 9717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 9817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek int n; 9917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek}; 10017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 10117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f13(struct s13 *s) 10217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 10317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek if (s->n > 10) 10417f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return NULL; 10517f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(s->n * sizeof(int)); // no warning 10617f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 10717f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek 10817f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenekvoid * f14(int n) 10917f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek{ 11017f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek if (n < 0) 11117f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return NULL; 11217f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek return malloc(n * sizeof(int)); // expected-warning {{the computation of the size of the memory allocation may overflow}} 11317f7bdddd11a2dc5b4be248f756e14b1ebfe207bTed Kremenek} 114