blob: c1cb227994e050bc0eb2fd1db917ee6a5ec409bc [file] [log] [blame]
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,alpha.core -std=gnu99 -analyzer-config suppress-dereferences-from-any-address-space=false -verify=x86-nosuppress,common %s
// RUN: %clang_analyze_cc1 -triple x86_64-pc-linux-gnu -analyzer-checker=core,alpha.core -std=gnu99 -verify=x86-suppress,common %s
// RUN: %clang_analyze_cc1 -triple arm-pc-linux-gnu -analyzer-checker=core,alpha.core -std=gnu99 -analyzer-config suppress-dereferences-from-any-address-space=false -verify=other-nosuppress,common %s
// RUN: %clang_analyze_cc1 -triple arm-pc-linux-gnu -analyzer-checker=core,alpha.core -std=gnu99 -verify=other-suppress,common %s
#define AS_ATTRIBUTE(_X) volatile __attribute__((address_space(_X)))
#define _get_base() ((void * AS_ATTRIBUTE(256) *)0)
void* test_address_space_array(unsigned long slot) {
return _get_base()[slot]; // other-nosuppress-warning{{Dereference}}
}
void test_address_space_condition(int AS_ATTRIBUTE(257) *cpu_data) {
if (cpu_data == 0) {
*cpu_data = 3; // other-nosuppress-warning{{Dereference}}
}
}
struct X { int member; };
int test_address_space_member(void) {
struct X AS_ATTRIBUTE(258) *data = (struct X AS_ATTRIBUTE(258) *)0UL;
int ret;
ret = data->member; // other-nosuppress-warning{{Dereference}}
return ret;
}
void test_other_address_space_condition(int AS_ATTRIBUTE(259) *cpu_data) {
if (cpu_data == 0) {
*cpu_data = 3; // other-nosuppress-warning{{Dereference}} \
// x86-nosuppress-warning{{Dereference}}
}
}
void test_no_address_space_condition(int *cpu_data) {
if (cpu_data == 0) {
*cpu_data = 3; // common-warning{{Dereference}}
}
}
#define _fixed_get_base() ((void * AS_ATTRIBUTE(256) *)2)
void* fixed_test_address_space_array(unsigned long slot) {
return _fixed_get_base()[slot]; // other-nosuppress-warning{{Dereference}}
}
void fixed_test_address_space_condition(int AS_ATTRIBUTE(257) *cpu_data) {
if (cpu_data == (int AS_ATTRIBUTE(257) *)2) {
*cpu_data = 3; // other-nosuppress-warning{{Dereference}}
}
}
int fixed_test_address_space_member(void) {
struct X AS_ATTRIBUTE(258) *data = (struct X AS_ATTRIBUTE(258) *)2UL;
int ret;
ret = data->member; // other-nosuppress-warning{{Dereference}}
return ret;
}
void fixed_test_other_address_space_condition(int AS_ATTRIBUTE(259) *cpu_data) {
if (cpu_data == (int AS_ATTRIBUTE(259) *)2) {
*cpu_data = 3; // other-nosuppress-warning{{Dereference}} \
// x86-nosuppress-warning{{Dereference}}
}
}
void fixed_test_no_address_space_condition(int *cpu_data) {
if (cpu_data == (int *)2) {
*cpu_data = 3; // common-warning{{Dereference}}
}
}