[[gnu::access (read_write, 1), gnu::access (read_only, 2)]]
char* strcat (char*, const char*);
honestly, why are those attributes always indexing into parameters; it just seems so much more natural (and less error prone) to do:
char* strcat ([[gnu::access(rw)]] char*, [[gnu::access(ro)]] const char*);
(though also, the const already says it’s read-only, does it not =w=)