diff --git a/include/nuttx/compiler.h b/include/nuttx/compiler.h index dcafb0a6e9d..26d132d9657 100644 --- a/include/nuttx/compiler.h +++ b/include/nuttx/compiler.h @@ -233,6 +233,20 @@ # define used_code __attribute__((used)) # define used_data __attribute__((used)) +/* The allocation function annonations */ + +# if __GNUC__ >= 11 +# define malloc_like __attribute__((__malloc__(__builtin_free, 1))) +# define malloc_like1(a) __attribute__((__malloc__(__builtin_free, 1))) __attribute__((__alloc_size__(a))) +# define malloc_like2(a, b) __attribute__((__malloc__(__builtin_free, 1))) __attribute__((__alloc_size__(a, b))) +# define realloc_like(a) __attribute__((__alloc_size__(a))) +# else +# define malloc_like __attribute__((__malloc__)) +# define malloc_like1(a) __attribute__((__malloc__)) __attribute__((__alloc_size__(a))) +# define malloc_like2(a, b) __attribute__((__malloc__)) __attribute__((__alloc_size__(a, b))) +# define realloc_like(a) __attribute__((__alloc_size__(a))) +# endif + /* Some versions of GCC have a separate __syslog__ format. * http://mail-index.netbsd.org/source-changes/2015/10/14/msg069435.html * Use it if available. Otherwise, assume __printf__ accepts %m. @@ -481,6 +495,11 @@ # define used_code # define used_data +# define malloc_like +# define malloc_like1(a) +# define malloc_like2(a, b) +# define realloc_like(a) + # define formatlike(a) # define printflike(a, b) # define sysloglike(a, b) @@ -612,6 +631,10 @@ # define unused_data # define used_code # define used_data +# define malloc_like +# define malloc_like1(a) +# define malloc_like2(a, b) +# define realloc_like(a) # define formatlike(a) # define printflike(a, b) # define sysloglike(a, b) @@ -714,6 +737,10 @@ # define unused_data # define used_code # define used_data +# define malloc_like +# define malloc_like1(a) +# define malloc_like2(a, b) +# define realloc_like(a) # define formatlike(a) # define printflike(a, b) # define sysloglike(a, b) @@ -795,6 +822,10 @@ # define unused_data # define used_code # define used_data +# define malloc_like +# define malloc_like1(a) +# define malloc_like2(a, b) +# define realloc_like(a) # define formatlike(a) # define printflike(a, b) # define sysloglike(a, b) @@ -851,6 +882,10 @@ # define unused_data # define used_code # define used_data +# define malloc_like +# define malloc_like1(a) +# define malloc_like2(a, b) +# define realloc_like(a) # define formatlike(a) # define printflike(a, b) # define sysloglike(a, b) diff --git a/include/nuttx/mm/mm.h b/include/nuttx/mm/mm.h index 2cdd2324a15..b08a6df78be 100644 --- a/include/nuttx/mm/mm.h +++ b/include/nuttx/mm/mm.h @@ -180,12 +180,12 @@ void kmm_addregion(FAR void *heapstart, size_t heapsize); /* Functions contained in mm_malloc.c ***************************************/ -FAR void *mm_malloc(FAR struct mm_heap_s *heap, size_t size); +FAR void *mm_malloc(FAR struct mm_heap_s *heap, size_t size) malloc_like1(2); /* Functions contained in kmm_malloc.c **************************************/ #ifdef CONFIG_MM_KERNEL_HEAP -FAR void *kmm_malloc(size_t size); +FAR void *kmm_malloc(size_t size) malloc_like1(1); #endif /* Functions contained in mm_malloc_size.c **********************************/ @@ -211,32 +211,33 @@ void kmm_free(FAR void *mem); /* Functions contained in mm_realloc.c **************************************/ FAR void *mm_realloc(FAR struct mm_heap_s *heap, FAR void *oldmem, - size_t size); + size_t size) realloc_like(3); /* Functions contained in kmm_realloc.c *************************************/ #ifdef CONFIG_MM_KERNEL_HEAP -FAR void *kmm_realloc(FAR void *oldmem, size_t newsize); +FAR void *kmm_realloc(FAR void *oldmem, size_t newsize) realloc_like(2); #endif /* Functions contained in mm_calloc.c ***************************************/ -FAR void *mm_calloc(FAR struct mm_heap_s *heap, size_t n, size_t elem_size); +FAR void *mm_calloc(FAR struct mm_heap_s *heap, size_t n, + size_t elem_size) malloc_like2(2, 3); /* Functions contained in kmm_calloc.c **************************************/ #ifdef CONFIG_MM_KERNEL_HEAP -FAR void *kmm_calloc(size_t n, size_t elem_size); +FAR void *kmm_calloc(size_t n, size_t elem_size) malloc_like2(1, 2); #endif /* Functions contained in mm_zalloc.c ***************************************/ -FAR void *mm_zalloc(FAR struct mm_heap_s *heap, size_t size); +FAR void *mm_zalloc(FAR struct mm_heap_s *heap, size_t size) malloc_like1(2); /* Functions contained in kmm_zalloc.c **************************************/ #ifdef CONFIG_MM_KERNEL_HEAP -FAR void *kmm_zalloc(size_t size); +FAR void *kmm_zalloc(size_t size) malloc_like1(1); #endif /* Functions contained in kmm_memdump.c *************************************/ @@ -248,12 +249,12 @@ void kmm_memdump(pid_t pid); /* Functions contained in mm_memalign.c *************************************/ FAR void *mm_memalign(FAR struct mm_heap_s *heap, size_t alignment, - size_t size); + size_t size) malloc_like1(3); /* Functions contained in kmm_memalign.c ************************************/ #ifdef CONFIG_MM_KERNEL_HEAP -FAR void *kmm_memalign(size_t alignment, size_t size); +FAR void *kmm_memalign(size_t alignment, size_t size) malloc_like1(2); #endif /* Functions contained in mm_heapmember.c ***********************************/ diff --git a/include/stdio.h b/include/stdio.h index 840a6a5818d..6e1dd5c98bc 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -229,7 +229,7 @@ int vdprintf(int fd, FAR const IPTR char *fmt, va_list ap) FAR FILE *tmpfile(void); FAR char *tmpnam(FAR char *s); -FAR char *tempnam(FAR const char *dir, FAR const char *pfx); +FAR char *tempnam(FAR const char *dir, FAR const char *pfx) malloc_like; int remove(FAR const char *path); /* Shell operations. These are not actually implemented in the OS. See diff --git a/include/stdlib.h b/include/stdlib.h index 4141b3a71cf..a915e407cec 100644 --- a/include/stdlib.h +++ b/include/stdlib.h @@ -213,14 +213,14 @@ size_t wcstombs(FAR char *dst, FAR const wchar_t *src, size_t len); /* Memory Management */ -FAR void *malloc(size_t); -FAR void *valloc(size_t); +FAR void *malloc(size_t) malloc_like1(1); +FAR void *valloc(size_t) malloc_like1(1); void free(FAR void *); -FAR void *realloc(FAR void *, size_t); -FAR void *memalign(size_t, size_t); -FAR void *zalloc(size_t); -FAR void *calloc(size_t, size_t); -FAR void *aligned_alloc(size_t, size_t); +FAR void *realloc(FAR void *, size_t) realloc_like(2); +FAR void *memalign(size_t, size_t) malloc_like1(2); +FAR void *zalloc(size_t) malloc_like1(1); +FAR void *calloc(size_t, size_t) malloc_like2(1, 2); +FAR void *aligned_alloc(size_t, size_t) malloc_like1(2); int posix_memalign(FAR void **, size_t, size_t); /* Pseudo-Terminals */ diff --git a/include/string.h b/include/string.h index 7e449fe6ed5..f876ae8f8c5 100644 --- a/include/string.h +++ b/include/string.h @@ -51,8 +51,8 @@ extern "C" #define EXTERN extern #endif -FAR char *strdup(FAR const char *s); -FAR char *strndup(FAR const char *s, size_t size); +FAR char *strdup(FAR const char *s) malloc_like; +FAR char *strndup(FAR const char *s, size_t size) malloc_like; FAR char *strerror(int); int strerror_r(int, FAR char *, size_t); size_t strlen(FAR const char *);