[Bf-blender-cvs] [83dd16a] missing-libs: Add some checks in BKE_xxx_init() that data is really NULLified.

Bastien Montagne noreply at git.blender.org
Wed Jul 15 20:46:16 CEST 2015


Commit: 83dd16a6d636fea9c17b765e10f67d7f71ce0bc0
Author: Bastien Montagne
Date:   Wed Jul 15 14:03:51 2015 +0200
Branches: missing-libs
https://developer.blender.org/rB83dd16a6d636fea9c17b765e10f67d7f71ce0bc0

Add some checks in BKE_xxx_init() that data is really NULLified.

Needed, since trying to (re)init data already set could lead to many issues,
and handling this is not in the scope of this function.

Note that definition of BLI_memcmp_null stuff is rather bad currently, no good idea where to place this. :|

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

M	source/blender/blenkernel/intern/brush.c
M	source/blender/blenkernel/intern/curve.c
M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenlib/BLI_utildefines.h
M	source/blender/blenlib/intern/array_utils.c

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

diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index a8b1919..4ce8df8 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -133,6 +133,8 @@ static void brush_defaults(Brush *brush)
 
 void BKE_brush_init(Brush *brush)
 {
+	BLI_assert(MEMCMP_NULL_STRUCT_OFS(brush, id));
+
 	/* enable fake user by default */
 	brush->id.flag |= LIB_FAKEUSER;
 
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 8ea0f73..6ab5698 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -163,6 +163,8 @@ void BKE_curve_free(Curve *cu)
 
 void BKE_curve_init(Curve *cu)
 {
+	BLI_assert(MEMCMP_NULL_STRUCT_OFS(cu, id));
+
 	copy_v3_fl(cu->size, 1.0f);
 	cu->flag = CU_FRONT | CU_BACK | CU_DEFORM_BOUNDS_OFF | CU_PATH_RADIUS;
 	cu->pathlen = 100;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index b9d2040..c9843f2 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -492,6 +492,8 @@ static void mesh_tessface_clear_intern(Mesh *mesh, int free_customdata)
 
 void BKE_mesh_init(Mesh *me)
 {
+	BLI_assert(MEMCMP_NULL_STRUCT_OFS(me, id));
+
 	me->size[0] = me->size[1] = me->size[2] = 1.0;
 	me->smoothresh = 30;
 	me->texflag = ME_AUTOSPACE;
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index cb7a17a..845605c 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -971,6 +971,8 @@ void *BKE_object_obdata_add_from_type(Main *bmain, int type, const char *name)
 
 void BKE_object_init(Object *ob)
 {
+	BLI_assert(MEMCMP_NULL_STRUCT_OFS(ob, id));
+
 	ob->col[0] = ob->col[1] = ob->col[2] = 1.0;
 	ob->col[3] = 1.0;
 	
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 093688c..fb79a18 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -459,6 +459,8 @@ void BKE_scene_init(Scene *sce)
 	const char *colorspace_name;
 	SceneRenderView *srv;
 
+	BLI_assert(MEMCMP_NULL_STRUCT_OFS(sce, id));
+
 	sce->lay = sce->layact = 1;
 	
 	sce->r.mode = R_GAMMA | R_OSA | R_SHADOW | R_SSS | R_ENVMAP | R_RAYTRACE;
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index 8f2f906..8171988 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -684,6 +684,17 @@ extern void BLI_system_backtrace(FILE *fp);
 #  define UNLIKELY(x)     (x)
 #endif
 
+/* ***** BAD! ***** */
+/* XXX Defined in array_utils.c for now. :( */
+int BLI_memcmp_null(char *p, const size_t size);
+/* ***** END of BAD! ***** */
+
+#define MEMCMP_NULL_STRUCT_OFS(struct_var, member) \
+	(BLI_memcmp_null( \
+	       (char *)(struct_var)  + OFFSETOF_STRUCT(struct_var, member), \
+	       sizeof(*(struct_var)) - OFFSETOF_STRUCT(struct_var, member)) == 0)
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenlib/intern/array_utils.c b/source/blender/blenlib/intern/array_utils.c
index 6c5dc5a..05ddcda 100644
--- a/source/blender/blenlib/intern/array_utils.c
+++ b/source/blender/blenlib/intern/array_utils.c
@@ -118,3 +118,16 @@ int _bli_array_findindex(const void *arr, unsigned int arr_len, size_t arr_strid
 	}
 	return -1;
 }
+
+/* XXX ABSOLUTELY UGLY!!! */
+int BLI_memcmp_null(char *p, const size_t size) {
+	const char null_buff[4096] = {0};
+	char *null = (char *)null_buff;
+
+	if (UNLIKELY((size) > 4096)) {
+		null = alloca(sizeof(*null) * size);
+		memset(null, 0, sizeof(*null) * size);
+	}
+
+	return memcmp(p, null, size);
+}




More information about the Bf-blender-cvs mailing list