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/makeDb/outside/hgSoftPromoter/hgSoftPromoter.c src/hg/makeDb/outside/hgSoftPromoter/hgSoftPromoter.c index a8a495e3d95..200a8c24df9 100644 --- src/hg/makeDb/outside/hgSoftPromoter/hgSoftPromoter.c +++ src/hg/makeDb/outside/hgSoftPromoter/hgSoftPromoter.c @@ -1,135 +1,135 @@ /* hgSoftPromoter - Slap Softberry promoter file into database.. */ /* Copyright (C) 2013 The Regents of the University of California * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "cheapcgi.h" #include "jksql.h" #include "softPromoter.h" void usage() /* Explain usage and exit. */ { errAbort( "hgSoftPromoter - Slap Softberry promoter file into database.\n" "usage:\n" " hgSoftPromoter database files(s).prom\n" "options:\n" " -xxx=XXX\n" ); } char *simplifyName(char *softName) /* Convert softberry name to something ok to see in browser */ { static char simple[256]; softName += 3; /* Skip over 'gn:' */ if (startsWith("NM_", softName)) { char *e = strchr(softName+3, '_'); if (e != NULL) *e = 0; - strncpy(simple, softName, sizeof(simple)); + safecpy(simple, sizeof(simple), softName); } else if (startsWith("FGENESH+_", softName)) { sprintf(simple, "fgene+%s", softName+9); } else { strncpy(simple, softName, sizeof(simple)); simple[16] = 0; } return simple; } int milliScore(double score) /* Return scaled score. */ { int milli = round(score*500); if (milli < 0) milli = 0; if (milli > 1000) milli = 1000; return milli; } void oneFile(char *fileName, FILE *f) /* Parse one input file and add to tab separated output. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char chromName[128]; char *row[9]; splitPath(fileName, NULL, chromName, NULL); printf("Parsing %s\n", fileName); while (lineFileRow(lf, row)) { fprintf(f, "%s\t", chromName); fprintf(f, "%d\t", lineFileNeedNum(lf, row, 1)-1); fprintf(f, "%d\t", lineFileNeedNum(lf, row, 2)); fprintf(f, "%s\t", simplifyName(row[7])); fprintf(f, "%d\t", milliScore(atof(row[6]))); fprintf(f, "%s\t", row[4]); fprintf(f, "%s\t", row[6]); fprintf(f, "%s\t", row[7]); fprintf(f, "%s\n", row[8]); } lineFileClose(&lf); } void loadDatabase(char *database, char *fileName) /* Load database table from tab-separated file. */ { struct sqlConnection *conn = sqlConnect(database); char query[256]; printf("Loading %s from %s\n", database, fileName); sqlSafef(query, sizeof query, "CREATE TABLE softPromoter (\n" "chrom varchar(255) not null, # Human chromosome or FPC contig\n" "chromStart int unsigned not null, # Start position in chromosome\n" "chromEnd int unsigned not null, # End position in chromosome\n" "name varchar(255) not null, # As displayed in browser\n" "score int unsigned not null, # Score from 0 to 1000\n" "type varchar(255) not null, # TATA+ or TATAless currently\n" "origScore float not null, # Score in original file, not scaled\n" "origName varchar(255) not null, # Name in original file\n" "blockString varchar(255) not null, # From original file. \n" "#Indices\n" "INDEX(chrom(12),chromStart),\n" "INDEX(chrom(12),chromEnd),\n" "INDEX(name(12))\n" ")\n"); sqlMaybeMakeTable(conn, "softPromoter", query); sqlSafef(query, sizeof query, "delete from softPromoter"); sqlUpdate(conn, query); sqlSafef(query, sizeof query, "load data local infile '%s' into table softPromoter", fileName); sqlUpdate(conn, query); sqlDisconnect(&conn); } void hgSoftPromoter(char *database, int fileCount, char *fileNames[]) /* hgSoftPromoter - Slap Softberry promoter file into database.. */ { char *tabFile = "softPromoter.tab"; FILE *f = mustOpen(tabFile, "w"); int i; for (i=0; i<fileCount; ++i) oneFile(fileNames[i], f); carefulClose(&f); loadDatabase(database, tabFile); } int main(int argc, char *argv[]) /* Process command line. */ { cgiSpoof(&argc, argv); if (argc <= 3) usage(); hgSoftPromoter(argv[1], argc-2, argv+2); return 0; }