f57fc11d951807e19b20b5960e735fa50eaea279 braney Fri Jun 12 13:10:00 2026 -0700 Fix more warnings exposed by -O3 build across hg utils and errAbort Continuation of the -O3 cleanup: a full clean rebuild surfaced warnings in many programs whose objects had not been recompiled before. Most are the same mechanical patterns as the first batch (strncpy -> safecpy/memcpy, sprintf -> safef), plus a few that needed more thought: - errAbort.h: mark errAbort/vaErrAbort/errnoAbort/noWarnAbort as noreturn. They provably never return (longjmp or exit; the existing "to make compiler happy" exit(-1) in noWarnAbort confirms the intent), and this lets GCC prune the impossible null paths after an errAbort guard, fixing false-positive null-deref / overread warnings in mafAddIRows, mafAddIRowsStream and phyloPlace with no source change to those files. - altSplice.c (hgGene): real one-element stack buffer overflow. makeGrayShades writes shadesOfGray[maxShade+1], but the caller declared shadesOfGray[9] with maxShade=8. Grow the array to [10] (maxShade stays 8); behavior unchanged. - hgc.c bedPrintPos: ~60 callers pass a track-specific struct cast to (struct bed *) and read only its bed-compatible leading fields. At -O3 -Warray-bounds flags the casts because the real object is smaller than struct bed; the reads are safe by the bed-layout convention, so suppress -Warray-bounds around just that function. - mafsInRegion.c: chromFromSrc returns strchr(src,'.')+1, which GCC mis-sizes as a 0-byte region when handed to strcmp via sameString/differentString; suppress the false-positive -Wstringop-overread around extractMafs. - sanger22gtf.c, bottleneck.c: put the printf/fprintf in the else of the NULL guard so -Wformat-overflow (which runs before the noreturn-based pruning) can see the argument is non-null. safecpy/memcpy/safef conversions: basicBed already done earlier; here haplotypes (memcpy of the original pointer pun), gbToFaRa, motifSig, hgClonePos, featureBits, libScan, hgGoldGapGl, hgSoftPromoter, mafClick, mafAddQRows, hgc.c, stanToBedAndExpRecs, bedUp, faSplit, trfBig, splitFaIntoContigs, aladdin, ameme. A full clean tree now builds with no warnings at -O3. refs #37761 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> diff --git src/hg/recycleDb/bedUp/bedUp.c src/hg/recycleDb/bedUp/bedUp.c index 0caa5f9d363..ce8dfc73dae 100644 --- src/hg/recycleDb/bedUp/bedUp.c +++ src/hg/recycleDb/bedUp/bedUp.c @@ -25,51 +25,51 @@ char *chrom; /* Human chromosome or FPC contig */ unsigned chromStart; /* Start position in chromosome */ unsigned chromEnd; /* End position in chromosome */ char *name; /* Name. */ char **extraWords; /* Other words in this row of database. */ char *id; /* Unique ID - allocated in hash. */ struct psl *pslList; /* Conversion psl. */ char *oldClone; /* Old clone this used to be at. */ bool converted; /* TRUE if converted to new coors. */ }; char *bedIdS(char *name, char *chrom, char *chromStart) /* Return unique identifier for bed treating number as string. */ { static char buf[128]; -sprintf(buf, "%s.%s.%s", name, chrom, chromStart); +safef(buf, sizeof(buf), "%s.%s.%s", name, chrom, chromStart); return buf; } char *bedId(char *name, char *chrom, int chromStart) /* Return unique identifier for bed. */ { char num[16]; sprintf(num, "%d", chromStart); return bedIdS(name, chrom, num); } void unpackPslName(struct lineFile *lf, char *pslName, char **retName, char **retDb, char **retChrom, int *retStart) /* Unpack name in convert psl file. */ { static char buf[128]; char *words[8]; int i; char *e; -strncpy(buf, pslName, sizeof(buf)); +safecpy(buf, sizeof(buf), pslName); for (i=0; i<3; ++i) { e = strrchr(buf, '.'); if (e == NULL) errAbort("Expecting name.db.chrom.start line %d of %s", lf->lineIx, lf->fileName); *e++ = 0; words[i] = e; } *retDb = words[2]; *retChrom = words[1]; *retStart = atoi(words[0]); *retName = buf; } struct bedExt *loadTable(char *fileName, struct hash *bedHash, struct hash *chromHash, struct hash *cloneHash)