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