| // Copyright 2016 The Fuchsia Authors |
| // Copyright 2001, Travis Geiselbrecht |
| // Copyright 2005, Michael Noisternig |
| // Copyright (c) 2008 Travis Geiselbrecht |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #include <stdint.h> |
| #include <string.h> |
| |
| __attribute__((no_sanitize_address)) void *__unsanitized_memset(void *s, int c, size_t count) { |
| char *xs = (char *)s; |
| size_t len = (-(size_t)s) & (sizeof(size_t) - 1); |
| size_t cc = c & 0xff; |
| |
| if (count > len) { |
| count -= len; |
| cc |= cc << 8; |
| cc |= cc << 16; |
| if (sizeof(size_t) == 8) |
| cc |= (uint64_t)cc << 32; // should be optimized out on 32 bit machines |
| |
| // write to non-aligned memory byte-wise |
| for (; len > 0; len--) |
| *xs++ = c; |
| |
| // write to aligned memory dword-wise |
| for (len = count / sizeof(size_t); len > 0; len--) { |
| *((size_t *)xs) = (size_t)cc; |
| xs += sizeof(size_t); |
| } |
| |
| count &= sizeof(size_t) - 1; |
| } |
| |
| // write remaining bytes |
| for (; count > 0; count--) |
| *xs++ = c; |
| |
| return s; |
| } |
| |
| // Make the function a weak symbol so asan can override it. |
| __typeof(__unsanitized_memset) memset __attribute__((weak, alias("__unsanitized_memset"))); |