Fix: uninitialized variant fc in set_field_refs()
[babeltrace.git] / plugins / ctf / fs-sink / translate-trace-ir-to-ctf-ir.c
index ccc3d9a136ebe25b7cf82cb34034010aa4910716..699b3a5b620d9bb6abb81994704285662f6819f6 100644 (file)
@@ -174,7 +174,7 @@ int create_relative_field_ref(struct ctx *ctx,
        struct fs_sink_ctf_field_class *tgt_fc = NULL;
        uint64_t i;
        int64_t si;
-       const char *tgt_fc_name;
+       const char *tgt_fc_name = NULL;
        struct field_path_elem *field_path_elem;
 
        /* Get target field class's name */
@@ -201,21 +201,29 @@ int create_relative_field_ref(struct ctx *ctx,
 
        i = 0;
 
-       while (i < bt_field_path_get_index_count(tgt_ir_field_path)) {
-               uint64_t index = bt_field_path_get_index_by_index(
-                       tgt_ir_field_path, i);
+       while (i < bt_field_path_get_item_count(tgt_ir_field_path)) {
+               const bt_field_path_item *fp_item =
+                       bt_field_path_borrow_item_by_index_const(
+                               tgt_ir_field_path, i);
                struct fs_sink_ctf_named_field_class *named_fc = NULL;
 
                BT_ASSERT(tgt_fc);
+               BT_ASSERT(fp_item);
 
                switch (tgt_fc->type) {
                case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT:
+                       BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
+                               BT_FIELD_PATH_ITEM_TYPE_INDEX);
                        named_fc = fs_sink_ctf_field_class_struct_borrow_member_by_index(
-                               (void *) tgt_fc, index);
+                               (void *) tgt_fc,
+                               bt_field_path_item_index_get_index(fp_item));
                        break;
                case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT:
+                       BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
+                               BT_FIELD_PATH_ITEM_TYPE_INDEX);
                        named_fc = fs_sink_ctf_field_class_variant_borrow_option_by_index(
-                               (void *) tgt_fc, index);
+                               (void *) tgt_fc,
+                               bt_field_path_item_index_get_index(fp_item));
                        break;
                case FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY:
                case FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE:
@@ -223,6 +231,8 @@ int create_relative_field_ref(struct ctx *ctx,
                        struct fs_sink_ctf_field_class_array_base *array_base_fc =
                                (void *) tgt_fc;
 
+                       BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
+                               BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT);
                        tgt_fc = array_base_fc->elem_fc;
                        break;
                }
@@ -351,25 +361,34 @@ int create_absolute_field_ref(struct ctx *ctx,
 
        BT_ASSERT(fc);
 
-       for (i = 0; i < bt_field_path_get_index_count(tgt_ir_field_path); i++) {
-               uint64_t index = bt_field_path_get_index_by_index(
-                       tgt_ir_field_path, i);
+       for (i = 0; i < bt_field_path_get_item_count(tgt_ir_field_path); i++) {
+               const bt_field_path_item *fp_item =
+                       bt_field_path_borrow_item_by_index_const(
+                               tgt_ir_field_path, i);
                struct fs_sink_ctf_named_field_class *named_fc = NULL;
 
+               if (bt_field_path_item_get_type(fp_item) !=
+                               BT_FIELD_PATH_ITEM_TYPE_INDEX) {
+                       /* Not supported by TSDL 1.8 */
+                       ret = -1;
+                       goto end;
+               }
+
                switch (fc->type) {
                case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT:
+                       BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
+                               BT_FIELD_PATH_ITEM_TYPE_INDEX);
                        named_fc = fs_sink_ctf_field_class_struct_borrow_member_by_index(
-                               (void *) fc, index);
+                               (void *) fc,
+                               bt_field_path_item_index_get_index(fp_item));
                        break;
                case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT:
+                       BT_ASSERT(bt_field_path_item_get_type(fp_item) ==
+                               BT_FIELD_PATH_ITEM_TYPE_INDEX);
                        named_fc = fs_sink_ctf_field_class_variant_borrow_option_by_index(
-                               (void *) fc, index);
+                               (void *) fc,
+                               bt_field_path_item_index_get_index(fp_item));
                        break;
-               case FS_SINK_CTF_FIELD_CLASS_TYPE_ARRAY:
-               case FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE:
-                       /* Not supported by TSDL 1.8 */
-                       ret = -1;
-                       goto end;
                default:
                        abort();
                }
@@ -877,23 +896,26 @@ end:
  * sequence field class.
  */
 static
-int set_field_refs(struct fs_sink_ctf_field_class *fc, const char *fc_name,
-               struct fs_sink_ctf_field_class *parent_fc)
+int set_field_refs(struct fs_sink_ctf_field_class * const fc,
+               const char *fc_name, struct fs_sink_ctf_field_class *parent_fc)
 {
        int ret = 0;
+       enum fs_sink_ctf_field_class_type fc_type;
        BT_ASSERT(fc);
 
-       switch (fc->type) {
+       fc_type = fc->type;
+
+       switch (fc_type) {
        case FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT:
        case FS_SINK_CTF_FIELD_CLASS_TYPE_VARIANT:
        {
                uint64_t i;
                uint64_t len;
                struct fs_sink_ctf_field_class_struct *struct_fc;
-               struct fs_sink_ctf_field_class_variant *var_fc;
+               struct fs_sink_ctf_field_class_variant *var_fc = NULL;
                struct fs_sink_ctf_named_field_class *named_fc;
 
-               if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) {
+               if (fc_type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) {
                        struct_fc = (void *) fc;
                        len = struct_fc->members->len;
                } else {
@@ -906,7 +928,7 @@ int set_field_refs(struct fs_sink_ctf_field_class *fc, const char *fc_name,
                }
 
                for (i = 0; i < len; i++) {
-                       if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) {
+                       if (fc_type == FS_SINK_CTF_FIELD_CLASS_TYPE_STRUCT) {
                                named_fc = fs_sink_ctf_field_class_struct_borrow_member_by_index(
                                        struct_fc, i);
                        } else {
@@ -929,7 +951,7 @@ int set_field_refs(struct fs_sink_ctf_field_class *fc, const char *fc_name,
                struct fs_sink_ctf_field_class_array_base *array_base_fc =
                        (void *) fc;
 
-               if (fc->type == FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE) {
+               if (fc_type == FS_SINK_CTF_FIELD_CLASS_TYPE_SEQUENCE) {
                        ret = set_field_ref(fc, fc_name, parent_fc);
                        if (ret) {
                                goto end;
This page took 0.024979 seconds and 4 git commands to generate.