fb50a1cca3a117bb964c43196671142484b13bf9
braney
  Fri Jun 12 12:10:47 2026 -0700
lib jkOwnLib hg/lib: fix warnings exposed by -O3 build

At -O3 GCC does more inlining and interprocedural range analysis, which
surfaces several warnings that -O -g never triggered.  With -Werror these
break the build, so fix them ahead of switching the default to -O3.

- bamFile.c: move setenv() into the else of its NULL guard so it is not
reachable with a NULL argument (-Wnonnull, seen via inlining of bamFetch).
- basicBed.c, wormdna.c, bedDetail.c, customFactory.c, hdb.c, qaSeq.c:
replace strncpy() with safecpy() where the result must be terminated
(-Wstringop-truncation).
- htmshell.c: use memcpy() for the intentional exact-length, non-terminated
copy (-Wstringop-truncation).
- obscure.c: compute the comma groups in sprintLongWithCommas() with % 1000
so the compiler can see each %03lld argument is bounded (-Wformat-overflow).
- crudeali.c: do the endian type-pun through a union so strict-aliasing
analysis no longer reports the value as uninitialized (-Wuninitialized).
- jksql.c: wrap a possibly-NULL database name in naForNull() before passing
it to %s (-Wformat-overflow).

refs #37761

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

diff --git src/hg/lib/qaSeq.c src/hg/lib/qaSeq.c
index 99082ec94ba..80b8f662a29 100644
--- src/hg/lib/qaSeq.c
+++ src/hg/lib/qaSeq.c
@@ -180,31 +180,31 @@
 	    errAbort("Expecting '>' line %d of %s", lf->lineIx, lf->fileName);
 	if (s[1] != 0)
 	    s += 1;
 	else
 	    {
 	    if (wordCount == 1)
 	        errAbort("Expecting '>name' line %d of %s", lf->lineIx, lf->fileName);
 	    else
 	        s = words[1];
 	    }
         break;
 	}
     }
 if (s == NULL)
     return FALSE;
-strncpy(name, s, sizeof(name));    	
+safecpy(name, sizeof(name), s);
 
 /* Read numbers until next '>' line or end of file. */
 /* Read to first non-space line.  Complain if it doesn't start with '>' */
 while (lineFileNext(lf, &line, &lineSize))
     {
     if (line[0] == '>')
         {
         lineFileReuse(lf);
 	break;
 	}
     wordCount = chopLine(line, words);
     for (i=0; i<wordCount; ++i)
         {
 	if (bufIx >= bufSize)
 	    {