| Index: include/core/SkTypes.h | 
| diff --git a/include/core/SkTypes.h b/include/core/SkTypes.h | 
| index 5720c30970e5d2ce1ad9f69922caa6a32eeb1163..6c2e6361530ac9674da7f69f7b2dd978bb80ce32 100644 | 
| --- a/include/core/SkTypes.h | 
| +++ b/include/core/SkTypes.h | 
| @@ -24,6 +24,28 @@ | 
|  | 
| #include <string.h> | 
|  | 
| +/** | 
| + *  sk_careful_memcpy() is just like memcpy(), but guards against undefined behavior. | 
| + * | 
| + * It is undefined behavior to call memcpy() with null dst or src, even if len is 0. | 
| + * If an optimizer is "smart" enough, it can exploit this to do unexpected things. | 
| + *     memcpy(dst, src, 0); | 
| + *     if (src) { | 
| + *         printf("%x\n", *src); | 
| + *     } | 
| + * In this code the compiler can assume src is not null and omit the if (src) {...} check, | 
| + * unconditionally running the printf, crashing the program if src really is null. | 
| + * Of the compilers we pay attention to only GCC performs this optimization in practice. | 
| + */ | 
| +static inline void* sk_careful_memcpy(void* dst, const void* src, size_t len) { | 
| +    // When we pass >0 len we had better already be passing valid pointers. | 
| +    // So we just need to skip calling memcpy when len == 0. | 
| +    if (len) { | 
| +        memcpy(dst,src,len); | 
| +    } | 
| +    return dst; | 
| +} | 
| + | 
| /** \file SkTypes.h | 
| */ | 
|  | 
|  |