Summary: The `may_last_field` boolean value in the `decl_sym_val` function presents that the location *may* (not *must*) be a flexible array member. By the modular analysis nature, it is impossible to determine whether a given argument is a flexible array member or not---because of lack of calling context. For example, there are two function calls of `foo` below: (2) passes a flexible array member as an argument and (1) passes a non-flexible array, however it is hard to notice when analyzing the `foo` function. ``` struct T { int c[1]; }; struct S { struct T a; struct T b; }; void foo(struct T x) { ... } void goo () { struct S* x = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int)); foo(&(x->a)); // (1) foo(&(x->b)); // (2) } ``` We assume that any given arguments may stem from the last field of struct, i.e., flexible array member. (This is why `decl_sym_val` is called with `may_last_field:true` at the first time.) With some tests, we noticed that the assumption does not harm the analysis precision, because whether regarding a parameter as a flexible array member or not is about using a symbolic array size instead of a constant array size written in the type during the analysis of callee. Therefore still it can raise correct alarms if the actual parameter is given in its caller. Reviewed By: mbouaziz Differential Revision: D7081295 fbshipit-source-id: a4d57a0master
parent
4c002f0c98
commit
e304b511fa
Loading…
Reference in new issue