From f4ea5cc1e928ad03fafaa46da5dd97a7c44eae24 Mon Sep 17 00:00:00 2001 From: Abdalla Al-Dalleh <37416278+AbdallaDalleh@users.noreply.github.com> Date: Wed, 10 Jun 2026 17:53:31 +0300 Subject: [PATCH] biRecord.c/boRecord.c: Fix gcc -Wsizeof-pointer-memaccess (#887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ../rec/biRecord.c:191:42: warning: argument to ‘sizeof’ in ‘strncpy’ call is the same expression as the source; did you mean to use the size of the destination? [-Wsizeof-pointer-memaccess] 191 | strncpy(pstring,prec->znam,sizeof(prec->znam)); | ^ Use memcpy instead of snprintf. STATIC_ASSERT is added to ensure znam and onam are sized enough. --- modules/database/src/std/rec/biRecord.c | 27 +++++++++++++---------- modules/database/src/std/rec/boRecord.c | 29 +++++++++++++++---------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/modules/database/src/std/rec/biRecord.c b/modules/database/src/std/rec/biRecord.c index 6a8c40442..932e84541 100644 --- a/modules/database/src/std/rec/biRecord.c +++ b/modules/database/src/std/rec/biRecord.c @@ -178,16 +178,16 @@ static long get_enum_str(const DBADDR *paddr, char *pstring) index = dbGetFieldIndex(paddr); - if(index!=biRecordVAL) { - strcpy(pstring,"Illegal_Value"); - } else if(*pfield==0) { - memcpy(pstring,prec->znam,sizeof(prec->znam)); + if(index != biRecordVAL) { + strcpy(pstring, "Illegal_Value"); + } else if(*pfield == 0) { + memcpy(pstring, prec->znam, sizeof(prec->znam)); pstring[sizeof(prec->znam)] = 0; - } else if(*pfield==1) { - memcpy(pstring,prec->onam,sizeof(prec->onam)); + } else if(*pfield == 1) { + memcpy(pstring, prec->onam, sizeof(prec->onam)); pstring[sizeof(prec->onam)] = 0; } else { - strcpy(pstring,"Illegal_Value"); + strcpy(pstring, "Illegal_Value"); } return(0); } @@ -198,10 +198,15 @@ static long get_enum_strs(const DBADDR *paddr,struct dbr_enumStrs *pes) pes->no_str = 2; memset(pes->strs,'\0',sizeof(pes->strs)); - memcpy(pes->strs[0],prec->znam,sizeof(prec->znam)); - if(*prec->znam!=0) pes->no_str=1; - memcpy(pes->strs[1],prec->onam,sizeof(prec->onam)); - if(*prec->onam!=0) pes->no_str=2; + + STATIC_ASSERT(sizeof(prec->znam) <= sizeof(pes->strs[0])); + memcpy(pes->strs[0], prec->znam, sizeof(prec->znam)); + if(*prec->znam != 0) pes->no_str = 1; + + STATIC_ASSERT(sizeof(prec->onam) <= sizeof(pes->strs[1])); + memcpy(pes->strs[1], prec->onam, sizeof(prec->onam)); + if(*prec->onam != 0) pes->no_str = 2; + return(0); } diff --git a/modules/database/src/std/rec/boRecord.c b/modules/database/src/std/rec/boRecord.c index 0bb506b76..0b9c7057c 100644 --- a/modules/database/src/std/rec/boRecord.c +++ b/modules/database/src/std/rec/boRecord.c @@ -325,31 +325,36 @@ static long get_enum_str(const DBADDR *paddr, char *pstring) index = dbGetFieldIndex(paddr); - if(index!=indexof(VAL)) { - strcpy(pstring,"Illegal_Value"); - } else if(*pfield==0) { - memcpy(pstring,prec->znam,sizeof(prec->znam)); + if(index != indexof(VAL)) { + strcpy(pstring, "Illegal_Value"); + } else if(*pfield == 0) { + memcpy(pstring, prec->znam, sizeof(prec->znam)); pstring[sizeof(prec->znam)] = 0; - } else if(*pfield==1) { - memcpy(pstring,prec->onam,sizeof(prec->onam)); + } else if(*pfield == 1) { + memcpy(pstring, prec->onam, sizeof(prec->onam)); pstring[sizeof(prec->onam)] = 0; } else { - strcpy(pstring,"Illegal_Value"); + strcpy(pstring, "Illegal_Value"); } return(0); } static long get_enum_strs(const DBADDR *paddr,struct dbr_enumStrs *pes) { - boRecord *prec=(boRecord *)paddr->precord; + boRecord *prec = (boRecord *)paddr->precord; /*SETTING no_str=0 breaks channel access clients*/ pes->no_str = 2; memset(pes->strs,'\0',sizeof(pes->strs)); - memcpy(pes->strs[0],prec->znam,sizeof(pes->strs[0])); - if(*prec->znam!=0) pes->no_str=1; - memcpy(pes->strs[1],prec->onam,sizeof(pes->strs[1])); - if(*prec->onam!=0) pes->no_str=2; + + STATIC_ASSERT(sizeof(prec->znam) <= sizeof(pes->strs[0])); + memcpy(pes->strs[0], prec->znam, sizeof(pes->strs[0])); + if(*prec->znam != 0) pes->no_str = 1; + + STATIC_ASSERT(sizeof(prec->onam) <= sizeof(pes->strs[1])); + memcpy(pes->strs[1], prec->onam, sizeof(pes->strs[1])); + if(*prec->onam != 0) pes->no_str = 2; + return(0); } static long put_enum_str(const DBADDR *paddr, const char *pstring)