blob: a9d375d2edc2b67d1c31055ac81b1ddeb8c1414b [file] [log] [blame]
/* { dg-skip-if "requires hosted libstdc++ for stdlib malloc" { ! hostedlib } } */
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
/* Tests with constant buffer sizes. */
void test_1 (void)
{
int16_t *ptr = (int16_t *) malloc (21 * sizeof (int16_t));
free (ptr);
}
void test_2 (void)
{
int32_t *ptr = (int32_t *) malloc (21 * sizeof (int16_t)); /* { dg-line malloc2 } */
free (ptr);
/* { dg-warning "allocated buffer size is not a multiple of the pointee's size \\\[CWE-131\\\]" "warning" { target *-*-* } malloc2 } */
/* { dg-message "42 bytes" "note" { target *-*-* } malloc2 } */
/* { dg-message "'int32_t \\*' (\\\{aka '(long )?int \\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c } malloc2 } */
/* { dg-message "'int32_t\\*' (\\\{aka '(long )?int\\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c++ } malloc2 } */
}
void test_3 (void)
{
void *ptr = malloc (21 * sizeof (int16_t));
int16_t *sptr = (int16_t *)ptr;
free (sptr);
}
void test_4 (void)
{
void *ptr = malloc (21 * sizeof (int16_t)); /* { dg-message "42 bytes" } */
int32_t *iptr = (int32_t *)ptr; /* { dg-line assign4 } */
free (iptr);
/* { dg-warning "allocated buffer size is not a multiple of the pointee's size \\\[CWE-131\\\]" "warning" { target *-*-* } assign4 } */
/* { dg-message "'int32_t \\*' (\\\{aka '(long )?int \\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c } assign4 } */
/* { dg-message "'int32_t\\*' (\\\{aka '(long )?int\\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c++ } assign4 } */
}
void test_5 (void)
{
int32_t user_input;
scanf("%i", &user_input);
int32_t n;
if (user_input == 0)
n = 21 * sizeof (int16_t);
else
n = 42 * sizeof (int16_t);
void *ptr = malloc (n);
int16_t *sptr = (int16_t *)ptr;
free (sptr);
}
void test_6 (void)
{
int32_t user_input;
scanf("%i", &user_input);
int32_t n;
if (user_input == 0)
n = 21 * sizeof (int16_t);
else
n = 42 * sizeof (int16_t);
void *ptr = malloc (n); /* { dg-message "" "note" } */
/* ^^^ on widening_svalues no expr is returned
by get_representative_tree at the moment. */
int32_t *iptr = (int32_t *)ptr; /* { dg-line assign6 } */
free (iptr);
/* { dg-warning "allocated buffer size is not a multiple of the pointee's size \\\[CWE-131\\\]" "warning" { target *-*-* } assign6 } */
/* { dg-message "'int32_t \\*' (\\\{aka '(long )?int \\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c } assign6 } */
/* { dg-message "'int32_t\\*' (\\\{aka '(long )?int\\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c++ } assign6 } */
}
void test_7 (void)
{
int32_t user_input;
scanf("%i", &user_input);
int32_t n;
if (user_input == 0)
n = 1;
else if (user_input == 2)
n = 5;
else
n = 7;
/* n is an unknown_svalue at this point. */
void *ptr = malloc (n);
int32_t *iptr = (int32_t *)ptr;
free (iptr);
}
void *create_buffer (int32_t n)
{
return malloc(n);
}
void test_8 (void)
{
int32_t *buf = (int32_t *) create_buffer(4 * sizeof (int));
free (buf);
}
void test_9 (void)
{
int32_t *buf = (int32_t *) create_buffer(42); /* { dg-warning "allocated buffer size is not a multiple of the pointee's size" } */
free (buf);
}
void test_10 (int32_t n)
{
char *ptr = (char *) malloc (7 * n);
free (ptr);
}
void test_11 ()
{
/* 3.0 is folded to an int before the analyzer runs. */
int32_t *ptr = (int32_t *) malloc (3.0); /* { dg-line malloc11 } */
free (ptr);
/* { dg-warning "allocated buffer size is not a multiple of the pointee's size \\\[CWE-131\\\]" "warning" { target *-*-* } malloc11 } */
/* { dg-message "'int32_t \\*' (\\\{aka '(long )?int \\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c } malloc11 } */
/* { dg-message "'int32_t\\*' (\\\{aka '(long )?int\\*'\\\})? here; 'sizeof \\(int32_t (\\\{aka (long )?int\\\})?\\)' is '4'" "note" { target c++ } malloc11 } */
}