blob: e1c7a00b97cca10bf3e3d36437c7d267b5d40dc3 [file] [log] [blame]
#define NULL ((void *)0)
int test_from_pr77432 (int *a)
{
int b = *a; /* { dg-message "pointer 'a' is dereferenced here" } */
if (a) /* { dg-warning "check of 'a' for NULL after already dereferencing it \\\[-Wanalyzer-deref-before-check\\\]" "warning" } */
/* { dg-message "pointer 'a' is checked for NULL here but it was already dereferenced at \\(1\\)" "final event" { target *-*-* } .-1 } */
return b;
return 0;
}
int test_1a (int *p, int x)
{
*p = x; /* { dg-message "pointer 'p' is dereferenced here" } */
if (p) /* { dg-warning "check of 'p' for NULL after already dereferencing it \\\[-Wanalyzer-deref-before-check\\\]" "warning" } */
/* { dg-message "pointer 'p' is checked for NULL here but it was already dereferenced at \\(1\\)" "final event" { target *-*-* } .-1 } */
return 1;
else
return 0;
}
int test_1b (int *p, int *q)
{
*q = *p; /* { dg-message "8: pointer 'p' is dereferenced here" } */
if (p) /* { dg-warning "check of 'p' for NULL after already dereferencing it \\\[-Wanalyzer-deref-before-check\\\]" "warning" } */
/* { dg-message "pointer 'p' is checked for NULL here but it was already dereferenced at \\(1\\)" "final event" { target *-*-* } .-1 } */
return 1;
else
return 0;
}
struct s2
{
int x;
int y;
};
int test_2a (struct s2 *p)
{
int sum = p->x + p->y; /* { dg-message "pointer 'p' is dereferenced here" } */
if (!p) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
__builtin_abort ();
return sum;
}
int test_2b (struct s2 *p)
{
if (!p)
__builtin_abort ();
int sum = p->x + p->y;
return sum;
}
struct s3
{
int flag;
};
extern void err (const char *);
void test_3 (struct s3 *p)
{
if (p->flag) /* { dg-message "pointer 'p' is dereferenced here" } */
err ("p->flag");
if (!p) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
err ("p was NULL");
}
struct s4
{
struct s4 *m_next;
int m_val;
};
int test_4 (struct s4 *p)
{
if (p->m_next->m_val > 0) /* { dg-message "pointer '\\*p.m_next' is dereferenced here" } */
return -1;
if (!p->m_next) /* { dg-warning "check of '\\*p.m_next' for NULL after already dereferencing it" } */
return -2;
return p->m_next->m_val;
}
struct s5
{
const char *str;
int val;
};
int test_5 (struct s5 *p)
{
__builtin_printf ("%s: %i\n", p->str, p->val); /* { dg-message "pointer 'p' is dereferenced here" } */
if (p != NULL) /* { dg-warning "check of 'p' for NULL after already dereferencing it" } */
return p->val;
return -1;
}
static int __attribute__((noinline))
__analyzer_check_ptr (int *p)
{
if (p)
return *p;
else
return 42;
}
int test_calling_check_ptr_after_deref_1 (int *q)
{
int v = *q; /* { dg-bogus "dereferenced here" } */
v += __analyzer_check_ptr (q);
return v;
}
int test_calling_check_ptr_after_deref_2 (int *q)
{
int v = *q; /* { dg-bogus "dereferenced here" } */
v += __analyzer_check_ptr (q);
*q = 17;
return v;
}
int test_calling_check_ptr_after_deref_3 (int *q)
{
int v = *q; /* { dg-message "pointer 'q' is dereferenced here" } */
v += __analyzer_check_ptr (q);
if (q) /* { dg-warning "check of 'q' for NULL after already dereferencing it" } */
*q = 17;
return v;
}
static int __attribute__((noinline))
__analyzer_deref_ptr (int *p)
{
return *p;
}
int test_calling_check_ptr_after_calling_deref_1 (int *q)
{
int v = __analyzer_deref_ptr (q);
v += __analyzer_check_ptr (q);
return v;
}
int test_calling_check_ptr_after_calling_deref_2 (int *q)
{
int v = __analyzer_deref_ptr (q);
v += __analyzer_check_ptr (q);
*q = 17;
return v;
}
int test_calling_check_ptr_after_calling_deref_3 (int *q)
{
int v = __analyzer_deref_ptr (q);
v += __analyzer_check_ptr (q);
if (q)
*q = 17;
return v;
}
int test_checking_ptr_after_calling_deref (int *q)
{
int v = __analyzer_deref_ptr (q);
if (q)
return 0;
return v;
}