[PATCH 2/5] C front end support to detect out-of-bounds accesses to array parameters
Fri Aug 7 17:01:31 GMT 2020
On 7/29/20 12:12 PM, Joseph Myers wrote:
> On Tue, 28 Jul 2020, Martin Sebor via Gcc-patches wrote:
>> + /* A list of VLA variable bounds or null if not specified. */
>> + tree vbchain = NULL_TREE;
>> + if (parm->declarator->kind == cdk_array)
>> + if (pd->kind != cdk_array)
>> + break;
>> + /* Skip all constant bounds except the most significant
>> + one. The interior ones are included in the array type. */
>> + if (next && next->kind == cdk_array)
>> + continue;
> Anything working with declarators should typically have logic to skip
> cdk_attrs declarators.
Thanks for the quick review/reply and the hints below!
> For example, a parameter is declared as an array using  in that
> declarator if the innermost c_declarator that is not cdk_id or cdk_attrs
> is of kind cdk_array. (It's the innermost not the outermost because of C
> declarator syntax.) The array bounds for the parameter array itself (as
> opposed to any other bounds if the parameter is e.g. an array of pointers
> to arrays) are then those in all the cdk_array declarators after the last
> declarator (if any) that's not cdk_array, cdk_attrs or cdk_id (cdk_id only
> comes in the last place).
> If e.g. the parameter has the nested cdk_declarator sequence
> then it's a three-dimensional array of pointers to two-dimensional arrays
> of pointers to functions.
> I don't see anything in the tests in this patch to cover this sort of case
> (arrays of pointers, including arrays of pointers to arrays etc.).
I've added a few test cases and reworked the declarator parsing
(get_parm_array_spec) a bit, fixing some bugs.
While testing I also noticed a problem/limitation in the array/VLA
formatting function that I couldn't think of how to fix without
duplicating a lot of what the C/C++ pretty printer does. So
the updated patch also includes changes to the pretty printer to
do most of what I need. As may be evident from the comments, I'm
not very happy with the solution but my only other idea was to add
a bit to an array type to indicate whether it's [static N] or [*]
and that seems too intrusive. If you find the "hack" I put in
unacceptable for the initial patch I'd appreciate a suggestion
for a cleaner approach. I'd like to fix that in a followup
The pretty printer formatting only produces [*] for the most
significant unspecified VLA bound, and the whole machinery
ignores [static] on VLA bounds. I'd like to fix both but I
thought I'd get your suggestion for how to make [*] appear
in inner bounds first.
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 59233 bytes
Desc: not available
More information about the Gcc-patches