[Bf-blender-cvs] [51befa41081] master: DNA: fix asan warning when casting types

Jacques Lucke noreply at git.blender.org
Thu Sep 10 18:40:07 CEST 2020


Commit: 51befa4108128a7bacf7a201046cf7ede999833a
Author: Jacques Lucke
Date:   Thu Sep 10 18:40:00 2020 +0200
Branches: master
https://developer.blender.org/rB51befa4108128a7bacf7a201046cf7ede999833a

DNA: fix asan warning when casting types

Reviewers: brecht

Differential Revision: https://developer.blender.org/D8865

===================================================================

M	source/blender/makesdna/intern/dna_genfile.c

===================================================================

diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index 8ad0271f355..b9688df8a3e 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -805,83 +805,91 @@ static eSDNA_Type sdna_type_nr(const char *dna_type)
 static void cast_elem(
     const char *ctype, const char *otype, int name_array_len, char *curdata, const char *olddata)
 {
-  double val = 0.0;
-  int curlen = 1, oldlen = 1;
-
   eSDNA_Type ctypenr, otypenr;
-
   if ((otypenr = sdna_type_nr(otype)) == -1 || (ctypenr = sdna_type_nr(ctype)) == -1) {
     return;
   }
 
   /* define lengths */
-  oldlen = DNA_elem_type_size(otypenr);
-  curlen = DNA_elem_type_size(ctypenr);
+  const int oldlen = DNA_elem_type_size(otypenr);
+  const int curlen = DNA_elem_type_size(ctypenr);
+
+  double old_value_f = 0.0;
+  uint64_t old_value_i = 0;
 
   while (name_array_len > 0) {
     switch (otypenr) {
       case SDNA_TYPE_CHAR:
-        val = *olddata;
+        old_value_i = *olddata;
+        old_value_f = (double)old_value_i;
         break;
       case SDNA_TYPE_UCHAR:
-        val = *((unsigned char *)olddata);
+        old_value_i = *((unsigned char *)olddata);
+        old_value_f = (double)old_value_i;
         break;
       case SDNA_TYPE_SHORT:
-        val = *((short *)olddata);
+        old_value_i = *((short *)olddata);
+        old_value_f = (double)old_value_i;
         break;
       case SDNA_TYPE_USHORT:
-        val = *((unsigned short *)olddata);
+        old_value_i = *((unsigned short *)olddata);
+        old_value_f = (double)old_value_i;
         break;
       case SDNA_TYPE_INT:
-        val = *((int *)olddata);
+        old_value_i = *((int *)olddata);
+        old_value_f = (double)old_value_i;
         break;
       case SDNA_TYPE_FLOAT:
-        val = *((float *)olddata);
+        old_value_f = *((float *)olddata);
+        old_value_i = (uint64_t)(int64_t)old_value_f;
         break;
       case SDNA_TYPE_DOUBLE:
-        val = *((double *)olddata);
+        old_value_f = *((double *)olddata);
+        old_value_i = (uint64_t)(int64_t)old_value_f;
         break;
       case SDNA_TYPE_INT64:
-        val = *((int64_t *)olddata);
+        old_value_i = (uint64_t) * ((int64_t *)olddata);
+        old_value_f = (double)old_value_i;
         break;
       case SDNA_TYPE_UINT64:
-        val = *((uint64_t *)olddata);
+        old_value_i = *((uint64_t *)olddata);
+        old_value_f = (double)old_value_i;
         break;
     }
 
     switch (ctypenr) {
       case SDNA_TYPE_CHAR:
-        *curdata = val;
+        *curdata = (char)old_value_i;
         break;
       case SDNA_TYPE_UCHAR:
-        *((unsigned char *)curdata) = val;
+        *((unsigned char *)curdata) = (unsigned char)old_value_i;
         break;
       case SDNA_TYPE_SHORT:
-        *((short *)curdata) = val;
+        *((short *)curdata) = (short)old_value_i;
         break;
       case SDNA_TYPE_USHORT:
-        *((unsigned short *)curdata) = val;
+        *((unsigned short *)curdata) = (unsigned short)old_value_i;
         break;
       case SDNA_TYPE_INT:
-        *((int *)curdata) = val;
+        *((int *)curdata) = (int)old_value_i;
         break;
       case SDNA_TYPE_FLOAT:
         if (otypenr < 2) {
-          val /= 255;
+          old_value_f /= 255.0;
         }
-        *((float *)curdata) = val;
+        *((float *)curdata) = old_value_f;
         break;
       case SDNA_TYPE_DOUBLE:
         if (otypenr < 2) {
-          val /= 255;
+          old_value_f /= 255.0;
         }
-        *((double *)curdata) = val;
+        *((double *)curdata) = old_value_f;
         break;
       case SDNA_TYPE_INT64:
-        *((int64_t *)curdata) = val;
+        *((int64_t *)curdata) = (int64_t)old_value_i;
         break;
       case SDNA_TYPE_UINT64:
-        *((uint64_t *)curdata) = val;
+        *((uint64_t *)curdata) = old_value_i;
         break;
     }



More information about the Bf-blender-cvs mailing list