From 38009bfba4a36371f4e08fb89f6dd95bf8965926 Mon Sep 17 00:00:00 2001 From: Laurent Morichetti Date: Thu, 15 Apr 2021 18:23:01 -0700 Subject: [PATCH] Fix a compilation error with gcc-9.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Ubuntu 20.04, in Release mode, gcc fails with this error: In file included from /usr/include/string.h:495, from /opt/rocm/include/hsa/hsa_api_trace.h:57, from ../roctracer/src/util/hsa_rsrc_factory.h:29, from ../roctracer/src/util/hsa_rsrc_factory.cpp:25: In function ‘char* strncpy(char*, const char*, size_t)’, inlined from ‘const util::AgentInfo* util::HsaRsrcFactory::AddAgentInfo(hsa_agent_t)’ at ../roctracer/src/util/hsa_rsrc_factory.cpp:323:12: /usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:34: error: ‘char* __builtin___strncpy_chk(char*, const char*, long unsigned int, long unsigned int)’ specified bound depends on the length of the source argument [-Werror=stringop-overflow=] 106 | return __builtin___strncpy_chk (__dest, __src, __len, __bos (__dest)); | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../roctracer/src/util/hsa_rsrc_factory.cpp: In member function ‘const util::AgentInfo* util::HsaRsrcFactory::AddAgentInfo(hsa_agent_t)’: ../roctracer/src/util/hsa_rsrc_factory.cpp:322:39: note: length computed here 322 | const int gfxip_label_len = strlen(agent_info->name) - 2; | ~~~~~~^~~~~~~~~~~~~~~~~~ The error is caused by the following 2 lines: const int gfxip_label_len = strlen(agent_info->name) - 2; strncpy(agent_info->gfxip, agent_info->name, gfxip_label_len); The size argument to strncpy should not depend on the input string. Since the terminating character is not considered (the copy is at most len - 2 bytes), using memcpy is preferable. Also, make sure the destination does not overflow by clamping the size. Change-Id: I37c5c45418e7c31a017581b6c16e5d47cd61aec5 --- src/util/hsa_rsrc_factory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/hsa_rsrc_factory.cpp b/src/util/hsa_rsrc_factory.cpp index cf5ccbbaf8..517ee161f7 100644 --- a/src/util/hsa_rsrc_factory.cpp +++ b/src/util/hsa_rsrc_factory.cpp @@ -319,8 +319,8 @@ const AgentInfo* HsaRsrcFactory::AddAgentInfo(const hsa_agent_t agent) { agent_info->dev_id = agent; agent_info->dev_type = HSA_DEVICE_TYPE_GPU; hsa_api_.hsa_agent_get_info(agent, HSA_AGENT_INFO_NAME, agent_info->name); - const int gfxip_label_len = strlen(agent_info->name) - 2; - strncpy(agent_info->gfxip, agent_info->name, gfxip_label_len); + const int gfxip_label_len = std::min (strlen(agent_info->name) - 2, sizeof (agent_info->gfxip) - 1); + memcpy(agent_info->gfxip, agent_info->name, gfxip_label_len); agent_info->gfxip[gfxip_label_len] = '\0'; hsa_api_.hsa_agent_get_info(agent, HSA_AGENT_INFO_WAVEFRONT_SIZE, &agent_info->max_wave_size); hsa_api_.hsa_agent_get_info(agent, HSA_AGENT_INFO_QUEUE_MAX_SIZE, &agent_info->max_queue_size);