From 72f997edf66cb766b97feac709888c57852be084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Fri, 1 Nov 2019 16:48:31 +0900 Subject: mark functions that do not return NULL as such. Apply __attribute__((__returns_nonnull__)) when available. --- include/ruby/defines.h | 29 +++++++++++++++++++---------- internal.h | 4 ++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/include/ruby/defines.h b/include/ruby/defines.h index 213956c3eb..5e03d49985 100644 --- a/include/ruby/defines.h +++ b/include/ruby/defines.h @@ -235,11 +235,20 @@ RUBY_SYMBOL_EXPORT_BEGIN # define RUBY_ATTR_MALLOC #endif -void *ruby_xmalloc(size_t) RUBY_ATTR_MALLOC RUBY_ATTR_ALLOC_SIZE((1)); -void *ruby_xmalloc2(size_t,size_t) RUBY_ATTR_MALLOC RUBY_ATTR_ALLOC_SIZE((1,2)); -void *ruby_xcalloc(size_t,size_t) RUBY_ATTR_MALLOC RUBY_ATTR_ALLOC_SIZE((1,2)); -void *ruby_xrealloc(void*,size_t) RUBY_ATTR_ALLOC_SIZE((2)); -void *ruby_xrealloc2(void*,size_t,size_t) RUBY_ATTR_ALLOC_SIZE((2,3)); +#ifdef __has_attribute +# if __has_attribute(returns_nonnull) +# define RUBY_ATTR_RETURNS_NONNULL __attribute__((__returns_nonnull__)) +# endif +#endif +#ifndef RUBY_ATTR_RETURNS_NONNULL +# define RUBY_ATTR_RETURNS_NONNULL +#endif + +void *ruby_xmalloc(size_t) RUBY_ATTR_MALLOC RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((1)); +void *ruby_xmalloc2(size_t,size_t) RUBY_ATTR_MALLOC RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((1,2)); +void *ruby_xcalloc(size_t,size_t) RUBY_ATTR_MALLOC RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((1,2)); +void *ruby_xrealloc(void*,size_t) RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((2)); +void *ruby_xrealloc2(void*,size_t,size_t) RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((2,3)); void ruby_xfree(void*); #ifndef USE_GC_MALLOC_OBJ_INFO_DETAILS @@ -248,11 +257,11 @@ void ruby_xfree(void*); #if USE_GC_MALLOC_OBJ_INFO_DETAILS -void *ruby_xmalloc_body(size_t) RUBY_ATTR_ALLOC_SIZE((1)); -void *ruby_xmalloc2_body(size_t,size_t) RUBY_ATTR_ALLOC_SIZE((1,2)); -void *ruby_xcalloc_body(size_t,size_t) RUBY_ATTR_ALLOC_SIZE((1,2)); -void *ruby_xrealloc_body(void*,size_t) RUBY_ATTR_ALLOC_SIZE((2)); -void *ruby_xrealloc2_body(void*,size_t,size_t) RUBY_ATTR_ALLOC_SIZE((2,3)); +void *ruby_xmalloc_body(size_t) RUBY_ATTR_MALLOC RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((1)); +void *ruby_xmalloc2_body(size_t,size_t) RUBY_ATTR_MALLOC RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((1,2)); +void *ruby_xcalloc_body(size_t,size_t) RUBY_ATTR_MALLOC RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((1,2)); +void *ruby_xrealloc_body(void*,size_t) RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((2)); +void *ruby_xrealloc2_body(void*,size_t,size_t) RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((2,3)); #define ruby_xmalloc(s1) ruby_xmalloc_with_location(s1, __FILE__, __LINE__) #define ruby_xmalloc2(s1, s2) ruby_xmalloc2_with_location(s1, s2, __FILE__, __LINE__) diff --git a/internal.h b/internal.h index c10bac5358..6c6e262f65 100644 --- a/internal.h +++ b/internal.h @@ -1624,8 +1624,8 @@ void rb_copy_wb_protected_attribute(VALUE dest, VALUE obj); #define SIZED_REALLOC_N(var,type,n,old_n) REALLOC_N(var, type, n) #else RUBY_SYMBOL_EXPORT_BEGIN -void *ruby_sized_xrealloc(void *ptr, size_t new_size, size_t old_size) RUBY_ATTR_ALLOC_SIZE((2)); -void *ruby_sized_xrealloc2(void *ptr, size_t new_count, size_t element_size, size_t old_count) RUBY_ATTR_ALLOC_SIZE((2, 3)); +void *ruby_sized_xrealloc(void *ptr, size_t new_size, size_t old_size) RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((2)); +void *ruby_sized_xrealloc2(void *ptr, size_t new_count, size_t element_size, size_t old_count) RUBY_ATTR_RETURNS_NONNULL RUBY_ATTR_ALLOC_SIZE((2, 3)); void ruby_sized_xfree(void *x, size_t size); RUBY_SYMBOL_EXPORT_END #define SIZED_REALLOC_N(var,type,n,old_n) ((var)=(type*)ruby_sized_xrealloc2((void*)(var), (n), sizeof(type), (old_n))) -- cgit v1.2.3