From a7a8e07a44f12673fad8c4250ad37309256966c3 Mon Sep 17 00:00:00 2001 From: Johann Date: Wed, 27 Jul 2016 14:19:20 -0700 Subject: [PATCH] Pad 'Left' when building under ASan The neon intrinsics are not able to load just the 4 values that are used. In vpx_dsp/arm/intrapred_neon.c:dc_4x4 it loads 8 values for both the 'above' and 'left' computations, but only uses the sum of the first 4 values. BUG=webm:1268 Change-Id: I937113d7e3a21e25bebde3593de0446bf6b0115a --- vp8/common/reconintra4x4.c | 15 ++++++++++++++- vpx_ports/mem.h | 10 ++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/vp8/common/reconintra4x4.c b/vp8/common/reconintra4x4.c index ef1afa8cb..07c922333 100644 --- a/vp8/common/reconintra4x4.c +++ b/vp8/common/reconintra4x4.c @@ -15,6 +15,8 @@ #include "vp8_rtcd.h" #include "blockd.h" #include "reconintra4x4.h" +#include "vp8/common/common.h" +#include "vpx_ports/mem.h" typedef void (*intra_pred_fn)(uint8_t *dst, ptrdiff_t stride, const uint8_t *above, const uint8_t *left); @@ -38,8 +40,19 @@ void vp8_intra4x4_predict(unsigned char *above, unsigned char *yleft, int left_stride, B_PREDICTION_MODE b_mode, unsigned char *dst, int dst_stride, unsigned char top_left) { - unsigned char Left[4]; unsigned char Aboveb[12], *Above = Aboveb + 4; +#if HAVE_NEON + // Neon intrinsics are unable to load 32 bits, or 4 8 bit values. Instead, it + // over reads but does not use the extra 4 values. + unsigned char Left[8]; +#if VPX_WITH_ASAN + // Silence an 'uninitialized read' warning. Although uninitialized values are + // indeed read, they are not used. + vp8_zero_array(Left, 8); +#endif // VPX_WITH_ASAN +#else + unsigned char Left[4]; +#endif // HAVE_NEON Left[0] = yleft[0]; Left[1] = yleft[left_stride]; diff --git a/vpx_ports/mem.h b/vpx_ports/mem.h index 7e77c6ca9..39211d759 100644 --- a/vpx_ports/mem.h +++ b/vpx_ports/mem.h @@ -48,4 +48,14 @@ #define CONVERT_TO_BYTEPTR(x) ((uint8_t *)(((uintptr_t)(x)) >> 1)) #endif // CONFIG_VP9_HIGHBITDEPTH +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif // !defined(__has_feature) + +#if __has_feature(address_sanitizer) || __SANITIZE_ADDRESS__ +#define VPX_WITH_ASAN 1 +#else +#define VPX_WITH_ASAN 0 +#endif // __has_feature(address_sanitizer) || __SANITIZE_ADDRESS + #endif // VPX_PORTS_MEM_H_