From df01833477cc66b6bb7fe08b5c3678fcc900b664 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 28 Jul 2014 20:00:33 +1000 Subject: RNA: check for valid ranges with int properties (C11 only) --- source/blender/makesrna/intern/makesrna.c | 37 +++++++++++++++++++++++++++ source/blender/makesrna/intern/rna_internal.h | 20 +++++++++++++++ 2 files changed, 57 insertions(+) (limited to 'source/blender/makesrna') diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c index 7f1f04cdb6a..9023f25e3d5 100644 --- a/source/blender/makesrna/intern/makesrna.c +++ b/source/blender/makesrna/intern/makesrna.c @@ -745,6 +745,24 @@ static void rna_clamp_value_range(FILE *f, PropertyRNA *prop) } } +#ifdef USE_RNA_RANGE_CHECK +static void rna_clamp_value_range_check( + FILE *f, PropertyRNA *prop, + const char *dnaname_prefix, const char *dnaname) +{ + if (prop->type == PROP_INT) { + IntPropertyRNA *iprop = (IntPropertyRNA *)prop; + fprintf(f, + " { BLI_STATIC_ASSERT(" + "(TYPEOF_MAX(%s%s) >= %d) && " + "(TYPEOF_MIN(%s%s) <= %d), " + "\"invalid limits\"); }\n", + dnaname_prefix, dnaname, iprop->hardmax, + dnaname_prefix, dnaname, iprop->hardmin); + } +} +#endif /* USE_RNA_RANGE_CHECK */ + static void rna_clamp_value(FILE *f, PropertyRNA *prop, int array) { if (prop->type == PROP_INT) { @@ -944,6 +962,18 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr } fprintf(f, " }\n"); } + +#ifdef USE_RNA_RANGE_CHECK + if (dp->dnaname && manualfunc == NULL) { + if (dp->dnaarraylength == 1) { + rna_clamp_value_range_check(f, prop, "data->", dp->dnaname); + } + else { + rna_clamp_value_range_check(f, prop, "*data->", dp->dnaname); + } + } +#endif + fprintf(f, "}\n\n"); } else { @@ -975,6 +1005,13 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr rna_clamp_value(f, prop, 0); } } + +#ifdef USE_RNA_RANGE_CHECK + if (dp->dnaname && manualfunc == NULL) { + rna_clamp_value_range_check(f, prop, "data->", dp->dnaname); + } +#endif + fprintf(f, "}\n\n"); } break; diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h index e3179077cf4..bec6afff131 100644 --- a/source/blender/makesrna/intern/rna_internal.h +++ b/source/blender/makesrna/intern/rna_internal.h @@ -413,4 +413,24 @@ void rna_RenderPass_rect_set(PointerRNA *ptr, const float *values); # endif #endif +/* C11 for compile time range checks */ +#if __STDC_VERSION__ >= 201112L +# define USE_RNA_RANGE_CHECK +# define TYPEOF_MAX(x) \ + _Generic(x, \ + bool: 1, \ + char: CHAR_MAX, signed char: SCHAR_MAX, unsigned char: UCHAR_MAX, \ + signed short: SHRT_MAX, unsigned short: USHRT_MAX, \ + signed int: INT_MAX, unsigned int: UINT_MAX, \ + float: FLT_MAX, double: DBL_MAX) + +# define TYPEOF_MIN(x) \ + _Generic(x, \ + bool: 0, \ + char: CHAR_MIN, signed char: SCHAR_MIN, unsigned char: 0, \ + signed short: SHRT_MIN, unsigned short: 0, \ + signed int: INT_MIN, unsigned int: 0, \ + float: -FLT_MAX, double: -DBL_MAX) +#endif + #endif /* __RNA_INTERNAL_H__ */ -- cgit v1.2.3