From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6C8A2A0350 for ; Tue, 23 Jun 2020 15:45:48 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4BD9F1D675; Tue, 23 Jun 2020 15:45:48 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 0B1A11D65E; Tue, 23 Jun 2020 15:45:44 +0200 (CEST) IronPort-SDR: KE9XZRO/jpmj3sj9sNP1rpFtYqB31QssVmwT5lXIn12TIoceFwaW5DgU6Tm89tjpsI+vKai43Z Y45wjTJhWlCg== X-IronPort-AV: E=McAfee;i="6000,8403,9660"; a="162151577" X-IronPort-AV: E=Sophos;i="5.75,271,1589266800"; d="scan'208";a="162151577" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Jun 2020 06:45:35 -0700 IronPort-SDR: z2LffeCHCBH9/9x4VBTqnuo6/pqhj49u3drVFSdlZMSP8JevXgXvrvrSI6L1EWq6y5JCwSpCrc BfzPtnbdEbGg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,271,1589266800"; d="scan'208";a="263339521" Received: from silpixa00399752.ir.intel.com (HELO silpixa00399752.ger.corp.intel.com) ([10.237.222.180]) by fmsmga007.fm.intel.com with ESMTP; 23 Jun 2020 06:45:34 -0700 From: Ferruh Yigit To: Jingjing Wu , Beilei Xing Cc: dev@dpdk.org, Ferruh Yigit , stable@dpdk.org Date: Tue, 23 Jun 2020 14:45:31 +0100 Message-Id: <20200623134532.1271737-1-ferruh.yigit@intel.com> X-Mailer: git-send-email 2.25.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [dpdk-stable] [PATCH] net/iavf: fix uninitialized variable X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org Sender: "stable" This is observed with experimental gcc 11, although the older gcc versions don't complain about it, issue seems a valid one. gcc version 11.0.0 20200621 (experimental) (GCC) Build error .../drivers/net/iavf/iavf_ethdev.c: In function ‘iavf_dev_link_update’: .../drivers/net/iavf/iavf_ethdev.c:641:6: error: ‘new_link’ is used uninitialized [-Werror=uninitialized] 641 | if (rte_atomic64_cmpset((uint64_t *)&dev->data->dev_link, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 642 | *(uint64_t *)&dev->data->dev_link, | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | *(uint64_t *)&new_link) == 0) | ~~~~~~~~~~~~~~~~~~~~~~~ .../drivers/net/iavf/iavf_ethdev.c:596:22: note: ‘new_link’ declared here 596 | struct rte_eth_link new_link; | ^~~~~~~~ cc1: all warnings being treated as error All fields of the 'new_link' struct is already set in function, so the 'uninitialized' warning is hard to get. This is because the combination of aligning and bitfield usage of the struct The definition of the struct is: struct rte_eth_link { uint32_t link_speed; /**< ETH_SPEED_NUM_ */ uint16_t link_duplex : 1; /**< ETH_LINK_[HALF/FULL]_DUPLEX */ uint16_t link_autoneg : 1; /**< ETH_LINK_[AUTONEG/FIXED] */ uint16_t link_status : 1; /**< ETH_LINK_[DOWN/UP] */ } __rte_aligned(8); /**< aligned for atomic64 read/write */ Overall the size of the 'struct rte_eth_link' is 64 bits, but function only sets the 35 bits of it, because only 3 bits of 16 bits variable are used. When the struct cast to 'uint64_t' because of the 'rte_atomic64_cmpset' the upper 29 bits are used without initialization. To fix the uninitialized usage, memset the variable 'new_link' before using it. Cc: stable@dpdk.org Signed-off-by: Ferruh Yigit --- Reference: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95818 --- drivers/net/iavf/iavf_ethdev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 2b1066b0a..45c853f19 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -596,6 +596,8 @@ iavf_dev_link_update(struct rte_eth_dev *dev, struct rte_eth_link new_link; struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private); + memset(&new_link, 0, sizeof(new_link)); + /* Only read status info stored in VF, and the info is updated * when receive LINK_CHANGE evnet from PF by Virtchnnl. */ -- 2.25.4