dsp.h: add WEBP_UBSAN_IGNORE_UNDEF

only defined when WEBP_FORCE_ALIGNED isn't. use it to quiet alignment
warnings VP8LoadNewBytes().

Change-Id: I710a74bb9375285974e97022540551a3f4eda414
This commit is contained in:
James Zern 2016-05-09 22:55:21 -07:00
parent 4154a8395d
commit 369e264e2e
2 changed files with 15 additions and 1 deletions

View File

@ -101,6 +101,19 @@ extern "C" {
#endif #endif
#endif #endif
// This macro prevents the undefined behavior sanitizer from reporting
// failures. This is only meant to silence unaligned loads on platforms that
// are known to support them.
#define WEBP_UBSAN_IGNORE_UNDEF
#if !defined(WEBP_FORCE_ALIGNED) && defined(__clang__) && \
defined(__has_attribute)
#if __has_attribute(no_sanitize)
#undef WEBP_UBSAN_IGNORE_UNDEF
#define WEBP_UBSAN_IGNORE_UNDEF \
__attribute__((no_sanitize("undefined")))
#endif
#endif
typedef enum { typedef enum {
kSSE2, kSSE2,
kSSE3, kSSE3,

View File

@ -55,7 +55,8 @@ void VP8LoadFinalBytes(VP8BitReader* const br);
// Inlined critical functions // Inlined critical functions
// makes sure br->value_ has at least BITS bits worth of data // makes sure br->value_ has at least BITS bits worth of data
static WEBP_INLINE void VP8LoadNewBytes(VP8BitReader* const br) { static WEBP_UBSAN_IGNORE_UNDEF WEBP_INLINE
void VP8LoadNewBytes(VP8BitReader* const br) {
assert(br != NULL && br->buf_ != NULL); assert(br != NULL && br->buf_ != NULL);
// Read 'BITS' bits at a time if possible. // Read 'BITS' bits at a time if possible.
if (br->buf_ < br->buf_max_) { if (br->buf_ < br->buf_max_) {