forked from mirrors/linux
		
	ARRAY_SIZE: check for type
We can use a gcc extension to ensure that ARRAY_SIZE() is handed an array, not a pointer. This is especially important when code is changed from a fixed array to a pointer. I assume the Intel compiler doesn't support __builtin_types_compatible_p. [jdike@addtoit.com: uml: update UML definition of ARRAY_SIZE] Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Jeff Dike <jdike@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									f34d9d2dcb
								
							
						
					
					
						commit
						c5e631cf65
					
				
					 4 changed files with 21 additions and 3 deletions
				
			
		|  | @ -8,8 +8,19 @@ | ||||||
| 
 | 
 | ||||||
| #include "sysdep/ptrace.h" | #include "sysdep/ptrace.h" | ||||||
| 
 | 
 | ||||||
| /* Copied from kernel.h */ | /* Copied from kernel.h and compiler-gcc.h */ | ||||||
| #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | 
 | ||||||
|  | /* Force a compilation error if condition is true, but also produce a
 | ||||||
|  |    result (of value 0 and type size_t), so the expression can be used | ||||||
|  |    e.g. in a structure initializer (or where-ever else comma expressions | ||||||
|  |    aren't permitted). */ | ||||||
|  | #define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1) | ||||||
|  | 
 | ||||||
|  | /* &a[0] degrades to a pointer: a different type from an array */ | ||||||
|  | #define __must_be_array(a) \ | ||||||
|  |   BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0]))) | ||||||
|  | 
 | ||||||
|  | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) | ||||||
| 
 | 
 | ||||||
| #define CATCH_EINTR(expr) while ((errno = 0, ((expr) < 0)) && (errno == EINTR)) | #define CATCH_EINTR(expr) while ((errno = 0, ((expr) < 0)) && (errno == EINTR)) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,6 +22,9 @@ | ||||||
|     __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\ |     __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\ | ||||||
|     (typeof(ptr)) (__ptr + (off)); }) |     (typeof(ptr)) (__ptr + (off)); }) | ||||||
| 
 | 
 | ||||||
|  | /* &a[0] degrades to a pointer: a different type from an array */ | ||||||
|  | #define __must_be_array(a) \ | ||||||
|  |   BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0]))) | ||||||
| 
 | 
 | ||||||
| #define inline		inline		__attribute__((always_inline)) | #define inline		inline		__attribute__((always_inline)) | ||||||
| #define __inline__	__inline__	__attribute__((always_inline)) | #define __inline__	__inline__	__attribute__((always_inline)) | ||||||
|  |  | ||||||
|  | @ -21,6 +21,9 @@ | ||||||
|      __ptr = (unsigned long) (ptr);				\ |      __ptr = (unsigned long) (ptr);				\ | ||||||
|     (typeof(ptr)) (__ptr + (off)); }) |     (typeof(ptr)) (__ptr + (off)); }) | ||||||
| 
 | 
 | ||||||
|  | /* Intel ECC compiler doesn't support __builtin_types_compatible_p() */ | ||||||
|  | #define __must_be_array(a) 0 | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define uninitialized_var(x) x | #define uninitialized_var(x) x | ||||||
|  |  | ||||||
|  | @ -35,7 +35,8 @@ extern const char linux_proc_banner[]; | ||||||
| #define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1) | #define ALIGN(x,a)		__ALIGN_MASK(x,(typeof(x))(a)-1) | ||||||
| #define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask)) | #define __ALIGN_MASK(x,mask)	(((x)+(mask))&~(mask)) | ||||||
| 
 | 
 | ||||||
| #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) | ||||||
|  | 
 | ||||||
| #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | #define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f)) | ||||||
| #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | ||||||
| #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Rusty Russell
						Rusty Russell