diff options
Diffstat (limited to 'libctf/testsuite/libctf-writable')
15 files changed, 263 insertions, 0 deletions
diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-crash-lib.c b/libctf/testsuite/libctf-writable/parent-child-dtd-crash-lib.c new file mode 100644 index 0000000..363cddc --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-crash-lib.c @@ -0,0 +1,179 @@ +/* Make sure we do various things right that involve DTD lookups of parents + from the perspective of children. */ + +#include <ctf-api.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +enum crash_method { ADD_STRUCT, ADD_UNION, ADD_MEMBER_OFFSET, ADD_MEMBER_ENCODED, ADD_ENUM, ADD_ENUMERATOR, SET_ARRAY }; + +void +dtd_crash (enum crash_method method, int parent_bigger) +{ + ctf_dict_t *pfp, *cfp; + ctf_encoding_t e = { CTF_INT_SIGNED, 0, sizeof (long) }; + ctf_id_t ptype, ftype, stype, foo; + int forward_kind = CTF_K_STRUCT; + size_t i; + int err; + + /* Maybe make the relevant type IDs in the parent much bigger than those + in the child, or maybe vice versa. */ + + if ((pfp = ctf_create (&err)) == NULL) + goto create_err; + + if (parent_bigger) + { + if ((foo = ctf_add_integer (pfp, CTF_ADD_NONROOT, "blah", &e)) == CTF_ERR) + goto create_parent; + + for (i = 0; i < 4096; i++) + if (ctf_add_pointer (pfp, CTF_ADD_NONROOT, foo) == CTF_ERR) + goto create_parent; + } + + if ((ptype = ctf_add_integer (pfp, CTF_ADD_NONROOT, "int", &e)) == CTF_ERR) + goto create_parent; + + /* Add a forward to a struct, union, or enum (depending on the method) in + the parent, so we can try to replace it in the child and see what + happens. (Most of them are structs, or it doesn't matter, as for + SET_ARRAY; so we do that by default.) */ + + switch (method) + { + case ADD_UNION: + forward_kind = CTF_K_UNION; + break; + case ADD_ENUM: + case ADD_ENUMERATOR: + forward_kind = CTF_K_ENUM; + break; + /* Placate clang. */ + default: + break; + } + + if ((ftype = ctf_add_forward (pfp, CTF_ADD_ROOT, "foo", forward_kind)) == CTF_ERR) + goto create_parent; + + if ((cfp = ctf_create (&err)) == NULL) + goto create_err; + + if (ctf_import (cfp, pfp) < 0) + goto create_child; + + if (!parent_bigger) + { + if ((foo = ctf_add_integer (pfp, CTF_ADD_NONROOT, "blah", &e)) == CTF_ERR) + goto create_parent; + + for (i = 0; i < 4096; i++) + if (ctf_add_pointer (pfp, CTF_ADD_NONROOT, foo) == CTF_ERR) + goto create_parent; + } + + switch (method) + { + /* These try to replace a forward, and should not do so if we're + adding in the child and it's in the parent. */ + case ADD_STRUCT: + if ((stype = ctf_add_struct_sized (cfp, CTF_ADD_ROOT, "foo", 1024)) == CTF_ERR) + goto create_child; + if (stype == ftype) + fprintf (stderr, "Forward-promotion spotted!\n"); + break; + + case ADD_UNION: + if ((stype = ctf_add_union_sized (cfp, CTF_ADD_ROOT, "foo", 1024)) == CTF_ERR) + goto create_child; + if (stype == ftype) + fprintf (stderr, "Forward-promotion spotted!\n"); + break; + + case ADD_ENUM: + if ((stype = ctf_add_enum (cfp, CTF_ADD_ROOT, "foo")) == CTF_ERR) + goto create_child; + if (stype == ftype) + fprintf (stderr, "Forward-promotion spotted!\n"); + break; + + /* These try to look up the struct/union/enum we're adding to: make + sure this works from the perspective of the child if the type is in + the parent. Also make sure that addition of child types to parent + types this way is prohibited, and that addition of parent types to + parent types is allowed. */ + case ADD_MEMBER_OFFSET: + { + ctf_id_t ctype; + + if ((stype = ctf_add_struct (pfp, CTF_ADD_ROOT, "bar")) == CTF_ERR) + goto create_child; + + if ((ctype = ctf_add_integer (cfp, CTF_ADD_NONROOT, "xyzzy", &e)) == CTF_ERR) + goto create_child; + + if (ctf_add_member_offset (cfp, stype, "member", ptype, 5) == CTF_ERR) + goto create_child; + + if (ctf_add_member_offset (cfp, stype, "xyzzy", ctype, 4) != CTF_ERR) + fprintf (stderr, "Addition of child type to parent via child unexpectedly succeeded\n"); + else if (ctf_errno (cfp) == 0) + fprintf (stderr, "got error from ctype addition to parent struct, but no error found on child\n"); + + break; + } + + case ADD_ENUMERATOR: + if ((stype = ctf_add_enum (pfp, CTF_ADD_ROOT, "bar")) == CTF_ERR) + goto create_parent; + + if (ctf_add_enumerator (cfp, stype, "FOO", 0) == CTF_ERR) + goto create_child; + break; + + /* This tries to look up the member type we're adding, and goes wrong + if the struct is in the child and the member type is in the parent. */ + case ADD_MEMBER_ENCODED: + if ((stype = ctf_add_struct (cfp, CTF_ADD_ROOT, "foo")) == CTF_ERR) + goto create_child; + + if (ctf_add_member_encoded (cfp, stype, "cmember", ptype, 5, e) == CTF_ERR) + goto create_child; + break; + + /* This tries to look up the array we're resetting the state of. */ + case SET_ARRAY: + { + ctf_arinfo_t ar; + + ar.ctr_contents = ptype; + ar.ctr_index = ptype; + ar.ctr_nelems = 5; + + if ((stype = ctf_add_array (pfp, CTF_ADD_ROOT, &ar)) == CTF_ERR) + goto create_child; + + if (ctf_set_array (cfp, stype, &ar) == CTF_ERR) + goto create_child; + break; + } + } + + ctf_dict_close (cfp); + ctf_dict_close (pfp); + + return; + + create_err: + fprintf (stderr, "Creation failed: %s\n", ctf_errmsg (err)); + exit (1); + create_parent: + fprintf (stderr, "Cannot create parent type: %s\n", ctf_errmsg (ctf_errno (pfp))); + exit (1); + create_child: + fprintf (stderr, "Cannot create child type: %s\n", ctf_errmsg (ctf_errno (cfp))); + exit (1); +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-enum.c b/libctf/testsuite/libctf-writable/parent-child-dtd-enum.c new file mode 100644 index 0000000..0d44d2f --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-enum.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(ADD_ENUM, 0); + dtd_crash(ADD_ENUM, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-enum.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-enum.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-enum.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-enumerator.c b/libctf/testsuite/libctf-writable/parent-child-dtd-enumerator.c new file mode 100644 index 0000000..c9acfbc --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-enumerator.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(ADD_ENUMERATOR, 0); + dtd_crash(ADD_ENUMERATOR, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-enumerator.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-enumerator.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-enumerator.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-member-encoded.c b/libctf/testsuite/libctf-writable/parent-child-dtd-member-encoded.c new file mode 100644 index 0000000..447073e --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-member-encoded.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(ADD_MEMBER_ENCODED, 0); + dtd_crash(ADD_MEMBER_ENCODED, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-member-encoded.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-member-encoded.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-member-encoded.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-member-offset.c b/libctf/testsuite/libctf-writable/parent-child-dtd-member-offset.c new file mode 100644 index 0000000..9aa7c28 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-member-offset.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(ADD_MEMBER_OFFSET, 0); + dtd_crash(ADD_MEMBER_OFFSET, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-member-offset.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-member-offset.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-member-offset.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-set-array.c b/libctf/testsuite/libctf-writable/parent-child-dtd-set-array.c new file mode 100644 index 0000000..079c4fb --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-set-array.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(SET_ARRAY, 0); + dtd_crash(SET_ARRAY, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-set-array.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-set-array.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-set-array.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-struct.c b/libctf/testsuite/libctf-writable/parent-child-dtd-struct.c new file mode 100644 index 0000000..39fb9d9 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-struct.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(ADD_STRUCT, 0); + dtd_crash(ADD_STRUCT, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-struct.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-struct.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-struct.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-union.c b/libctf/testsuite/libctf-writable/parent-child-dtd-union.c new file mode 100644 index 0000000..9e70df5 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-union.c @@ -0,0 +1,11 @@ +#include "parent-child-dtd-crash-lib.c" + +int main (void) +{ + dtd_crash(ADD_UNION, 0); + dtd_crash(ADD_UNION, 1); + + printf("Creation successful.\n"); + + return 0; +} diff --git a/libctf/testsuite/libctf-writable/parent-child-dtd-union.lk b/libctf/testsuite/libctf-writable/parent-child-dtd-union.lk new file mode 100644 index 0000000..801c663 --- /dev/null +++ b/libctf/testsuite/libctf-writable/parent-child-dtd-union.lk @@ -0,0 +1 @@ +Creation successful.
\ No newline at end of file |