| #include "analyzer-decls.h" |
| |
| struct coord |
| { |
| int x; |
| int y; |
| }; |
| |
| /* Copying from one on-stack array to another. */ |
| |
| void test_1 (void) |
| { |
| struct coord arr_a[16]; |
| struct coord arr_b[16]; |
| arr_a[3].x = 5; |
| arr_a[3].y = 6; |
| |
| arr_b[7] = arr_a[3]; |
| |
| __analyzer_eval (arr_b[7].x == 5); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (arr_b[7].y == 6); /* { dg-warning "TRUE" } */ |
| } |
| |
| /* Copying from an on-stack array to a global array. */ |
| |
| struct coord glob_arr[16]; |
| |
| void test_2 (void) |
| { |
| struct coord arr[16]; |
| arr[3].x = 5; |
| arr[3].y = 6; |
| |
| glob_arr[7] = arr[3]; |
| |
| __analyzer_eval (glob_arr[7].x == 5); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (glob_arr[7].y == 6); /* { dg-warning "TRUE" } */ |
| } |
| |
| /* Copying from a partially initialized on-stack array to a global array. */ |
| |
| struct coord glob_arr[16]; |
| |
| void test_3 (void) |
| { |
| struct coord arr[16]; |
| arr[3].y = 6; |
| |
| glob_arr[7] = arr[3]; // or should the uninit warning be here? |
| |
| __analyzer_eval (glob_arr[7].x); /* { dg-warning "uninitialized" "uninit" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "unknown" { xfail *-*-* } .-1 } */ |
| __analyzer_eval (glob_arr[7].y == 6); /* { dg-warning "TRUE" } */ |
| } |
| |
| /* Symbolic bindings: copying from one array to another. */ |
| |
| struct coord glob_arr[16]; |
| |
| void test_4 (int i) |
| { |
| struct coord arr_a[16]; |
| struct coord arr_b[16]; |
| arr_a[i].x = 5; |
| arr_a[i].y = 6; |
| __analyzer_eval (arr_a[i].x == 5); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| __analyzer_eval (arr_a[i].y == 6); /* { dg-warning "TRUE" } */ |
| |
| arr_b[i] = arr_a[i]; |
| |
| __analyzer_eval (arr_b[i].x == 5); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| __analyzer_eval (arr_b[i].y == 6); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| } |
| |
| /* Symbolic bindings: copying within an array: symbolic src and dest */ |
| |
| struct coord glob_arr[16]; |
| |
| void test_5a (int i, int j) |
| { |
| struct coord arr[16]; |
| arr[i].x = 5; |
| arr[i].y = 6; |
| |
| arr[j] = arr[i]; |
| |
| __analyzer_eval (arr[j].x == 5); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| __analyzer_eval (arr[j].y == 6); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| } |
| |
| /* Symbolic bindings: copying within an array: symbolic src, concrete dest. */ |
| |
| struct coord glob_arr[16]; |
| |
| void test_5b (int i) |
| { |
| struct coord arr[16]; |
| arr[i].x = 5; |
| arr[i].y = 6; |
| |
| arr[3] = arr[i]; |
| |
| __analyzer_eval (arr[3].x == 5); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| __analyzer_eval (arr[3].y == 6); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| } |
| |
| /* Symbolic bindings: copying within an array: concrete src, symbolic dest. */ |
| |
| struct coord glob_arr[16]; |
| |
| void test_5c (int i) |
| { |
| struct coord arr[16]; |
| arr[3].x = 5; |
| arr[3].y = 6; |
| |
| arr[i] = arr[3]; |
| |
| __analyzer_eval (arr[i].x == 5); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| __analyzer_eval (arr[i].y == 6); /* { dg-warning "TRUE" "TRUE" { xfail *-*-* } } */ |
| /* { dg-bogus "UNKNOWN" "UNKNOWN" { xfail *-*-* } .-1 } */ |
| } |
| |
| /* No info on the subregion being copied, and hence |
| binding_cluster2::maybe_get_compound_binding should return NULL. */ |
| |
| void test_6 (void) |
| { |
| struct coord arr[16]; |
| arr[7] = glob_arr[3]; |
| |
| __analyzer_eval (arr[7].x == 5); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (arr[7].y == 6); /* { dg-warning "UNKNOWN" } */ |
| } |