From 5b9746ef10a3042abd766430197fd1bc0dade648 Mon Sep 17 00:00:00 2001 From: kwiberg Date: Wed, 16 Aug 2017 04:52:35 -0700 Subject: [PATCH] When using clang, switch on -Wc++11-narrowing See https://clang.llvm.org/docs/DiagnosticsReference.html#wc-11-narrowing for datails. This catches a narrowing bug that broke a downstream project in https://codereview.webrtc.org/2995523002/. BUG=none Review-Url: https://codereview.webrtc.org/2995073002 Cr-Commit-Position: refs/heads/master@{#19366} --- webrtc/BUILD.gn | 1 + .../source/rtcp_packet/sdes_unittest.cc | 34 +++++++++---------- .../video_coding/frame_buffer2_unittest.cc | 3 +- webrtc/rtc_base/task_queue_libevent.cc | 4 ++- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/webrtc/BUILD.gn b/webrtc/BUILD.gn index f403fbc50a..58b5f5e740 100644 --- a/webrtc/BUILD.gn +++ b/webrtc/BUILD.gn @@ -161,6 +161,7 @@ config("common_config") { if (is_clang) { cflags += [ + "-Wc++11-narrowing", "-Wimplicit-fallthrough", "-Wthread-safety", "-Winconsistent-missing-override", diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc index 13b28eafef..5c5601b3b8 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc @@ -95,8 +95,8 @@ TEST(RtcpPacketSdesTest, CreateAndParseCnameItemWithEmptyString) { } TEST(RtcpPacketSdesTest, ParseSkipsNonCNameField) { - const char kName[] = "abc"; - const std::string kCname = "de"; + const uint8_t kName[] = "abc"; + const uint8_t kCname[] = "de"; const uint8_t kValidPacket[] = {0x81, 202, 0x00, 0x04, 0x12, 0x34, 0x56, 0x78, kNameTag, 3, kName[0], kName[1], kName[2], @@ -111,13 +111,13 @@ TEST(RtcpPacketSdesTest, ParseSkipsNonCNameField) { EXPECT_EQ(1u, parsed.chunks().size()); EXPECT_EQ(kSenderSsrc, parsed.chunks()[0].ssrc); - EXPECT_EQ(kCname, parsed.chunks()[0].cname); + EXPECT_EQ("de", parsed.chunks()[0].cname); } TEST(RtcpPacketSdesTest, ParseSkipsChunksWithoutCName) { - const char kName[] = "ab"; - const char kEmail[] = "de"; - const std::string kCname = "def"; + const uint8_t kName[] = "ab"; + const uint8_t kEmail[] = "de"; + const uint8_t kCname[] = "def"; const uint8_t kPacket[] = {0x82, 202, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78, // 1st chunk. kNameTag, 3, kName[0], kName[1], kName[2], @@ -134,12 +134,12 @@ TEST(RtcpPacketSdesTest, ParseSkipsChunksWithoutCName) { EXPECT_TRUE(test::ParseSinglePacket(kPacket, &parsed)); ASSERT_EQ(1u, parsed.chunks().size()); EXPECT_EQ(0x23456789u, parsed.chunks()[0].ssrc); - EXPECT_EQ(kCname, parsed.chunks()[0].cname); + EXPECT_EQ("def", parsed.chunks()[0].cname); } TEST(RtcpPacketSdesTest, ParseFailsWithoutChunkItemTerminator) { - const char kName[] = "abc"; - const char kCname[] = "d"; + const uint8_t kName[] = "abc"; + const uint8_t kCname[] = "d"; // No place for next chunk item. const uint8_t kInvalidPacket[] = {0x81, 202, 0x00, 0x03, 0x12, 0x34, 0x56, 0x78, @@ -154,8 +154,8 @@ TEST(RtcpPacketSdesTest, ParseFailsWithoutChunkItemTerminator) { } TEST(RtcpPacketSdesTest, ParseFailsWithDamagedChunkItem) { - const char kName[] = "ab"; - const char kCname[] = "d"; + const uint8_t kName[] = "ab"; + const uint8_t kCname[] = "d"; // Next chunk item has non-terminator type, but not the size. const uint8_t kInvalidPacket[] = {0x81, 202, 0x00, 0x03, 0x12, 0x34, 0x56, 0x78, @@ -171,8 +171,8 @@ TEST(RtcpPacketSdesTest, ParseFailsWithDamagedChunkItem) { } TEST(RtcpPacketSdesTest, ParseFailsWithTooLongChunkItem) { - const char kName[] = "abc"; - const char kCname[] = "d"; + const uint8_t kName[] = "abc"; + const uint8_t kCname[] = "d"; // Last chunk item has length that goes beyond the buffer end. const uint8_t kInvalidPacket[] = {0x81, 202, 0x00, 0x03, 0x12, 0x34, 0x56, 0x78, @@ -187,8 +187,8 @@ TEST(RtcpPacketSdesTest, ParseFailsWithTooLongChunkItem) { } TEST(RtcpPacketSdesTest, ParseFailsWithTwoCNames) { - const char kCname1[] = "a"; - const char kCname2[] = "de"; + const uint8_t kCname1[] = "a"; + const uint8_t kCname2[] = "de"; const uint8_t kInvalidPacket[] = {0x81, 202, 0x00, 0x03, 0x12, 0x34, 0x56, 0x78, kCnameTag, 1, kCname1[0], @@ -203,8 +203,8 @@ TEST(RtcpPacketSdesTest, ParseFailsWithTwoCNames) { } TEST(RtcpPacketSdesTest, ParseFailsWithTooLittleSpaceForNextChunk) { - const char kCname[] = "a"; - const char kEmail[] = "de"; + const uint8_t kCname[] = "a"; + const uint8_t kEmail[] = "de"; // Two chunks are promised in the header, but no place for the second chunk. const uint8_t kInvalidPacket[] = {0x82, 202, 0x00, 0x04, 0x12, 0x34, 0x56, 0x78, // 1st chunk. diff --git a/webrtc/modules/video_coding/frame_buffer2_unittest.cc b/webrtc/modules/video_coding/frame_buffer2_unittest.cc index 95a879b36d..88f841048c 100644 --- a/webrtc/modules/video_coding/frame_buffer2_unittest.cc +++ b/webrtc/modules/video_coding/frame_buffer2_unittest.cc @@ -153,7 +153,8 @@ class TestFrameBuffer2 : public ::testing::Test { T... refs) { static_assert(sizeof...(refs) <= kMaxReferences, "To many references specified for FrameObject."); - std::array references = {{refs...}}; + std::array references = { + {rtc::checked_cast(refs)...}}; std::unique_ptr frame(new FrameObjectFake()); frame->picture_id = picture_id; diff --git a/webrtc/rtc_base/task_queue_libevent.cc b/webrtc/rtc_base/task_queue_libevent.cc index b1070da7b7..db267dc80b 100644 --- a/webrtc/rtc_base/task_queue_libevent.cc +++ b/webrtc/rtc_base/task_queue_libevent.cc @@ -18,6 +18,7 @@ #include "base/third_party/libevent/event.h" #include "webrtc/rtc_base/checks.h" #include "webrtc/rtc_base/logging.h" +#include "webrtc/rtc_base/safe_conversions.h" #include "webrtc/rtc_base/task_queue_posix.h" #include "webrtc/rtc_base/timeutils.h" @@ -317,7 +318,8 @@ void TaskQueue::PostDelayedTask(std::unique_ptr task, QueueContext* ctx = static_cast(pthread_getspecific(GetQueuePtrTls())); ctx->pending_timers_.push_back(timer); - timeval tv = {milliseconds / 1000, (milliseconds % 1000) * 1000}; + timeval tv = {rtc::dchecked_cast(milliseconds / 1000), + rtc::dchecked_cast(milliseconds % 1000) * 1000}; event_add(&timer->ev, &tv); } else { PostTask(std::unique_ptr(