From ac4d5c95ac37931cf80f6764544cbf98b0b73928 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 9 Feb 2018 10:56:52 -0600 Subject: [PATCH 1/5] Clean up some compiler warnings from clang --- src/db/dbBkpt.c | 2 +- src/db/dbLock.c | 6 +++--- src/misc/epicsRelease.c | 2 -- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/db/dbBkpt.c b/src/db/dbBkpt.c index 790cfae77..df4ee7de2 100644 --- a/src/db/dbBkpt.c +++ b/src/db/dbBkpt.c @@ -409,7 +409,7 @@ long epicsShareAPI dbd(const char *record_name) precord = addr.precord; - if (! precord->bkpt & BKPT_ON_MASK) { + if (!(precord->bkpt & BKPT_ON_MASK)) { printf(" BKPT> No breakpoint set in this record\n"); return(S_db_bkptNotSet); } diff --git a/src/db/dbLock.c b/src/db/dbLock.c index e1cea1581..2afa93c1f 100644 --- a/src/db/dbLock.c +++ b/src/db/dbLock.c @@ -525,10 +525,10 @@ long epicsShareAPI dblsr(char *recordname,int level) printf(" Not Locked\n"); } else { printf(" thread %p",plockSet->thread_id); - if(! plockSet->precord || !plockSet->precord->name) - printf(" NULL record or record name\n"); + if(! plockSet->precord) + printf(" NULL record\n"); else - printf(" record %s\n",plockSet->precord->name); + printf(" record %s\n",plockSet->precord->name); } if(level==0) { if(recordname) break; continue; } for(plockRecord = (lockRecord *)ellFirst(&plockSet->lockRecordList); diff --git a/src/misc/epicsRelease.c b/src/misc/epicsRelease.c index 6e2343e23..d32f8c322 100644 --- a/src/misc/epicsRelease.c +++ b/src/misc/epicsRelease.c @@ -16,8 +16,6 @@ #define epicsExportSharedSymbols #include "epicsRelease.h" -static const char id[] = "@(#) " EPICS_VERSION_STRING ", Misc. Utilities Library" __DATE__; - epicsShareFunc int epicsShareAPI coreRelease(void) { printf ( "############################################################################\n" ); From 550beeab9f9c4864f244a367092d4a11c044d0a7 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 9 Feb 2018 11:29:16 -0600 Subject: [PATCH 2/5] More clang warning clean-ups The short => int change is a UB issue, the second argument to va_start() must be of a type that does not undergo promotion. See https://wiki.sei.cmu.edu/confluence/display/cplusplus/EXP58-CPP.+Pass+an+object+of+the+correct+type+to+va_start --- src/ioc/db/dbUnitTest.c | 6 +++--- src/ioc/db/dbUnitTest.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ioc/db/dbUnitTest.c b/src/ioc/db/dbUnitTest.c index 9e3f7d6d0..249fb6032 100644 --- a/src/ioc/db/dbUnitTest.c +++ b/src/ioc/db/dbUnitTest.c @@ -111,7 +111,7 @@ long testdbVPutField(const char* pv, short dbrType, va_list ap) return dbPutField(&addr, dbrType, pod.bytes, 1); } -void testdbPutFieldOk(const char* pv, short dbrType, ...) +void testdbPutFieldOk(const char* pv, int dbrType, ...) { long ret; va_list ap; @@ -123,7 +123,7 @@ void testdbPutFieldOk(const char* pv, short dbrType, ...) testOk(ret==0, "dbPutField(%s, %d, ...) == %ld", pv, dbrType, ret); } -void testdbPutFieldFail(long status, const char* pv, short dbrType, ...) +void testdbPutFieldFail(long status, const char* pv, int dbrType, ...) { long ret; va_list ap; @@ -138,7 +138,7 @@ void testdbPutFieldFail(long status, const char* pv, short dbrType, ...) testFail("dbPutField(\"%s\", %d, ...) != %ld (%ld)", pv, dbrType, status, ret); } -void testdbGetFieldEqual(const char* pv, short dbrType, ...) +void testdbGetFieldEqual(const char* pv, int dbrType, ...) { va_list ap; diff --git a/src/ioc/db/dbUnitTest.h b/src/ioc/db/dbUnitTest.h index 0c78500d5..e1d04e1df 100644 --- a/src/ioc/db/dbUnitTest.h +++ b/src/ioc/db/dbUnitTest.h @@ -46,13 +46,13 @@ epicsShareFunc void testdbCleanup(void); * testdbPutFieldOk("pvname", DBF_FLOAT, (double)4.1); * testdbPutFieldOk("pvname", DBF_STRING, "hello world"); */ -epicsShareFunc void testdbPutFieldOk(const char* pv, short dbrType, ...); +epicsShareFunc void testdbPutFieldOk(const char* pv, int dbrType, ...); /* Tests for put failure */ -epicsShareFunc void testdbPutFieldFail(long status, const char* pv, short dbrType, ...); +epicsShareFunc void testdbPutFieldFail(long status, const char* pv, int dbrType, ...); epicsShareFunc long testdbVPutField(const char* pv, short dbrType, va_list ap); -epicsShareFunc void testdbGetFieldEqual(const char* pv, short dbrType, ...); +epicsShareFunc void testdbGetFieldEqual(const char* pv, int dbrType, ...); epicsShareFunc void testdbVGetFieldEqual(const char* pv, short dbrType, va_list ap); /** From ae548d3400da22d0782b24be224edfa256a905bb Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 24 Feb 2018 17:40:45 -0600 Subject: [PATCH 3/5] Remove cantProceed() from dbGetLink() and dbPutLink() Fixes LP: #1528314 Affects 3.15 branch only. --- src/ioc/db/dbLink.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ioc/db/dbLink.c b/src/ioc/db/dbLink.c index 423a51ec5..e93daa312 100644 --- a/src/ioc/db/dbLink.c +++ b/src/ioc/db/dbLink.c @@ -651,7 +651,7 @@ long dbGetLink(struct link *plink, short dbrType, void *pbuffer, inherit_severity(&plink->value.pv_link, precord, stat, sevr); break; default: - cantProceed("dbGetLinkValue: Illegal link type %d\n", plink->type); + printf("dbGetLinkValue: Illegal link type %d\n", plink->type); status = -1; } if (status) { @@ -755,7 +755,7 @@ long dbPutLink(struct link *plink, short dbrType, const void *pbuffer, status = dbCaPutLink(plink, dbrType, pbuffer, nRequest); break; default: - cantProceed("dbPutLinkValue: Illegal link type %d\n", plink->type); + printf("dbPutLinkValue: Illegal link type %d\n", plink->type); status = -1; } if (status) { @@ -836,4 +836,3 @@ long dbPutLinkLS(struct link *plink, char *pbuffer, epicsUInt32 len) return dbPutLink(plink, DBR_STRING, pbuffer, 1); } - From e41f8bf518fa4d1730ce6620b495e9328defbabf Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 24 Feb 2018 19:11:54 -0600 Subject: [PATCH 4/5] Translate and escape chars in info tag strings Fixes LP: #1716998 --- src/ioc/dbStatic/dbLexRoutines.c | 1 + src/ioc/dbStatic/dbStaticLib.c | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ioc/dbStatic/dbLexRoutines.c b/src/ioc/dbStatic/dbLexRoutines.c index 6654fdfbb..f36ace933 100644 --- a/src/ioc/dbStatic/dbLexRoutines.c +++ b/src/ioc/dbStatic/dbLexRoutines.c @@ -1069,6 +1069,7 @@ static void dbRecordInfo(char *name, char *value) if(duplicate) return; ptempListNode = (tempListNode *)ellFirst(&tempList); pdbentry = ptempListNode->item; + dbTranslateEscape(value, value); /* yuck: in-place, but safe */ status = dbPutInfo(pdbentry,name,value); if(status) { epicsPrintf("Can't set \"%s\" info \"%s\" to \"%s\"\n", diff --git a/src/ioc/dbStatic/dbStaticLib.c b/src/ioc/dbStatic/dbStaticLib.c index dc2fbe62f..96868eded 100644 --- a/src/ioc/dbStatic/dbStaticLib.c +++ b/src/ioc/dbStatic/dbStaticLib.c @@ -851,10 +851,14 @@ long dbWriteRecordFP( status=dbNextField(pdbentry,dctonly); } status = dbFirstInfo(pdbentry); - while(!status) { - fprintf(fp,"\tinfo(\"%s\",\"%s\")\n", - dbGetInfoName(pdbentry), dbGetInfoString(pdbentry)); - status=dbNextInfo(pdbentry); + while (!status) { + const char *pinfostr = dbGetInfoString(pdbentry); + + fprintf(fp, "\tinfo(\"%s\",\"", + dbGetInfoName(pdbentry)); + epicsStrPrintEscaped(fp, pinfostr, strlen(pinfostr)); + fprintf(fp, "\")\n"); + status = dbNextInfo(pdbentry); } fprintf(fp,"}\n"); status = dbNextRecord(pdbentry); From c18b6f2ccf381b89d21497f99fad5b913e522e72 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 24 Feb 2018 20:15:08 -0600 Subject: [PATCH 5/5] Deny use of dbgf, dbpf, dbtr, dbtgf and dbtpf before iocInit Can't use locking dbAccess routines until lock-sets have been calculated. Fixes LP: #1725248 --- src/ioc/db/dbTest.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/ioc/db/dbTest.c b/src/ioc/db/dbTest.c index 97279de08..637f8277d 100644 --- a/src/ioc/db/dbTest.c +++ b/src/ioc/db/dbTest.c @@ -308,6 +308,11 @@ long dbgf(const char *pname) if (nameToAddr(pname, &addr)) return -1; + if (addr.precord->lset == NULL) { + printf("dbgf only works after iocInit\n"); + return -1; + } + no_elements = MIN(addr.no_elements, sizeof(buffer)/addr.field_size); if (addr.dbr_field_type == DBR_ENUM) { long status = dbGetField(&addr, DBR_STRING, pbuffer, @@ -344,6 +349,11 @@ long dbpf(const char *pname,const char *pvalue) if (nameToAddr(pname, &addr)) return -1; + if (addr.precord->lset == NULL) { + printf("dbpf only works after iocInit\n"); + return -1; + } + if (addr.no_elements > 1 && (addr.dbr_field_type == DBR_CHAR || addr.dbr_field_type == DBR_UCHAR)) { dbrType = addr.dbr_field_type; @@ -398,6 +408,11 @@ long dbtr(const char *pname) if (nameToAddr(pname, &addr)) return -1; + if (addr.precord->lset == NULL) { + printf("dbtr only works after iocInit\n"); + return -1; + } + precord = (struct dbCommon*)addr.precord; if (precord->pact) { printf("record active\n"); @@ -437,6 +452,11 @@ long dbtgf(const char *pname) if (nameToAddr(pname, &addr)) return -1; + if (addr.precord->lset == NULL) { + printf("dbtgf only works after iocInit\n"); + return -1; + } + /* try all options first */ req_options = 0xffffffff; ret_options = req_options; @@ -534,6 +554,11 @@ long dbtpf(const char *pname, const char *pvalue) if (nameToAddr(pname, &addr)) return -1; + if (addr.precord->lset == NULL) { + printf("dbtpf only works after iocInit\n"); + return -1; + } + val_long = strtol(pvalue, &pend, 10); validLong = (*pend == 0); @@ -797,7 +822,7 @@ static void printBuffer( printf("no_strs = %u:\n", pdbr_enumStrs->no_str); - for (i = 0; i < pdbr_enumStrs->no_str; i++) + for (i = 0; i < pdbr_enumStrs->no_str; i++) printf("\t\"%s\"\n", pdbr_enumStrs->strs[i]); } else {