libctf: prohibit nameless ints, floats, typedefs and forwards

Now that "anonymous typedef nodes" have been extirpated, we can mandate
that things that have names in C must have names in CTF too.  (Unlike
the no-forwards embarrassment, the deduplicator does nothing special
with names: types that have names in C will have the same name in CTF.
So we can assume that the CTF rules and the C rules are the same.)

include/ChangeLog
2021-01-27  Nick Alcock  <nick.alcock@oracle.com>

	* ctf-api.h (ECTF_NONAME): New.
	(ECTF_NERR): Adjust.

libctf/ChangeLog
2021-01-27  Nick Alcock  <nick.alcock@oracle.com>

	* ctf-create.c (ctf_add_encoded): Add check for non-empty name.
	(ctf_add_forward): Likewise.
	(ctf_add_typedef): Likewise.
This commit is contained in:
Nick Alcock 2021-01-27 19:55:45 +00:00
parent 78f28b89e8
commit caa170493e
4 changed files with 24 additions and 4 deletions

View file

@ -1,3 +1,9 @@
2021-01-27 Nick Alcock <nick.alcock@oracle.com>
* ctf-create.c (ctf_add_encoded): Add check for non-empty name.
(ctf_add_forward): Likewise.
(ctf_add_typedef): Likewise.
2021-01-27 Nick Alcock <nick.alcock@oracle.com>
* ctf-open.c (init_types): Rip out code to check anonymous typedef

View file

@ -1595,6 +1595,9 @@ ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
if (ep == NULL)
return (ctf_set_errno (fp, EINVAL));
if (name == NULL || name[0] == '\0')
return (ctf_set_errno (fp, ECTF_NONAME));
if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
return CTF_ERR; /* errno is set for us. */
@ -1961,11 +1964,13 @@ ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
if (!ctf_forwardable_kind (kind))
return (ctf_set_errno (fp, ECTF_NOTSUE));
if (name == NULL || name[0] == '\0')
return (ctf_set_errno (fp, ECTF_NONAME));
/* If the type is already defined or exists as a forward tag, just
return the ctf_id_t of the existing definition. */
if (name != NULL)
type = ctf_lookup_by_rawname (fp, kind, name);
type = ctf_lookup_by_rawname (fp, kind, name);
if (type)
return type;
@ -1990,6 +1995,9 @@ ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
return (ctf_set_errno (fp, EINVAL));
if (name == NULL || name[0] == '\0')
return (ctf_set_errno (fp, ECTF_NONAME));
if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
return CTF_ERR; /* errno is set for us. */