Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(630)

Side by Side Diff: webrtc/common_audio/signal_processing/signal_processing_unittest.cc

Issue 2002523002: Fix an UBSan error (signed overflow) in saturating addition and subtraction (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: review suggestions Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/common_audio/signal_processing/include/spl_inl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <algorithm>
12 #include <sstream>
13
11 #include "testing/gtest/include/gtest/gtest.h" 14 #include "testing/gtest/include/gtest/gtest.h"
12 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h" 15 #include "webrtc/common_audio/signal_processing/include/signal_processing_librar y.h"
13 16
14 static const size_t kVector16Size = 9; 17 static const size_t kVector16Size = 9;
15 static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963, 18 static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963,
16 WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345}; 19 WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345};
17 20
18 class SplTest : public testing::Test { 21 class SplTest : public testing::Test {
19 protected: 22 protected:
20 SplTest() { 23 SplTest() {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 EXPECT_EQ(14 - ii, WebRtcSpl_NormW16(value)); 114 EXPECT_EQ(14 - ii, WebRtcSpl_NormW16(value));
112 EXPECT_EQ(15 - ii, WebRtcSpl_NormW16(-value)); 115 EXPECT_EQ(15 - ii, WebRtcSpl_NormW16(-value));
113 } 116 }
114 117
115 EXPECT_EQ(0, WebRtcSpl_NormU32(0u)); 118 EXPECT_EQ(0, WebRtcSpl_NormU32(0u));
116 EXPECT_EQ(0, WebRtcSpl_NormU32(0xffffffff)); 119 EXPECT_EQ(0, WebRtcSpl_NormU32(0xffffffff));
117 EXPECT_EQ(15, WebRtcSpl_NormU32(static_cast<uint32_t>(a32))); 120 EXPECT_EQ(15, WebRtcSpl_NormU32(static_cast<uint32_t>(a32)));
118 121
119 EXPECT_EQ(104, WebRtcSpl_AddSatW16(a16, b16)); 122 EXPECT_EQ(104, WebRtcSpl_AddSatW16(a16, b16));
120 EXPECT_EQ(138, WebRtcSpl_SubSatW16(a16, b16)); 123 EXPECT_EQ(138, WebRtcSpl_SubSatW16(a16, b16));
124 }
121 125
122 EXPECT_EQ(109410, WebRtcSpl_AddSatW32(a32, b32)); 126 TEST_F(SplTest, AddSubSatW32) {
123 EXPECT_EQ(112832, WebRtcSpl_SubSatW32(a32, b32)); 127 static constexpr int32_t kAddSubArgs[] = {
124 128 INT32_MIN, INT32_MIN + 1, -3, -2, -1, 0, 1, -1, 2,
125 a32 = 0x80000000; 129 3, INT32_MAX - 1, INT32_MAX};
126 b32 = 0x80000000; 130 for (int32_t a : kAddSubArgs) {
127 // Cast to signed int to avoid compiler complaint on gtest.h. 131 for (int32_t b : kAddSubArgs) {
128 EXPECT_EQ(static_cast<int>(0x80000000), WebRtcSpl_AddSatW32(a32, b32)); 132 const int64_t sum = std::max<int64_t>(
129 a32 = 0x7fffffff; 133 INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) + b));
130 b32 = 0x7fffffff; 134 const int64_t diff = std::max<int64_t>(
131 EXPECT_EQ(0x7fffffff, WebRtcSpl_AddSatW32(a32, b32)); 135 INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) - b));
132 a32 = 0; 136 std::ostringstream ss;
133 b32 = 0x80000000; 137 ss << a << " +/- " << b << ": sum " << sum << ", diff " << diff;
134 EXPECT_EQ(0x7fffffff, WebRtcSpl_SubSatW32(a32, b32)); 138 SCOPED_TRACE(ss.str());
135 a32 = 0x7fffffff; 139 EXPECT_EQ(sum, WebRtcSpl_AddSatW32(a, b));
136 b32 = 0x80000000; 140 EXPECT_EQ(diff, WebRtcSpl_SubSatW32(a, b));
137 EXPECT_EQ(0x7fffffff, WebRtcSpl_SubSatW32(a32, b32)); 141 }
138 a32 = 0x80000000; 142 }
139 b32 = 0x7fffffff;
140 EXPECT_EQ(static_cast<int>(0x80000000), WebRtcSpl_SubSatW32(a32, b32));
141 } 143 }
142 144
143 TEST_F(SplTest, MathOperationsTest) { 145 TEST_F(SplTest, MathOperationsTest) {
144 int A = 1134567892; 146 int A = 1134567892;
145 int32_t num = 117; 147 int32_t num = 117;
146 int32_t den = -5; 148 int32_t den = -5;
147 uint16_t denU = 5; 149 uint16_t denU = 5;
148 EXPECT_EQ(33700, WebRtcSpl_Sqrt(A)); 150 EXPECT_EQ(33700, WebRtcSpl_Sqrt(A));
149 EXPECT_EQ(33683, WebRtcSpl_SqrtFloor(A)); 151 EXPECT_EQ(33683, WebRtcSpl_SqrtFloor(A));
150 152
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 // 12-15 are skipped to account for the filter lag. 572 // 12-15 are skipped to account for the filter lag.
571 for (size_t i = 0; i < 12; ++i) { 573 for (size_t i = 0; i < 12; ++i) {
572 EXPECT_EQ(kRefValue32kHz1, out_vector[i]); 574 EXPECT_EQ(kRefValue32kHz1, out_vector[i]);
573 EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]); 575 EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]);
574 } 576 }
575 for (size_t i = 16; i < 2 * kBlockSize; ++i) { 577 for (size_t i = 16; i < 2 * kBlockSize; ++i) {
576 EXPECT_EQ(kRefValue32kHz2, out_vector[i]); 578 EXPECT_EQ(kRefValue32kHz2, out_vector[i]);
577 EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]); 579 EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]);
578 } 580 }
579 } 581 }
OLDNEW
« no previous file with comments | « webrtc/common_audio/signal_processing/include/spl_inl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698