1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
#include "../../gcc.dg/analyzer/analyzer-decls.h"
typedef __SIZE_TYPE__ size_t;
extern void* (*my_alloc)(size_t) __attribute__ ((alloc_size (1)));
extern void* (*my_alloc_2)(size_t, size_t) __attribute__ ((alloc_size (1, 2)));
int test_one_arg_concrete_int_ptr (void)
{
int *x = (int *) my_alloc (1); /* { dg-warning "allocated buffer size is not a multiple of the pointee's size" } */
__analyzer_dump_capacity (x); /* { dg-warning "capacity: '\\(\[^\n\r\]*\\)1'" } */
x[0] = 0; /* { dg-warning "buffer overflow" } */
return 0;
}
void test_one_arg_concrete (void)
{
char *p = (char *) my_alloc (10);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(\[^\n\r\]*\\)10'" } */
p[0] = 'a';
p[9] = 'b';
p[10] = 'c'; /* { dg-warning "buffer overflow" } */
p[11] = 'c'; /* { dg-warning "buffer overflow" } */
}
void test_one_arg_symbolic (size_t sz)
{
char *p = (char *) my_alloc (sz);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: 'INIT_VAL\\(sz" } */
}
void test_two_args_concrete (void)
{
char *p = (char *) my_alloc_2 (2, 5);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(\[^\n\r\]*\\)10'" } */
p[0] = 'a';
p[9] = 'b';
p[10] = 'c'; /* { dg-warning "buffer overflow" } */
p[11] = 'c'; /* { dg-warning "buffer overflow" } */
}
void test_two_args_symbolic_first (size_t sz)
{
char *p = (char *) my_alloc_2 (sz, 5);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(INIT_VAL\\(sz\[^\n\r\]*\\*\\(size_t\\)5\\)'" } */
}
void test_two_args_symbolic_second (size_t sz)
{
char *p = (char *) my_alloc_2 (5, sz);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(INIT_VAL\\(sz\[^\n\r\]*\\*\\(size_t\\)5\\)'" } */
}
void test_two_args_symbolic_both (size_t a, size_t b)
{
char *p = (char *) my_alloc_2 (a, b);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(INIT_VAL\\(a\[^\n\r\]*\\*INIT_VAL\\(b" } */
}
typedef void* (*my_alloc_t)(size_t) __attribute__ ((alloc_size (1)));
typedef void* (*my_alloc_2_t)(size_t, size_t) __attribute__ ((alloc_size (1, 2)));
void test_one_arg_concrete_fnptr (my_alloc_t fnptr)
{
char *p = (char *) fnptr (10);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(\[^\n\r\]*\\)10'" } */
p[0] = 'a';
p[9] = 'b';
p[10] = 'c'; /* { dg-warning "buffer overflow" } */
p[11] = 'c'; /* { dg-warning "buffer overflow" } */
}
void test_two_args_concrete_fnptr (my_alloc_2_t fnptr)
{
char *p = (char *) fnptr (2, 5);
__analyzer_dump_capacity (p); /* { dg-warning "capacity: '\\(\[^\n\r\]*\\)10'" } */
p[0] = 'a';
p[9] = 'b';
p[10] = 'c'; /* { dg-warning "buffer overflow" } */
p[11] = 'c'; /* { dg-warning "buffer overflow" } */
}
|