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" | ||||
| 
 | ||||
| /* Copied from kernel.h */ | ||||
| #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) | ||||
| /* Copied from kernel.h and compiler-gcc.h */ | ||||
| 
 | ||||
| /* 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)) | ||||
| 
 | ||||
|  |  | |||
|  | @ -22,6 +22,9 @@ | |||
|     __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\ | ||||
|     (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)) | ||||
|  |  | |||
|  | @ -21,6 +21,9 @@ | |||
|      __ptr = (unsigned long) (ptr);				\ | ||||
|     (typeof(ptr)) (__ptr + (off)); }) | ||||
| 
 | ||||
| /* Intel ECC compiler doesn't support __builtin_types_compatible_p() */ | ||||
| #define __must_be_array(a) 0 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #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_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 DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) | ||||
| #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Rusty Russell
						Rusty Russell