// RUN: %clang_analyze_cc1 -triple x86_64-apple-darwin10 -analyzer-checker=core,alpha.security.ArrayBoundV2 -Wno-implicit-function-declaration -verify %s // RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -analyzer-checker=core,alpha.security.ArrayBoundV2 -Wno-implicit-function-declaration -DM32 -verify %s // expected-no-diagnostics #define UINT_MAX (~0u) #ifdef M32 #define X86_ARRAY_SIZE (UINT_MAX/2 + 4) void testIndexTooBig() { char arr[X86_ARRAY_SIZE]; char *ptr = arr + UINT_MAX/2; ptr += 2; // index shouldn't overflow *ptr = 42; // no-warning } #else // 64-bit tests #define ARRAY_SIZE 0x100000000 void testIndexOverflow64() { char arr[ARRAY_SIZE]; char *ptr = arr + UINT_MAX/2; ptr += 2; // don't overflow 64-bit index *ptr = 42; // no-warning } #define ULONG_MAX (~0ul) #define BIG_INDEX (ULONG_MAX/16) void testIndexTooBig64() { char arr[ULONG_MAX/8-1]; char *ptr = arr + BIG_INDEX; ptr += 2; // don't overflow 64-bit index *ptr = 42; // no-warning } #define SIZE 4294967296 static unsigned size; static void * addr; static unsigned buf[SIZE]; void testOutOfBounds() { // Not out of bounds. buf[SIZE-1] = 1; // no-warning } void testOutOfBoundsCopy1() { memcpy(buf, addr, size); // no-warning } void testOutOfBoundsCopy2() { memcpy(addr, buf, size); // no-warning } #endif