- enough lclint annotations and fiddles already.
authorjbj <devnull@localhost>
Sat, 5 May 2001 19:28:32 +0000 (19:28 +0000)
committerjbj <devnull@localhost>
Sat, 5 May 2001 19:28:32 +0000 (19:28 +0000)
CVS patchset: 4741
CVS date: 2001/05/05 19:28:32

55 files changed:
build/files.c
build/myftw.c
build/pack.c
build/parseChangelog.c
build/parseDescription.c
build/parseFiles.c
build/parsePrep.c
build/parseScript.c
build/rpmbuild.h
build/rpmspec.h
build/spec.c
lib/Makefile.am
lib/dbconfig.c
lib/formats.c
lib/fsm.c
lib/fsm.h
lib/header.h
lib/manifest.c
lib/md5.c
lib/md5.h
lib/psm.c
lib/psm.h
lib/rpmdb.c
lib/rpmdb.h
lib/rpmlib.h
lib/rpmrc.c
lib/signature.h
lib/stringbuf.c
lib/stringbuf.h
lib/transaction.c
lib/verify.c
popt/.lclintrc
popt/findme.c
popt/findme.h
popt/popt.c
popt/popt.h
popt/poptconfig.c
popt/popthelp.c
popt/poptint.h
popt/poptparse.c
popt/system.h
popt/test1.c
popt/test2.c
rpm.c
rpmio/digest.c
rpmio/macro.c
rpmio/rpmio.c
rpmio/rpmio.h
rpmio/rpmlog.h
rpmio/rpmmalloc.c
rpmqv.c
scripts/trpm
system.h
tools/rpminject.c
tools/rpmsort.c

index 8e51051..6f011df 100644 (file)
@@ -22,9 +22,9 @@
 #include "debug.h"
 
 /*@access Header @*/
-/*@access StringBuf @*/
 /*@access TFI_t @*/
 /*@access FD_t @*/
+/*@access StringBuf @*/                /* compared with NULL */
 
 #define        SKIPWHITE(_x)   {while(*(_x) && (xisspace(*_x) || *(_x) == ',')) (_x)++;}
 #define        SKIPNONWHITE(_x){while(*(_x) &&!(xisspace(*_x) || *(_x) == ',')) (_x)++;}
@@ -271,6 +271,7 @@ typedef struct VFA {
 
 /**
  */
+/*@-exportlocal@*/
 VFA_t verifyAttrs[] = {
        { "md5",        RPMVERIFY_MD5 },
        { "size",       RPMVERIFY_FILESIZE },
@@ -282,6 +283,7 @@ VFA_t verifyAttrs[] = {
        { "rdev",       RPMVERIFY_RDEV },
        { NULL, 0 }
 };
+/*@=exportlocal@*/
 
 /**
  * @param fl           package file tree walk data
@@ -737,6 +739,7 @@ static int parseForRegexMultiLib(const char *fileName)      /*@*/
 
 /**
  */
+/*@-exportlocal@*/
 VFA_t virtualFileAttributes[] = {
        { "%dir",       0 },    /* XXX why not RPMFILE_DIR? */
        { "%doc",       RPMFILE_DOC },
@@ -756,6 +759,7 @@ VFA_t virtualFileAttributes[] = {
 
        { NULL, 0 }
 };
+/*@=exportlocal@*/
 
 /**
  * @param fl           package file tree walk data
@@ -1253,7 +1257,9 @@ static void genCpioListAndHeader(/*@partial@*/ FileList fl,
        d += 2;         /* skip both dirname and basename NUL's */
 
        /* Create archive path, normally adding "./" */
+       /*@-dependenttrans@*/   /* FIX: xstrdup? nah ... */
        fi->apath[i] = a;
+       /*@=dependenttrans@*/
        if (_addDotSlash) a = stpcpy(a, "./");
        a = stpcpy(a, (flp->fileURL + skipLen));
        a++;            /* skip apath NUL */
@@ -1539,7 +1545,8 @@ exit:
  */
 static int processPackageFiles(Spec spec, Package pkg,
                               int installSpecialDoc, int test)
-       /*@modifies pkg->cpioList, pkg->specialDoc, pkg->header */
+       /*@modifies spec->macros,
+               pkg->cpioList, pkg->specialDoc, pkg->header */
 {
     HGE_t hge = (HGE_t)headerGetEntryMinMemory;
     struct FileList_s fl;
@@ -1964,7 +1971,7 @@ int processSourceFiles(Spec spec)
                        spec->sourceHeader, 1);
     }
 
-    freeStringBuf(sourceFiles);
+    sourceFiles = freeStringBuf(sourceFiles);
     fl.fileList = freeFileList(fl.fileList, fl.fileListRecsUsed);
     return fl.processingFailed;
 }
@@ -2118,6 +2125,7 @@ typedef struct {
 
 /**
  */
+/*@-exportlocal@*/
 DepMsg_t depMsgs[] = {
   { "Provides",                { "%{__find_provides}", NULL, NULL, NULL },
        RPMTAG_PROVIDENAME, RPMTAG_PROVIDEVERSION, RPMTAG_PROVIDEFLAGS,
@@ -2157,6 +2165,7 @@ DepMsg_t depMsgs[] = {
        0, -1 },
   { NULL,              { NULL, NULL, NULL, NULL },     0, 0, 0, 0, 0 }
 };
+/*@=exportlocal@*/
 
 /**
  */
@@ -2261,7 +2270,7 @@ static int generateDepends(Spec spec, Package pkg, TFI_t cpioList, int multiLib)
        else
            tagflags &= ~RPMSENSE_MULTILIB;
        rc = parseRCPOT(spec, pkg, getStringBuf(readBuf), tag, 0, tagflags);
-       freeStringBuf(readBuf);
+       readBuf = freeStringBuf(readBuf);
 
        if (rc) {
            rpmError(rc, _("Failed to find %s:\n"), dm->msg);
@@ -2269,7 +2278,7 @@ static int generateDepends(Spec spec, Package pkg, TFI_t cpioList, int multiLib)
        }
     }
 
-    freeStringBuf(writeBuf);
+    writeBuf = freeStringBuf(writeBuf);
     return rc;
 }
 
index 55ff1e8..499e26b 100644 (file)
@@ -30,6 +30,7 @@ Cambridge, MA 02139, USA.  */
 #define NAMLEN(a) strlen((a)->d_name)
 #endif
 
+#if !defined(__LCLINT__)
 #ifndef PATH_MAX
 #ifdef _POSIX_VERSION
 #define PATH_MAX _POSIX_PATH_MAX
@@ -41,6 +42,7 @@ Cambridge, MA 02139, USA.  */
 #endif
 #endif
 #endif
+#endif /* !__LCLINT */
 
 #include "myftw.h"
 #include "debug.h"
index e739afd..f4a2ed0 100644 (file)
@@ -124,7 +124,7 @@ static /*@only@*/ /*@null@*/ StringBuf addFileToTagAux(Spec spec,
     fd = Fopen(fn, "r.ufdio");
     if (fn != buf) fn = _free(fn);
     if (fd == NULL || Ferror(fd)) {
-       freeStringBuf(sb);
+       sb = freeStringBuf(sb);
        return NULL;
     }
     if ((f = fdGetFp(fd)) != NULL)
@@ -132,8 +132,7 @@ static /*@only@*/ /*@null@*/ StringBuf addFileToTagAux(Spec spec,
        /* XXX display fn in error msg */
        if (expandMacros(spec, spec->macros, buf, sizeof(buf))) {
            rpmError(RPMERR_BADSPEC, _("line: %s\n"), buf);
-           freeStringBuf(sb);
-           sb = NULL;
+           sb = freeStringBuf(sb);
            break;
        }
        appendStringBuf(sb, buf);
@@ -162,7 +161,7 @@ static int addFileToTag(Spec spec, const char * file, Header h, int tag)
     
     (void) headerAddEntry(h, tag, RPM_STRING_TYPE, getStringBuf(sb), 1);
 
-    freeStringBuf(sb);
+    sb = freeStringBuf(sb);
     return 0;
 }
 
@@ -180,7 +179,7 @@ static int addFileToArrayTag(Spec spec, const char *file, Header h, int tag)
     s = getStringBuf(sb);
     (void) headerAddOrAppendEntry(h, tag, RPM_STRING_ARRAY_TYPE, &s, 1);
 
-    freeStringBuf(sb);
+    sb = freeStringBuf(sb);
     return 0;
 }
 
index 8b9c5fa..4451538 100644 (file)
@@ -203,13 +203,11 @@ static int addChangelog(Header h, StringBuf sb)
 int parseChangelog(Spec spec)
 {
     int nextPart, res, rc;
-    StringBuf sb;
-
-    sb = newStringBuf();
+    StringBuf sb = newStringBuf();
     
     /* There are no options to %changelog */
     if ((rc = readLine(spec, STRIP_COMMENTS)) > 0) {
-       freeStringBuf(sb);
+       sb = freeStringBuf(sb);
        return PART_NONE;
     }
     if (rc)
@@ -226,7 +224,7 @@ int parseChangelog(Spec spec)
     }
 
     res = addChangelog(spec->packages->header, sb);
-    freeStringBuf(sb);
+    sb = freeStringBuf(sb);
 
     return (res) ? res : nextPart;
 }
index 9dad041..3f3ab54 100644 (file)
@@ -54,7 +54,7 @@ int parseDescription(Spec spec)
                 poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
                 spec->line);
        argv = _free(argv);
-       poptFreeContext(optCon);
+       optCon = poptFreeContext(optCon);
        return RPMERR_BADSPEC;
     }
 
@@ -66,7 +66,7 @@ int parseDescription(Spec spec)
                     spec->lineNum,
                     spec->line);
            argv = _free(argv);
-           poptFreeContext(optCon);
+           optCon = poptFreeContext(optCon);
            return RPMERR_BADSPEC;
        }
     }
@@ -75,7 +75,7 @@ int parseDescription(Spec spec)
        rpmError(RPMERR_BADSPEC, _("line %d: Package does not exist: %s\n"),
                 spec->lineNum, spec->line);
        argv = _free(argv);
-       poptFreeContext(optCon);
+       optCon = poptFreeContext(optCon);
        return RPMERR_BADSPEC;
     }
 
@@ -87,7 +87,7 @@ int parseDescription(Spec spec)
        rpmError(RPMERR_BADSPEC, _("line %d: Second description\n"),
                spec->lineNum);
        argv = _free(argv);
-       poptFreeContext(optCon);
+       optCon = poptFreeContext(optCon);
        return RPMERR_BADSPEC;
     }
 #endif
@@ -122,10 +122,10 @@ int parseDescription(Spec spec)
                        getStringBuf(sb), lang);
     }
     
-    freeStringBuf(sb);
+    sb = freeStringBuf(sb);
      
     argv = _free(argv);
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
     
     return nextPart;
 }
index df3e8d9..10e6cb0 100644 (file)
@@ -9,6 +9,7 @@
 #include "debug.h"
 
 /*@access StringBuf @*/                /* compared with NULL */
+/*@access poptContext @*/      /* compared with NULL */
 
 /* These have to be global scope to make up for *stupid* compilers */
     /*@observer@*/ /*@null@*/ static const char *name = NULL;
@@ -25,7 +26,7 @@ int parseFiles(Spec spec)
     Package pkg;
     int rc, argc;
     int arg;
-    const char **argv = NULL;
+    const char ** argv = NULL;
     int flag = PART_SUBNAME;
     poptContext optCon = NULL;
 
@@ -106,8 +107,7 @@ int parseFiles(Spec spec)
 
 exit:
     argv = _free(argv);
-    if (optCon)
-       poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
        
     return rc;
 }
index da18267..b7730d7 100644 (file)
@@ -297,9 +297,9 @@ static int doSetupMacro(Spec spec, char *line)
        if (parseNum(optArg, &num)) {
            rpmError(RPMERR_BADSPEC, _("line %d: Bad arg to %%setup: %s\n"),
                     spec->lineNum, (optArg ? optArg : "???"));
-           freeStringBuf(before);
-           freeStringBuf(after);
-           poptFreeContext(optCon);
+           before = freeStringBuf(before);
+           after = freeStringBuf(after);
+           optCon = poptFreeContext(optCon);
            argv = _free(argv);
            return RPMERR_BADSPEC;
        }
@@ -317,9 +317,9 @@ static int doSetupMacro(Spec spec, char *line)
                 spec->lineNum,
                 poptBadOption(optCon, POPT_BADOPTION_NOALIAS), 
                 poptStrerror(arg));
-       freeStringBuf(before);
-       freeStringBuf(after);
-       poptFreeContext(optCon);
+       before = freeStringBuf(before);
+       after = freeStringBuf(after);
+       optCon = poptFreeContext(optCon);
        argv = _free(argv);
        return RPMERR_BADSPEC;
     }
@@ -334,7 +334,7 @@ static int doSetupMacro(Spec spec, char *line)
     }
     addMacro(spec->macros, "buildsubdir", NULL, spec->buildSubdir, RMIL_SPEC);
     
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
     argv = _free(argv);
 
     /* cd to the build dir */
@@ -369,7 +369,7 @@ static int doSetupMacro(Spec spec, char *line)
     }
 
     appendStringBuf(spec->prep, getStringBuf(before));
-    freeStringBuf(before);
+    before = freeStringBuf(before);
 
     if (!createDir) {
        sprintf(buf, "cd %s", spec->buildSubdir);
@@ -384,7 +384,7 @@ static int doSetupMacro(Spec spec, char *line)
     }
     
     appendStringBuf(spec->prep, getStringBuf(after));
-    freeStringBuf(after);
+    after = freeStringBuf(after);
 
     /* XXX FIXME: owner & group fixes were conditioned on !geteuid() */
     /* Fix the owner, group, and permissions of the setup build tree */
@@ -516,7 +516,7 @@ static int doPatchMacro(Spec spec, char *line)
 int parsePrep(Spec spec)
 {
     int nextPart, res, rc;
-    StringBuf buf;
+    StringBuf sb;
     char **lines, **saveLines;
 
     if (spec->prep != NULL) {
@@ -533,12 +533,12 @@ int parsePrep(Spec spec)
     if (rc)
        return rc;
     
-    buf = newStringBuf();
+    sb = newStringBuf();
     
     while (! (nextPart = isPart(spec->line))) {
        /* Need to expand the macros inline.  That way we  */
        /* can give good line number information on error. */
-       appendStringBuf(buf, spec->line);
+       appendStringBuf(sb, spec->line);
        if ((rc = readLine(spec, STRIP_NOTHING)) > 0) {
            nextPart = PART_NONE;
            break;
@@ -547,7 +547,7 @@ int parsePrep(Spec spec)
            return rc;
     }
 
-    saveLines = splitString(getStringBuf(buf), strlen(getStringBuf(buf)), '\n');
+    saveLines = splitString(getStringBuf(sb), strlen(getStringBuf(sb)), '\n');
     /*@-usereleased@*/
     for (lines = saveLines; *lines; lines++) {
        res = 0;
@@ -560,14 +560,14 @@ int parsePrep(Spec spec)
        }
        if (res && !spec->force) {
            freeSplitString(saveLines);
-           freeStringBuf(buf);
+           sb = freeStringBuf(sb);
            return res;
        }
     }
     /*@=usereleased@*/
 
     freeSplitString(saveLines);
-    freeStringBuf(buf);
+    sb = freeStringBuf(sb);
 
     return nextPart;
 }
index 4e27174..070e803 100644 (file)
@@ -9,6 +9,7 @@
 #include "debug.h"
 
 /*@access StringBuf@*/ /* XXX compared with NULL */
+/*@access poptContext @*/      /* compared with NULL */
 
 /**
  */
@@ -293,12 +294,10 @@ int parseScript(Spec spec, int parsePart)
     rc = nextPart;
     
 exit:
-    if (sb != NULL)
-       freeStringBuf(sb);
+    sb = freeStringBuf(sb);
     progArgv = _free(progArgv);
     argv = _free(argv);
-    if (optCon)
-       poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
     
     return rc;
 }
index 73c7f50..7e66e39 100644 (file)
@@ -371,6 +371,7 @@ int rpmlibNeedsFeature(Header h, const char * feature, const char * featureEVR)
  */
 int processBinaryFiles(Spec spec, int installSpecialDoc, int test)
        /*@modifies spec->packages->cpioList, spec->packages->specialDoc,
+               spec->macros,
                spec->packages->header @*/;
 
 /** \ingroup rpmbuild
@@ -408,7 +409,7 @@ int processSourceFiles(Spec spec)
  * @return
  */
 int parseSpec(/*@out@*/ Spec * specp, const char * specFile,
-               const char * rootdir,
+               /*@null@*/ const char * rootdir,
                /*@null@*/ const char * buildRoot,
                int inBuildArch,
                /*@null@*/ const char * passPhrase,
index 2533e58..3b660b0 100644 (file)
@@ -207,7 +207,7 @@ struct spectag * stashSt(Spec spec, Header h, int tag, const char * lang)
  */
 int addSource(Spec spec, Package pkg, const char * field, int tag)
        /*@modifies spec->sources, spec->numSources,
-               spec->st,
+               spec->st, spec->macros,
                pkg->icon @*/;
 
 /** \ingroup rpmbuild
index 6d5c5d8..a0f03d1 100644 (file)
@@ -147,7 +147,7 @@ void freePackage(/*@only@*/ Package p)
     p->verifyFile = _free(p->verifyFile);
 
     headerFree(p->header);
-    freeStringBuf(p->fileList);
+    p->fileList = freeStringBuf(p->fileList);
     p->fileFile = _free(p->fileFile);
     if (p->cpioList) {
        TFI_t fi = p->cpioList;
@@ -156,7 +156,7 @@ void freePackage(/*@only@*/ Package p)
        fi = _free(fi);
     }
 
-    freeStringBuf(p->specialDoc);
+    p->specialDoc = freeStringBuf(p->specialDoc);
 
     freeSources(p->icon);
 
@@ -454,10 +454,10 @@ void freeSpec(/*@only@*/ Spec spec)
     freeSl(spec->sl);  spec->sl = NULL;
     freeSt(spec->st);  spec->st = NULL;
 
-    freeStringBuf(spec->prep); spec->prep = NULL;
-    freeStringBuf(spec->build);        spec->build = NULL;
-    freeStringBuf(spec->install); spec->install = NULL;
-    freeStringBuf(spec->clean);        spec->clean = NULL;
+    spec->prep = freeStringBuf(spec->prep);
+    spec->build = freeStringBuf(spec->build);
+    spec->install = freeStringBuf(spec->install);
+    spec->clean = freeStringBuf(spec->clean);
 
     spec->buildRootURL = _free(spec->buildRootURL);
     spec->buildSubdir = _free(spec->buildSubdir);
index dc7aec1..247cb44 100644 (file)
@@ -57,9 +57,9 @@ getdate.c: getdate.y
        @echo expect 10 shift/reduce conflicts
        $(YACC) $(srcdir)/getdate.y
        -@if test -f y.tab.c; then \
-        { echo "/*@-globstate -retvalint -unqualifiedtrans -usedef -varuse -nullderef@*/";\
+        { echo "/*@-globstate -retvalint -unqualifiedtrans -usedef -varuse -nullderef -exportlocal @*/";\
           cat y.tab.c ;\
-          echo "/*@=globstate =retvalint =unqualifiedtrans =usedef =varuse =nullderef@*/";\
+          echo "/*@=globstate =retvalint =unqualifiedtrans =usedef =varuse =nullderef =exportlocal @*/";\
         } > getdate.c ;\
           rm -f y.tab.c; \
        else \
index 8ece273..26459d7 100644 (file)
@@ -19,7 +19,9 @@
 #if DB_VERSION_MAJOR == 3
 #define        __USE_DB3       1
 
+/*@-exportlocal@*/
 struct _dbiIndex db3dbi;
+/*@=exportlocal@*/
 
 /** \ingroup db3
  *  Analogue to struct poptOption
@@ -33,7 +35,7 @@ struct dbOption {
 
 #define        _POPT_SET_BIT   (POPT_ARG_VAL|POPT_ARGFLAG_OR)
 
-/*@-immediatetrans@*/
+/*@-immediatetrans -exportlocal@*/
 /** \ingroup db3
  */
 struct dbOption rdbOptions[] = {
@@ -142,7 +144,7 @@ struct dbOption rdbOptions[] = {
 
  { NULL, 0, NULL, 0 }
 };
-/*@=immediatetrans@*/
+/*@=immediatetrans =exportlocal@*/
 
 static int dbSaveLong(const struct dbOption * opt, long aLong) {
     if (opt->argInfo & POPT_ARGFLAG_NOT)
index 97a58d4..018d2c5 100644 (file)
@@ -398,7 +398,9 @@ static int filenamesTag(Header h, /*@out@*/ int_32 * type,
 
 /* I18N look aside diversions */
 
+/*@-exportlocal@*/
 int _nl_msg_cat_cntr;  /* XXX GNU gettext voodoo */
+/*@=exportlocal@*/
 static const char * language = "LANGUAGE";
 
 static char * _macro_i18ndomains = "%{?_i18ndomains:%{_i18ndomains}}";
index fc1405e..cf4bd43 100644 (file)
--- a/lib/fsm.c
+++ b/lib/fsm.c
 int _fsm_debug = 0;
 
 /* XXX Failure to remove is not (yet) cause for failure. */
+/*@-exportlocal@*/
 int strict_erasures = 0;
+/*@=exportlocal@*/
 
 rpmTransactionSet fsmGetTs(const FSM_t fsm) {
     const FSMI_t iter = fsm->iter;
     return (iter ? iter->ts : NULL);
 }
 
-TFI_t fsmGetFi(const FSM_t fsm) {
+TFI_t fsmGetFi(const FSM_t fsm)
+{
     const FSMI_t iter = fsm->iter;
     return (iter ? iter->fi : NULL);
 }
@@ -44,10 +47,12 @@ TFI_t fsmGetFi(const FSM_t fsm) {
  * @param suffix       suffix to use (NULL disables)
  * @retval             path to file
  */
-static /*@only@*//*@null@*/ const char * fsmFsPath(/*@null@*/ const FSM_t fsm,
-       /*@null@*/ const struct stat * st,
-       /*@null@*/ const char * subdir,
-       /*@null@*/ const char * suffix)
+static /*@only@*//*@null@*/
+const char * fsmFsPath(/*@special@*/ /*@null@*/ const FSM_t fsm,
+               /*@null@*/ const struct stat * st,
+               /*@null@*/ const char * subdir,
+               /*@null@*/ const char * suffix)
+       /*@uses fsm->dirName, fsm->baseName */
 {
     const char * s = NULL;
 
@@ -125,6 +130,7 @@ static int mapNextIterator(void * this) {
 /** \ingroup payload
  */
 static int cpioStrCmp(const void * a, const void * b)
+       /*@*/
 {
     const char * afn = *(const char **)a;
     const char * bfn = *(const char **)b;
@@ -146,7 +152,9 @@ static int cpioStrCmp(const void * a, const void * b)
  * @param fsmPath      archive path
  * @return             index into file info, -1 if archive path was not found
  */
-static int mapFind(void * this, const char * fsmPath) {
+static int mapFind(void * this, const char * fsmPath)
+       /*@*/
+{
     FSMI_t iter = this;
     const TFI_t fi = iter->fi;
     int ix = -1;
@@ -154,7 +162,9 @@ static int mapFind(void * this, const char * fsmPath) {
     if (fi && fi->fc > 0 && fi->apath && fsmPath && *fsmPath) {
        const char ** p;
 
+       /*@-nullpass@*/         /* LCL: fi->apath != NULL */
        p = bsearch(&fsmPath, fi->apath, fi->fc, sizeof(fsmPath), cpioStrCmp);
+       /*@=nullpass@*/
        if (p == NULL) {
            fprintf(stderr, "*** not mapped %s\n", fsmPath);
        } else {
@@ -208,7 +218,9 @@ static inline int dnlIndex(const DNLI_t dnli) {
  * @param reverse      traverse directory names in reverse order?
  * @return             directory name iterator
  */
-static /*@only@*/ void * dnlInitIterator(const FSM_t fsm, int reverse)
+static /*@only@*/ void * dnlInitIterator(/*@special@*/ const FSM_t fsm,
+               int reverse)
+       /*@uses fsm->iter @*/ 
 {
     TFI_t fi = fsmGetFi(fsm);
     DNLI_t dnli;
@@ -309,7 +321,10 @@ static /*@observer@*/ const char * dnlNextIterator(/*@null@*/ DNLI_t dnli)
  * @return             Is chain only partially filled?
  */
 /*@-compmempass@*/
-static int saveHardLink(FSM_t fsm)
+static int saveHardLink(/*@special@*/ /*@partial@*/ FSM_t fsm)
+       /*@uses fsm->links, fsm->ix, fsm->sb, fsm->goal, fsm->nsuffix @*/
+       /*@defines fsm->li @*/
+       /*@releases fsm->path @*/
 {
     struct stat * st = &fsm->sb;
     int rc = 0;
@@ -406,7 +421,8 @@ static /*@null@*/ void * freeHardLink(/*@only@*/ /*@null@*/ struct hardLink * li
     return _free(li);
 }
 
-FSM_t newFSM(void) {
+FSM_t newFSM(void)
+{
     FSM_t fsm = xcalloc(1, sizeof(*fsm));
     return fsm;
 }
@@ -467,7 +483,7 @@ int fsmSetup(FSM_t fsm, fileStage goal,
 
     rc = fsmStage(fsm, fsm->goal);
 
-    if (!rc && fsm->archiveSize)
+    if (fsm->archiveSize && rc == 0)
        *fsm->archiveSize = (fdGetCpioPos(fsm->cfd) - pos);
 
    return rc;
@@ -532,12 +548,12 @@ assert(fi->type == TR_ADDED);
            break;
 
        case FA_SKIPNSTATE:
-           if (fi->type == TR_ADDED)
+           if (fi->fstates && fi->type == TR_ADDED)
                fi->fstates[i] = RPMFILE_STATE_NOTINSTALLED;
            break;
 
        case FA_SKIPNETSHARED:
-           if (fi->type == TR_ADDED)
+           if (fi->fstates && fi->type == TR_ADDED)
                fi->fstates[i] = RPMFILE_STATE_NETSHARED;
            break;
 
@@ -617,8 +633,8 @@ int fsmMapAttrs(FSM_t fsm)
  * @param fsm          file state machine data
  * @return             0 on success
  */
-static int expandRegular(FSM_t fsm)
-               /*@modifies fileSystem, fsm @*/
+static int expandRegular(/*@special@*/ FSM_t fsm)
+       /*@uses fsm->sb @*/
 {
     const char * fmd5sum;
     const struct stat * st = &fsm->sb;
@@ -680,9 +696,8 @@ exit:
  * @param writeData    should data be written?
  * @return             0 on success
  */
-/*@-compmempass@*/
-static int writeFile(FSM_t fsm, int writeData)
-       /*@modifies fsm @*/
+static int writeFile(/*@special@*/ FSM_t fsm, int writeData)
+       /*@uses fsm->path, fsm->opath, fsm->sb, fsm->osb, fsm->cfd @*/
 {
     const char * path = fsm->path;
     const char * opath = fsm->opath;
@@ -806,15 +821,14 @@ exit:
     /*@=dependenttrans@*/
     return rc;
 }
-/*@=compmempass@*/
 
 /** \ingroup payload
  * Write set of linked files to payload stream.
  * @param fsm          file state machine data
  * @return             0 on success
  */
-static int writeLinkedFile(FSM_t fsm)
-       /*@modifies fsm @*/
+static int writeLinkedFile(/*@special@*/ FSM_t fsm)
+       /*@uses fsm->path, fsm->nsuffix, fsm->ix, fsm->li, fsm->failedFile @*/
 {
     const char * path = fsm->path;
     const char * nsuffix = fsm->nsuffix;
@@ -835,7 +849,7 @@ static int writeLinkedFile(FSM_t fsm)
 
        /* Write data after last link. */
        rc = writeFile(fsm, (i == 0));
-       if (rc && fsm->failedFile && *fsm->failedFile == NULL) {
+       if (fsm->failedFile && rc != 0 && *fsm->failedFile == NULL) {
            ec = rc;
            *fsm->failedFile = xstrdup(fsm->path);
        }
@@ -855,7 +869,8 @@ static int writeLinkedFile(FSM_t fsm)
  * @param fsm          file state machine data
  * @return             0 on success
  */
-static int fsmMakeLinks(FSM_t fsm)
+static int fsmMakeLinks(/*@special@*/ FSM_t fsm)
+       /*@uses fsm->path, fsm->opath, fsm->nsuffix, fsm->ix, fsm->li @*/
 {
     const char * path = fsm->path;
     const char * opath = fsm->opath;
@@ -886,7 +901,7 @@ static int fsmMakeLinks(FSM_t fsm)
 
        /* XXX link(fsm->opath, fsm->path) */
        rc = fsmStage(fsm, FSM_LINK);
-       if (rc && fsm->failedFile && *fsm->failedFile == NULL) {
+       if (fsm->failedFile && rc != 0 && *fsm->failedFile == NULL) {
            ec = rc;
            *fsm->failedFile = xstrdup(fsm->path);
        }
@@ -907,8 +922,9 @@ static int fsmMakeLinks(FSM_t fsm)
  * @param fsm          file state machine data
  * @return             0 on success
  */
-/*@-compmempass@*/
-static int fsmCommitLinks(FSM_t fsm)
+static int fsmCommitLinks(/*@special@*/ FSM_t fsm)
+       /*@uses fsm->path, fsm->nsuffix, fsm->ix, fsm->sb,
+               fsm->li, fsm->links @*/
 {
     const char * path = fsm->path;
     const char * nsuffix = fsm->nsuffix;
@@ -940,14 +956,15 @@ static int fsmCommitLinks(FSM_t fsm)
     fsm->path = path;
     return rc;
 }
-/*@=compmempass@*/
 
 /**
  * Remove (if created) directories not explicitly included in package.
  * @param fsm          file state machine data
  * @return             0 on success
  */
-static int fsmRmdirs(FSM_t fsm)
+/*@-compdef@*/
+static int fsmRmdirs(/*@special@*/ FSM_t fsm)
+       /*@uses fsm->path, fsm->dnlx, fsm->ldn, fsm->rdbuf, fsm->iter @*/
 {
     const char * path = fsm->path;
     void * dnli = dnlInitIterator(fsm, 1);
@@ -958,6 +975,7 @@ static int fsmRmdirs(FSM_t fsm)
     fsm->path = NULL;
     dn[0] = '\0';
     /*@-observertrans -dependenttrans@*/
+    if (fsm->ldn != NULL && fsm->dnlx != NULL)
     while ((fsm->path = dnlNextIterator(dnli)) != NULL) {
        int dnlen = strlen(fsm->path);
        char * te;
@@ -987,13 +1005,17 @@ static int fsmRmdirs(FSM_t fsm)
     fsm->path = path;
     return rc;
 }
+/*@=compdef@*/
 
 /**
  * Create (if necessary) directories not explicitly included in package.
  * @param fsm          file state machine data
  * @return             0 on success
  */
-static int fsmMkdirs(FSM_t fsm)
+static int fsmMkdirs(/*@special@*/ FSM_t fsm)
+       /*@uses fsm->path, fsm->sb, fsm->osb, fsm->rdbuf, fsm->iter,
+               fsm->ldn, fsm->ldnlen, fsm->ldnalloc @*/
+       /*@defines fsm->dnlx, fsm->ldn @*/
 {
     struct stat * st = &fsm->sb;
     struct stat * ost = &fsm->osb;
@@ -1010,6 +1032,7 @@ static int fsmMkdirs(FSM_t fsm)
     dn[0] = '\0';
     fsm->dnlx = (dc ? xcalloc(dc, sizeof(*fsm->dnlx)) : NULL);
     /*@-observertrans -dependenttrans@*/
+    if (fsm->dnlx != NULL)
     while ((fsm->path = dnlNextIterator(dnli)) != NULL) {
        int dnlen = strlen(fsm->path);
        char * te;
@@ -1019,8 +1042,11 @@ static int fsmMkdirs(FSM_t fsm)
        fsm->dnlx[dc] = dnlen;
        if (dnlen <= 1)
            continue;
+
+       /*@-compdef -nullpass@*/        /* FIX: fsm->ldn not defined ??? */
        if (dnlen <= fsm->ldnlen && !strcmp(fsm->path, fsm->ldn))
            continue;
+       /*@=compdef =nullpass@*/
 
        /* Copy to avoid const on fsm->path. */
        (void) stpcpy(dn, fsm->path);
@@ -1033,6 +1059,7 @@ static int fsmMkdirs(FSM_t fsm)
            *te = '\0';
 
            /* Already validated? */
+           /*@-usedef -compdef -nullpass -nullderef@*/
            if (i < fsm->ldnlen &&
                (fsm->ldn[i] == '/' || fsm->ldn[i] == '\0') &&
                !strncmp(fsm->path, fsm->ldn, i))
@@ -1042,6 +1069,7 @@ static int fsmMkdirs(FSM_t fsm)
                fsm->dnlx[dc] = (te - dn);
                continue;
            }
+           /*@=usedef =compdef =nullpass =nullderef@*/
 
            /* Validate next component of path. */
            rc = fsmStage(fsm, FSM_LSTAT);
@@ -1071,7 +1099,9 @@ static int fsmMkdirs(FSM_t fsm)
            fsm->ldnalloc = dnlen + 100;
            fsm->ldn = xrealloc(fsm->ldn, fsm->ldnalloc);
        }
+       /*@-nullpass@*/         /* FIX: fsm->ldn NULL. */
        strcpy(fsm->ldn, fsm->path);
+       /*@=nullpass@*/
        fsm->ldnlen = dnlen;
     }
     dnli = dnlFreeIterator(dnli);
index e187151..aec1b08 100644 (file)
--- a/lib/fsm.h
+++ b/lib/fsm.h
@@ -120,28 +120,28 @@ struct fsm_s {
 /*@dependent@*/ char * rdbuf;          /*!<  read: Buffer. */
 /*@owned@*/ char * rdb;                        /*!<  read: Buffer allocated. */
     size_t rdsize;                     /*!<  read: Buffer allocated size. */
-    size_t rdlen;                      /*!<  read: Number of bytes requested. */
+    size_t rdlen;                      /*!<  read: Number of bytes requested.*/
     size_t rdnb;                       /*!<  read: Number of bytes returned. */
     FD_t wfd;                          /*!< write: File handle. */
 /*@dependent@*/ char * wrbuf;          /*!< write: Buffer. */
 /*@owned@*/ char * wrb;                        /*!< write: Buffer allocated. */
     size_t wrsize;                     /*!< write: Buffer allocated size. */
-    size_t wrlen;                      /*!< write: Number of bytes requested. */
+    size_t wrlen;                      /*!< write: Number of bytes requested.*/
     size_t wrnb;                       /*!< write: Number of bytes returned. */
 /*@only@*/ FSMI_t iter;                        /*!< File iterator. */
     int ix;                            /*!< Current file iterator index. */
 /*@only@*/ struct hardLink * links;    /*!< Pending hard linked file(s). */
 /*@only@*/ struct hardLink * li;       /*!< Current hard linked file(s). */
-/*@kept@*/ unsigned int * archiveSize; /*!< Pointer to archive size. */
-/*@kept@*/ const char ** failedFile;   /*!< First file name that failed. */
+/*@kept@*/ /*@null@*/ unsigned int * archiveSize;      /*!< Pointer to archive size. */
+/*@kept@*/ /*@null@*/ const char ** failedFile;        /*!< First file name that failed. */
 /*@shared@*/ const char * subdir;      /*!< Current file sub-directory. */
     char subbuf[64];   /* XXX eliminate */
 /*@observer@*/ const char * osuffix;   /*!< Old, preserved, file suffix. */
 /*@observer@*/ const char * nsuffix;   /*!< New, created, file suffix. */
 /*@shared@*/ const char * suffix;      /*!< Current file suffix. */
     char sufbuf[64];   /* XXX eliminate */
-/*@only@*/ short * dnlx;               /*!< Last dirpath verified indexes. */
-/*@only@*/ char * ldn;                 /*!< Last dirpath verified. */
+/*@only@*/ /*@null@*/ short * dnlx;    /*!< Last dirpath verified indexes. */
+/*@only@*/ /*@null@*/ char * ldn;      /*!< Last dirpath verified. */
     int ldnlen;                                /*!< Last dirpath current length. */
     int ldnalloc;                      /*!< Last dirpath allocated length. */
     int postpone;                      /*!< Skip remaining stages? */
@@ -167,6 +167,7 @@ struct fsm_s {
 extern "C" {
 #endif
 
+/*@-exportlocal@*/
 /**
  * Return formatted string representation of file stages.
  * @param a            file stage
@@ -180,6 +181,7 @@ extern "C" {
  * @return             formatted string
  */
 /*@observer@*/ const char *const fileActionString(fileAction a);
+/*@=exportlocal@*/
 
 /**
  * Create file state machine instance.
@@ -205,12 +207,12 @@ extern "C" {
  * @return             0 on success
  */
 int fsmSetup(FSM_t fsm, fileStage goal,
-       /*@kept@*/ const rpmTransactionSet ts,
-       /*@kept@*/ const TFI_t fi,
-       FD_t cfd,
-       /*@out@*/ unsigned int * archiveSize,
-       /*@out@*/ const char ** failedFile)
-               /*@modifies fsm, *archiveSize, *failedFile  @*/;
+               /*@kept@*/ const rpmTransactionSet ts,
+               /*@kept@*/ const TFI_t fi,
+               FD_t cfd,
+               /*@out@*/ unsigned int * archiveSize,
+               /*@out@*/ const char ** failedFile)
+       /*@modifies fsm, *archiveSize, *failedFile  @*/;
 
 /**
  * Clean file state machine.
@@ -218,35 +220,39 @@ int fsmSetup(FSM_t fsm, fileStage goal,
  * @return             0 on success
  */
 int fsmTeardown(FSM_t fsm)
-               /*@modifies fsm @*/;
+       /*@modifies fsm @*/;
 
+/*@-exportlocal@*/
 /**
  * Retrieve transaction set from file state machine iterator.
  * @param fsm          file state machine data
  * @return             transaction set
  */
-/*@kept@*/ rpmTransactionSet fsmGetTs(const FSM_t fsm) /*@*/;
+/*@kept@*/ rpmTransactionSet fsmGetTs(const FSM_t fsm)
+       /*@*/;
 
 /**
  * Retrieve transaction element file info from file state machine iterator.
  * @param fsm          file state machine data
  * @return             transaction element file info
  */
-/*@kept@*/ TFI_t fsmGetFi(const FSM_t fsm)     /*@*/;
+/*@kept@*/ TFI_t fsmGetFi(/*@partial@*/const FSM_t fsm)
+       /*@*/;
 
 /**
  * Map next file path and action.
  * @param fsm          file state machine data
  */
 int fsmMapPath(FSM_t fsm)
-               /*@modifies fsm @*/;
+       /*@modifies fsm @*/;
 
 /**
  * Map file stat(2) info.
  * @param fsm          file state machine data
  */
 int fsmMapAttrs(FSM_t fsm)
-               /*@modifies fsm @*/;
+       /*@modifies fsm @*/;
+/*@=exportlocal@*/
 
 /**
  * File state machine driver.
@@ -255,7 +261,7 @@ int fsmMapAttrs(FSM_t fsm)
  * @return             0 on success
  */
 int fsmStage(/*@partial@*/ FSM_t fsm, fileStage stage)
-               /*@modifies fsm @*/;
+       /*@modifies fsm @*/;
 
 #ifdef __cplusplus
 }
index d0032c0..db7fdea 100644 (file)
@@ -431,9 +431,11 @@ int headerGetEntryMinMemory(Header h, int_32 tag, /*@out@*/ int_32 *type,
  * @retval c           address of number of values
  * @return             1 on success, 0 on failure
  */
+/*@-exportlocal@*/
 int headerGetRawEntry(Header h, int_32 tag, /*@out@*/ int_32 *type,
        /*@out@*/ const void **p, /*@out@*/ int_32 *c)
                /*@modifies *type, *p, *c @*/;
+/*@=exportlocal@*/
 
 /** \ingroup header
  * Check if tag is in header.
@@ -495,6 +497,7 @@ void headerFreeIterator( /*@only@*/ HeaderIterator iter);
  * Sort tags in header.
  * @param h            header
  */
+/*@-exportlocal@*/
 void headerSort(Header h)
        /*@modifies h @*/;
 
@@ -504,6 +507,7 @@ void headerSort(Header h)
  */
 void headerUnsort(Header h)
        /*@modifies h @*/;
+/*@=exportlocal@*/
 
 /** \ingroup header
  * Duplicate tag values from one header into another.
index 7660cb4..c1480ec 100644 (file)
@@ -153,7 +153,7 @@ exit:
            /*@-unqualifiedtrans@*/av[i] = _free(av[i]); /*@=unqualifiedtrans@*/
        /*@-dependenttrans@*/ av = _free(av); /*@=dependenttrans@*/
     }
-    freeStringBuf(sb);
+    sb = freeStringBuf(sb);
     /*@-nullstate@*/
     return rc;
     /*@=nullstate@*/
index 114201f..3520155 100644 (file)
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -27,7 +27,9 @@ static union _mendian { int i; char b[4]; } *_endian = (union _mendian *)&_ie;
 #define        IS_BIG_ENDIAN()         (_endian->b[0] == '\x44')
 #define        IS_LITTLE_ENDIAN()      (_endian->b[0] == '\x11')
 
+/*@-exportlocal@*/
 void byteReverse(unsigned char *buf, unsigned longs);
+/*@=exportlocal@*/
 
 /*
  * Note: this code is harmless on little-endian machines.
index 1709d57..13d60cf 100644 (file)
--- a/lib/md5.h
+++ b/lib/md5.h
@@ -64,9 +64,9 @@ void rpmMD5Final(unsigned char digest[16], struct MD5Context *context);
  * @param buf          current MD5 variables
  * @param in           next block of data to add
  */
-/*@-fixedformalarray@*/
+/*@-fixedformalarray -exportlocal@*/
 void rpmMD5Transform(uint32 buf[4], uint32 const in[16]);
-/*@=fixedformalarray@*/
+/*@=fixedformalarray =exportlocal@*/
 
 /**
  * Return MD5 sum of file as ASCII string.
index a04ec56..022651d 100644 (file)
--- a/lib/psm.c
+++ b/lib/psm.c
@@ -1427,7 +1427,9 @@ assert(psm->mi == NULL);
            }
 
            /* Retrieve type of payload compression. */
+           /*@-nullstate@*/    /* FIX: psm->oh may be NULL */
            rc = psmStage(psm, PSM_RPMIO_FLAGS);
+           /*@=nullstate@*/
 
            /* Write the lead section into the package. */
            {   int archnum = -1;
@@ -1613,8 +1615,10 @@ assert(psm->mi == NULL);
            int_32 installTime = time(NULL);
 
            if (fi->fc > 0 && fi->fstates)
+               /*@-nullpass@*/         /* LCL: fi->fstates != NULL */
                (void) headerAddEntry(fi->h, RPMTAG_FILESTATES, RPM_CHAR_TYPE,
                                fi->fstates, fi->fc);
+               /*@=nullpass@*/
 
            (void) headerAddEntry(fi->h, RPMTAG_INSTALLTIME, RPM_INT32_TYPE,
                                &installTime, 1);
@@ -1712,7 +1716,8 @@ assert(psm->mi == NULL);
 
        if (psm->goal == PSM_PKGSAVE) {
            if (!rc)
-               rpmMessage(RPMMESS_VERBOSE, _("Wrote: %s\n"), psm->pkgURL);
+               rpmMessage(RPMMESS_VERBOSE, _("Wrote: %s\n"),
+                       (psm->pkgURL ? psm->pkgURL : "???"));
        }
 
        if (fi->h && (psm->goal == PSM_PKGERASE || psm->goal == PSM_PKGSAVE)) {
@@ -1857,5 +1862,7 @@ assert(psm->mi == NULL);
        break;
     }
 
+    /*@-nullstate@*/   /* FIX: psm->oh and psm->fi->h may be NULL. */
     return rc;
+    /*@=nullstate@*/
 }
index d6a1137..d78a927 100644 (file)
--- a/lib/psm.h
+++ b/lib/psm.h
@@ -56,7 +56,7 @@ struct transactionFileInfo_s {
 /*@owned@*/ const char ** flinks;      /*!< File link(s) (from header) */
 /* XXX setuid/setgid bits are turned off if fuser/fgroup doesn't map. */
     uint_16 * fmodes;          /*!< File mode(s) (from header) */
-/*@owned@*/ char * fstates;    /*!< File state(s) (from header) */
+/*@only@*/ /*@null@*/ char * fstates;  /*!< File state(s) (from header) */
 /*@owned@*/ const char ** fuser;       /*!< File owner(s) */
 /*@owned@*/ const char ** fgroup;      /*!< File group(s) */
 /*@owned@*/ const char ** flangs;      /*!< File lang(s) */
@@ -69,7 +69,7 @@ struct transactionFileInfo_s {
     unsigned int archiveSize;
     mode_t dperms;             /*!< Directory perms (0755) if not mapped. */
     mode_t fperms;             /*!< File perms (0644) if not mapped. */
-/*@owned@*/ const char ** apath;
+/*@only@*/ /*@null@*/ const char ** apath;
     int mapflags;
 /*@owned@*/ int * fmapflags;
     uid_t uid;
@@ -142,11 +142,11 @@ struct psm_s {
     FD_t cfd;                  /*!< Payload file handle. */
     FD_t fd;                   /*!< Repackage file handle. */
     Header oh;                 /*!< Repackage/multilib header. */
-    rpmdbMatchIterator mi;
+/*@null@*/ rpmdbMatchIterator mi;
 /*@observer@*/ const char * stepName;
-/*@owned@*/ const char * rpmio_flags;
-/*@owned@*/ const char * failedFile;
-/*@owned@*/ const char * pkgURL;       /*!< Repackage URL. */
+/*@only@*/ /*@null@*/ const char * rpmio_flags;
+/*@only@*/ /*@null@*/ const char * failedFile;
+/*@only@*/ /*@null@*/ const char * pkgURL;     /*!< Repackage URL. */
 /*@dependent@*/ const char * pkgfn;    /*!< Repackage file name. */
     int scriptTag;             /*!< Scriptlet data tag. */
     int progTag;               /*!< Scriptlet interpreter tag. */
@@ -187,7 +187,8 @@ void freeFi(TFI_t fi)
  * @param a            package dispostion
  * @return             formatted string
  */
-/*@observer@*/ const char *const fiTypeString(/*@partial@*/TFI_t fi);
+/*@observer@*/ const char *const fiTypeString(/*@partial@*/TFI_t fi)
+       /*@*/;
 
 /**
  * Package state machine driver.
@@ -195,7 +196,7 @@ void freeFi(TFI_t fi)
  * @param stage                next stage
  * @return             0 on success
  */
-int psmStage(/*@partial@*/ PSM_t psm, pkgStage stage)
+int psmStage(PSM_t psm, pkgStage stage)
        /*@modifies psm @*/;
 
 #ifdef __cplusplus
index 5bedc79..f8d1b97 100644 (file)
@@ -28,7 +28,9 @@ extern int _noDirTokens;
 static int _rebuildinprogress = 0;
 static int _db_filter_dups = 0;
 
+/*@-exportlocal@*/
 int _filterDbDups = 0; /* Filter duplicate entries ? (bug in pre rpm-3.0.4) */
+/*@=exportlocal@*/
 
 #define        _DBI_FLAGS      0
 #define        _DBI_PERMS      0644
@@ -723,7 +725,7 @@ int rpmdbSync(rpmdb rpmdb)
 }
 
 static /*@only@*/ rpmdb newRpmdb(/*@kept@*/ /*@null@*/ const char * root,
-               /*@kept@*/ const char * home,
+               /*@kept@*/ /*@null@*/ const char * home,
                int mode, int perms, int flags)
 {
     rpmdb rpmdb = xcalloc(sizeof(*rpmdb), 1);
index 5b5d541..a236891 100644 (file)
@@ -277,6 +277,7 @@ enum rpmdbFlags {
 extern "C" {
 #endif
 
+/*@-exportlocal@*/
 /** \ingroup db3
  * Return new configured index database handle instance.
  * @param rpmdb                rpm database
@@ -392,6 +393,7 @@ int dbiByteSwapped(dbiIndex dbi);
  * @return             base file name of db1 database
  */
 char * db1basename(int rpmtag);
+/*@=exportlocal@*/
 
 /** \ingroup rpmdb
  */
index 750c5da..717e987 100644 (file)
@@ -484,7 +484,7 @@ int rpmReadConfigFiles(/*@null@*/ const char * file,
  * @param file         colon separated files to read (NULL uses default)
  * @return             0 on succes
  */
-int rpmReadRC(const char * file);
+int rpmReadRC(/*@null@*/ const char * file);
 
 /** \ingroup rpmrc
  * Return current arch name and/or number.
@@ -912,7 +912,7 @@ typedef struct rpmRelocation_s {
  * @retval cooke       address of cookie pointer
  * @return             rpmRC return code
  */
-rpmRC rpmInstallSourcePackage(const char * root, FD_t fd,
+rpmRC rpmInstallSourcePackage(/*@null@*/ const char * root, FD_t fd,
                        /*@out@*/ const char ** specFile,
                        rpmCallbackFunction notify, rpmCallbackData notifyData,
                        /*@out@*/ char ** cookie)
index 0caf493..24698ba 100644 (file)
@@ -413,6 +413,7 @@ int rpmReadConfigFiles(const char * file, const char * target)
 {
 
     /* Preset target macros */
+    /*@-nullstate@*/   /* FIX: target can be NULL */
     rpmRebuildTargetVars(&target, NULL);
 
     /* Read the files */
@@ -420,6 +421,7 @@ int rpmReadConfigFiles(const char * file, const char * target)
 
     /* Reset target macros */
     rpmRebuildTargetVars(&target, NULL);
+    /*@=nullstate@*/
 
     /* Finally set target platform */
     {  const char *cpu = rpmExpand("%{_target_cpu}", NULL);
@@ -611,6 +613,7 @@ int rpmReadRC(const char * rcfiles)
     return rc;
 }
 
+/*@-usedef@*/  /*@ FIX: se usage inconsistent, W2DO? */
 static int doReadRC( /*@killref@*/ FD_t fd, const char * urlfn)
 {
     const char *s;
@@ -825,6 +828,7 @@ static int doReadRC( /*@killref@*/ FD_t fd, const char * urlfn)
 
     return 0;
 }
+/*@=usedef@*/
 
 #      if defined(__linux__) && defined(__i386__)
 #include <setjmp.h>
@@ -1385,7 +1389,7 @@ void rpmGetOsInfo(const char ** name, int * num) {
     getMachineInfo(OS, name, num);
 }
 
-void rpmRebuildTargetVars(const char **buildtarget, const char ** canontarget)
+void rpmRebuildTargetVars(const char ** buildtarget, const char ** canontarget)
 {
 
     char *ca = NULL, *co = NULL, *ct = NULL;
index 59d613d..4e88d21 100644 (file)
@@ -92,8 +92,8 @@ int rpmLookupSignatureType(int action)
  *  Return path to pgp executable of given type, or NULL when not found.
  */
 /*@null@*/ const char * rpmDetectPGPVersion(
-                       /*@null@*/ /*@out@*/ pgpVersion *pgpVersion)
-       /*@modifies *pgpVersion, fileSystem @*/;
+                       /*@null@*/ /*@out@*/ pgpVersion * pgpVer)
+       /*@modifies *pgpVer, fileSystem @*/;
 
 #ifdef __cplusplus
 }
index 203f869..c4324d1 100644 (file)
@@ -9,6 +9,13 @@
 
 #define BUF_CHUNK 1024
 
+struct StringBufRec {
+    /*@owned@*/ char *buf;
+    /*@dependent@*/ char *tail;     /* Points to first "free" char */
+    int allocated;
+    int free;
+};
+
 /**
  * Locale insensitive isspace(3).
  */
     return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v');
 }
 
-struct StringBufRec {
-    /*@owned@*/ char *buf;
-    /*@dependent@*/ char *tail;     /* Points to first "free" char */
-    int allocated;
-    int free;
-};
+/**
+ * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
+ * @param this         memory to free
+ * @retval             NULL always
+ */
+/*@unused@*/ static inline /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) {
+    if (this != NULL)  free((void *)this);
+    return NULL;
+}
 
 StringBuf newStringBuf(void)
 {
@@ -35,14 +45,13 @@ StringBuf newStringBuf(void)
     return sb;
 }
 
-void freeStringBuf(StringBuf sb)
+StringBuf freeStringBuf(StringBuf sb)
 {
-    if (! sb) {
-       return;
+    if (sb) {
+       sb->buf = _free(sb->buf);
+       sb = _free(sb);
     }
-    
-    free(sb->buf);
-    free(sb);
+    return sb;
 }
 
 void truncStringBuf(StringBuf sb)
@@ -64,7 +73,7 @@ void stripTrailingBlanksStringBuf(StringBuf sb)
     sb->tail[0] = '\0';
 }
 
-char *getStringBuf(StringBuf sb)
+char * getStringBuf(StringBuf sb)
 {
     return sb->buf;
 }
index cc48fac..c5a50eb 100644 (file)
@@ -19,7 +19,7 @@ extern "C" {
 
 /**
  */
-void freeStringBuf( /*@only@*/ StringBuf sb);
+/*@null@*/ StringBuf freeStringBuf( /*@only@*/ /*@null@*/ StringBuf sb);
 
 /**
  */
index 6e633db..b1dd2f4 100644 (file)
@@ -1142,7 +1142,7 @@ static void handleOverlappedFiles(TFI_t fi, hashTable ht,
            }
            if (XFA_SKIPPING(fi->actions[i]))
                break;
-           if (fi->fstates[i] != RPMFILE_STATE_NORMAL)
+           if (fi->fstates && fi->fstates[i] != RPMFILE_STATE_NORMAL)
                break;
            if (!(S_ISREG(fi->fmodes[i]) && (fi->fflags[i] & RPMFILE_CONFIG))) {
                fi->actions[i] = FA_ERASE;
index f302e5b..c0b3bb0 100644 (file)
@@ -331,7 +331,7 @@ static int verifyHeader(QVA_t qva, Header h)
     HGE_t hge = (HGE_t)headerGetEntryMinMemory;
     char buf[BUFSIZ];
     char * t, * te;
-
+    const char * prefix = (qva->qva_prefix ? qva->qva_prefix : "");
     const char ** fileNames = NULL;
     int count;
     int_32 * fileFlagsList = NULL;
@@ -355,7 +355,7 @@ static int verifyHeader(QVA_t qva, Header h)
     for (i = 0; i < count; i++) {
        int rc;
 
-       rc = rpmVerifyFile(qva->qva_prefix, h, i, &verifyResult, omitMask);
+       rc = rpmVerifyFile(prefix, h, i, &verifyResult, omitMask);
        if (rc) {
            sprintf(te, _("missing    %s"), fileNames[i]);
            te += strlen(te);
@@ -469,6 +469,7 @@ static int verifyDependencies(rpmdb rpmdb, Header h)
 
 int showVerifyPackage(QVA_t qva, rpmdb rpmdb, Header h)
 {
+    const char * prefix = (qva->qva_prefix ? qva->qva_prefix : "");
     FD_t fdo;
     int ec = 0;
     int rc;
@@ -481,7 +482,7 @@ int showVerifyPackage(QVA_t qva, rpmdb rpmdb, Header h)
            ec = rc;;
     fdo = fdDup(STDOUT_FILENO);
     if ((qva->qva_flags & VERIFY_SCRIPT) &&
-       (rc = rpmVerifyScript(qva->qva_prefix, h, fdo)) != 0)
+       (rc = rpmVerifyScript(prefix, h, fdo)) != 0)
            ec = rc;
     if (fdo)
        rc = Fclose(fdo);
index 81370f6..bf23f75 100644 (file)
@@ -1,4 +1,4 @@
--I. -I.. -DHAVE_CONFIG_H
+-I. -I./build -I./lib -I./rpmio -I./popt -DHAVE_CONFIG_H -D_GNU_SOURCE
 
 +partial
 
@@ -7,16 +7,17 @@
 
 +unixlib
 
+# XXX ignore doxygen markings
+-unrecogcomments
+
 # don't-bother-me-yet parameters
-#-branchstate
--mustfree
+#-branchstate          # painful
+-mustfree              # alloca is painful
 
 # not-yet normal parameters
 -boolops               # w->n
-#-null
 -predboolint           # w->n
--type
-
+-type                  #
 
 # -weak paramaters
 #+boolint
index e65762d..f8d51bd 100644 (file)
@@ -15,14 +15,16 @@ const char * findProgramPath(const char * argv0) {
     char * start, * chptr;
     char * buf;
 
+    if (argv0 == NULL) return NULL;    /* XXX can't happen */
     /* If there is a / in the argv[0], it has to be an absolute path */
     if (strchr(argv0, '/'))
        return xstrdup(argv0);
 
-    if (!path) return NULL;
+    if (path == NULL) return NULL;
 
     start = pathbuf = alloca(strlen(path) + 1);
     buf = malloc(strlen(path) + strlen(argv0) + sizeof("/"));
+    if (buf == NULL) return NULL;      /* XXX can't happen */
     strcpy(pathbuf, path);
 
     chptr = NULL;
index 2fe346d..1626ee5 100644 (file)
@@ -14,6 +14,6 @@
  * @param argv0                name of executable
  * @return             (malloc'd) absolute path to executable (or NULL)
  */
-/*@null@*/ const char * findProgramPath(const char * argv0);
+/*@null@*/ const char * findProgramPath(/*@null@*/ const char * argv0);
 
 #endif
index 168c46e..169c3a4 100644 (file)
@@ -30,21 +30,26 @@ static char * strerror(int errno) {
 }
 #endif
 
-void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) {
-    if (con->execPath) free((void *)con->execPath);
+void poptSetExecPath(poptContext con, const char * path, int allowAbsolute)
+{
+    con->execPath = _free(con->execPath);
     con->execPath = xstrdup(path);
     con->execAbsolute = allowAbsolute;
 }
 
 static void invokeCallbacksPRE(poptContext con, const struct poptOption * opt)
 {
+    if (opt != NULL)
     for (; opt->longName || opt->shortName || opt->arg; opt++) {
+       if (opt->arg == NULL) continue;         /* XXX program error. */
        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
            /* Recurse on included sub-tables. */
            invokeCallbacksPRE(con, opt->arg);
        } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK &&
                   (opt->argInfo & POPT_CBFLAG_PRE))
-       {   poptCallbackType cb = (poptCallbackType)opt->arg;
+       {   /*@-castfcnptr@*/
+           poptCallbackType cb = (poptCallbackType)opt->arg;
+           /*@=castfcnptr@*/
            /* Perform callback. */
            cb(con, POPT_CALLBACK_REASON_PRE, NULL, NULL, opt->descrip);
        }
@@ -53,13 +58,17 @@ static void invokeCallbacksPRE(poptContext con, const struct poptOption * opt)
 
 static void invokeCallbacksPOST(poptContext con, const struct poptOption * opt)
 {
+    if (opt != NULL)
     for (; opt->longName || opt->shortName || opt->arg; opt++) {
+       if (opt->arg == NULL) continue;         /* XXX program error. */
        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
            /* Recurse on included sub-tables. */
            invokeCallbacksPOST(con, opt->arg);
        } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK &&
                   (opt->argInfo & POPT_CBFLAG_POST))
-       {   poptCallbackType cb = (poptCallbackType)opt->arg;
+       {   /*@-castfcnptr@*/
+           poptCallbackType cb = (poptCallbackType)opt->arg;
+           /*@=castfcnptr@*/
            /* Perform callback. */
            cb(con, POPT_CALLBACK_REASON_POST, NULL, NULL, opt->descrip);
        }
@@ -69,14 +78,16 @@ static void invokeCallbacksPOST(poptContext con, const struct poptOption * opt)
 static void invokeCallbacksOPTION(poptContext con,
                                  const struct poptOption * opt,
                                  const struct poptOption * myOpt,
-                                 const void * myData, int shorty)
+                                 /*@null@*/ const void * myData, int shorty)
 {
     const struct poptOption * cbopt = NULL;
 
+    if (opt != NULL)
     for (; opt->longName || opt->shortName || opt->arg; opt++) {
        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
            /* Recurse on included sub-tables. */
-           invokeCallbacksOPTION(con, opt->arg, myOpt, myData, shorty);
+           if (opt->arg != NULL)       /* XXX program error */
+               invokeCallbacksOPTION(con, opt->arg, myOpt, myData, shorty);
        } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK &&
                  !(opt->argInfo & POPT_CBFLAG_SKIPOPTION)) {
            /* Save callback info. */
@@ -85,12 +96,17 @@ static void invokeCallbacksOPTION(poptContext con,
                   ((myOpt->shortName && opt->shortName && shorty &&
                        myOpt->shortName == opt->shortName) ||
                    (myOpt->longName && opt->longName &&
+               /*@-nullpass@*/         /* LCL: opt->longName != NULL */
                        !strcmp(myOpt->longName, opt->longName)))
+               /*@=nullpass@*/
                   )
-       {   poptCallbackType cb = (poptCallbackType)cbopt->arg;
+       {   /*@-castfcnptr@*/
+           poptCallbackType cb = (poptCallbackType)cbopt->arg;
+           /*@=castfcnptr@*/
            const void * cbData = (cbopt->descrip ? cbopt->descrip : myData);
            /* Perform callback. */
-           cb(con, POPT_CALLBACK_REASON_OPTION, myOpt,
+           if (cb != NULL)     /* XXX program error */
+               cb(con, POPT_CALLBACK_REASON_OPTION, myOpt,
                        con->os->nextArg, cbData);
            /* Terminate (unless explcitly continuing). */
            if (!(cbopt->argInfo & POPT_CBFLAG_CONTINUE))
@@ -104,18 +120,23 @@ poptContext poptGetContext(const char * name, int argc, const char ** argv,
 {
     poptContext con = malloc(sizeof(*con));
 
+    if (con == NULL) return NULL;      /* XXX can't happen */
     memset(con, 0, sizeof(*con));
 
     con->os = con->optionStack;
     con->os->argc = argc;
+    /*@-dependenttrans@*/      /* FIX: W2DO? */
     con->os->argv = argv;
+    /*@=dependenttrans@*/
     con->os->argb = NULL;
 
     if (!(flags & POPT_CONTEXT_KEEP_FIRST))
        con->os->next = 1;                      /* skip argv[0] */
 
     con->leftovers = calloc( (argc + 1), sizeof(char *) );
+    /*@-dependenttrans@*/      /* FIX: W2DO? */
     con->options = options;
+    /*@=dependenttrans@*/
     con->aliases = NULL;
     con->numAliases = 0;
     con->flags = flags;
@@ -130,7 +151,9 @@ poptContext poptGetContext(const char * name, int argc, const char ** argv,
        con->flags |= POPT_CONTEXT_POSIXMEHARDER;
 
     if (name)
+       /*@-nullpass@*/         /* FIX: malloc can return NULL. */
        con->appName = strcpy(malloc(strlen(name) + 1), name);
+       /*@=nullpass@*/
 
     invokeCallbacksPRE(con, con->options);
 
@@ -139,30 +162,20 @@ poptContext poptGetContext(const char * name, int argc, const char ** argv,
 
 static void cleanOSE(struct optionStackEntry *os)
 {
-    if (os->nextArg) {
-       free((void *)os->nextArg);
-       os->nextArg = NULL;
-    }
-    if (os->argv) {
-       free((void *)os->argv);
-       os->argv = NULL;
-    }
-    if (os->argb) {
-       PBM_FREE(os->argb);
-       os->argb = NULL;
-    }
+    os->nextArg = _free(os->nextArg);
+    os->argv = _free(os->argv);
+    os->argb = PBM_FREE(os->argb);
 }
 
-void poptResetContext(poptContext con) {
+void poptResetContext(poptContext con)
+{
     int i;
 
+    if (con == NULL) return;
     while (con->os > con->optionStack) {
        cleanOSE(con->os--);
     }
-    if (con->os->argb) {
-       PBM_FREE(con->os->argb);
-       con->os->argb = NULL;
-    }
+    con->os->argb = PBM_FREE(con->os->argb);
     con->os->currAlias = NULL;
     con->os->nextCharArg = NULL;
     con->os->nextArg = NULL;
@@ -173,25 +186,27 @@ void poptResetContext(poptContext con) {
     con->restLeftover = 0;
     con->doExec = NULL;
 
-    for (i = 0; i < con->finalArgvCount; i++) {
-       if (con->finalArgv[i]) {
-           free((void *)con->finalArgv[i]);
-           con->finalArgv[i] = NULL;
-       }
-    }
+    if (con->finalArgv != NULL)
+    for (i = 0; i < con->finalArgvCount; i++)
+       /*@-unqualifiedtrans@*/         /* FIX: typedef double indirection. */
+       con->finalArgv[i] = _free(con->finalArgv[i]);
+       /*@=unqualifiedtrans@*/
 
     con->finalArgvCount = 0;
-
-    if (con->arg_strip) {
-       PBM_FREE(con->arg_strip);
-       con->arg_strip = NULL;
-    }
+    con->arg_strip = PBM_FREE(con->arg_strip);
+    /*@-nullstate@*/   /* FIX: con->finalArgv != NULL */
+    return;
+    /*@=nullstate@*/
 }
 
 /* Only one of longName, shortName may be set at a time */
-static int handleExec(poptContext con, char * longName, char shortName) {
+static int handleExec(poptContext con, /*@null@*/ const char * longName,
+               char shortName)
+{
     int i;
 
+    if (con->execs == NULL || con->numExecs <= 0) /* XXX can't happen */
+       return 0;
     i = con->numExecs - 1;
     if (longName) {
        while (i >= 0 && (!con->execs[i].longName ||
@@ -220,29 +235,42 @@ static int handleExec(poptContext con, char * longName, char shortName) {
     }
 
     i = con->finalArgvCount++;
+    if (con->finalArgv != NULL)        /* XXX can't happen */
     {  char *s  = malloc((longName ? strlen(longName) : 0) + 3);
-       if (longName)
-           sprintf(s, "--%s", longName);
-       else
-           sprintf(s, "-%c", shortName);
-       con->finalArgv[i] = s;
+       if (s != NULL) {        /* XXX can't happen */
+           if (longName)
+               sprintf(s, "--%s", longName);
+           else
+               sprintf(s, "-%c", shortName);
+           con->finalArgv[i] = s;
+       } else
+           con->finalArgv[i] = NULL;
     }
 
+    /*@-nullstate@*/   /* FIX: con->finalArgv[] == NULL */
     return 1;
+    /*@=nullstate@*/
 }
 
 /* Only one of longName, shortName may be set at a time */
-static int handleAlias(poptContext con, const char * longName, char shortName,
-                      /*@keep@*/ const char * nextCharArg) {
+static int handleAlias(poptContext con,
+               /*@null@*/ const char * longName, char shortName,
+               /*@keep@*/ /*@null@*/ const char * nextCharArg)
+{
+    int rc;
     int i;
 
     if (con->os->currAlias && con->os->currAlias->longName && longName &&
+       /*@-nullpass@*/ /* LCL: con->os->currAlias->longName != NULL */
        !strcmp(con->os->currAlias->longName, longName))
+       /*@=nullpass@*/
        return 0;
     if (con->os->currAlias && shortName &&
            shortName == con->os->currAlias->shortName)
        return 0;
 
+    if (con->aliases == NULL || con->numAliases <= 0) /* XXX can't happen */
+       return 0;
     i = con->numAliases - 1;
     if (longName) {
        while (i >= 0 && (!con->aliases[i].longName ||
@@ -266,27 +294,34 @@ static int handleAlias(poptContext con, const char * longName, char shortName,
     con->os->nextArg = NULL;
     con->os->nextCharArg = NULL;
     con->os->currAlias = con->aliases + i;
-    poptDupArgv(con->os->currAlias->argc, con->os->currAlias->argv,
+    rc = poptDupArgv(con->os->currAlias->argc, con->os->currAlias->argv,
                &con->os->argc, &con->os->argv);
     con->os->argb = NULL;
 
-    return 1;
+    return (rc ? rc : 1);
 }
 
-static void execCommand(poptContext con) {
+static int execCommand(poptContext con)
+    /*@modifies fileSystem @*/
+{
     const char ** argv;
     int argc = 0;
     const char ** sargv;
     int sargc = 0;
+    int rc;
 
-    poptParseArgvString(con->doExec->script, &sargc, &sargv);
+    if (con->doExec == NULL || con->doExec->script == NULL) /*XXX can't happen*/
+       return POPT_ERROR_NOARG;
+    rc = poptParseArgvString(con->doExec->script, &sargc, &sargv);
+    if (rc) return rc;
 
     if (sargv == NULL || sargc < 1 ||
        (!con->execAbsolute && strchr(sargv[0], '/')))
-           return;
+           return POPT_ERROR_NOARG;
 
     argv = malloc(sizeof(*argv) *
                        (6 + sargc + con->numLeftovers + con->finalArgvCount));
+    if (argv == NULL) return POPT_ERROR_MALLOC;        /* XXX can't happen */
 
     if (!strchr(sargv[0], '/') && con->execPath) {
        char *s = alloca(strlen(con->execPath) + strlen(sargv[0]) + sizeof("/"));
@@ -295,17 +330,20 @@ static void execCommand(poptContext con) {
     } else {
        argv[argc] = findProgramPath(sargv[0]);
     }
-    if (argv[argc++] == NULL) return;
+    if (argv[argc++] == NULL) return POPT_ERROR_NOARG;
 
     if (sargc > 1) {
        memcpy(argv + argc, sargv + 1, sizeof(*argv) * (sargc - 1));
        argc += (sargc - 1);
     }
 
-    memcpy(argv + argc, con->finalArgv, sizeof(*argv) * con->finalArgvCount);
-    argc += con->finalArgvCount;
+    if (con->finalArgv != NULL && con->finalArgvCount > 0) {
+       memcpy(argv + argc, con->finalArgv,
+               sizeof(*argv) * con->finalArgvCount);
+       argc += con->finalArgvCount;
+    }
 
-    if (con->numLeftovers) {
+    if (con->leftovers != NULL && con->numLeftovers > 0) {
        argv[argc++] = "--";
        memcpy(argv + argc, con->leftovers, sizeof(*argv) * con->numLeftovers);
        argc += con->numLeftovers;
@@ -314,7 +352,7 @@ static void execCommand(poptContext con) {
     argv[argc++] = NULL;
 
 #ifdef __hpux
-    setresuid(getuid(), getuid(),-1);
+    (void) setresuid(getuid(), getuid(),-1);
 #else
 /*
  * XXX " ... on BSD systems setuid() should be preferred over setreuid()"
@@ -322,16 +360,16 @@ static void execCommand(poptContext con) {
  * XXX from Norbert Warmuth <nwarmuth@privat.circular.de>
  */
 #if defined(HAVE_SETUID)
-    setuid(getuid());
+    (void) setuid(getuid());
 #elif defined (HAVE_SETREUID)
-    setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */
+    (void) setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */
 #else
     ; /* Can't drop privileges */
 #endif
 #endif
 
     if (argv[0] == NULL)
-       return;
+       return POPT_ERROR_NOARG;
 #ifdef MYDEBUG
     {  const char ** arg;
        fprintf(stderr, "==> execvp(%s):", argv[0]);
@@ -341,19 +379,22 @@ static void execCommand(poptContext con) {
     }
 #endif
 
-    execvp(argv[0], (char *const *)argv);
+    (void) execvp(argv[0], (char *const *)argv);
+    return POPT_ERROR_ERRNO;
 }
 
-/*@observer@*/ static const struct poptOption *
-findOption(const struct poptOption * opt, const char * longName,
-    char shortName,
-    /*@out@*/ poptCallbackType * callback, /*@out@*/ const void ** callbackData,
-    int singleDash)
+/*@observer@*/ /*@null@*/ static const struct poptOption *
+findOption(const struct poptOption * opt, /*@null@*/ const char * longName,
+               char shortName,
+               /*@null@*/ /*@out@*/ poptCallbackType * callback,
+               /*@null@*/ /*@out@*/ const void ** callbackData,
+               int singleDash)
+       /*@modifies *callback, *callbackData */
 {
     const struct poptOption * cb = NULL;
 
     /* This happens when a single - is given */
-    if (singleDash && !shortName && !*longName)
+    if (singleDash && !shortName && (longName && *longName == '\0'))
        shortName = '-';
 
     for (; opt->longName || opt->shortName || opt->arg; opt++) {
@@ -361,19 +402,28 @@ findOption(const struct poptOption * opt, const char * longName,
        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
            const struct poptOption * opt2;
            /* Recurse on included sub-tables. */
+           if (opt->arg == NULL) continue;     /* XXX program error */
            opt2 = findOption(opt->arg, longName, shortName, callback,
                              callbackData, singleDash);
            if (opt2) {
                /* Sub-table data will be inheirited if no data yet. */
-               if (*callback && *callbackData == NULL)
+               /*@-nullderef@*/        /* LCL: *callback != NULL */
+               if (callback && *callback &&
+                       callbackData && *callbackData == NULL)
+                   /*@-observertrans -dependenttrans @*/
                    *callbackData = opt->descrip;
+                   /*@=observertrans =dependenttrans @*/
+               /*@=nullderef@*/
                return opt2;
            }
        } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) {
            cb = opt;
        } else if (longName && opt->longName &&
                   (!singleDash || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) &&
-                  !strcmp(longName, opt->longName)) {
+               /*@-nullpass@*/         /* LCL: opt->longName != NULL */
+                  !strcmp(longName, opt->longName))
+               /*@=nullpass@*/
+       {
            break;
        } else if (shortName && shortName == opt->shortName) {
            break;
@@ -382,18 +432,28 @@ findOption(const struct poptOption * opt, const char * longName,
 
     if (!opt->longName && !opt->shortName)
        return NULL;
-    *callbackData = NULL;
-    *callback = NULL;
+    /*@-modobserver -mods @*/
+    if (callback) *callback = NULL;
+    if (callbackData) *callbackData = NULL;
     if (cb) {
-       *callback = (poptCallbackType)cb->arg;
-       if (!(cb->argInfo & POPT_CBFLAG_INC_DATA))
-           *callbackData = cb->descrip;
+       if (callback)
+       /*@-castfcnptr@*/
+           *callback = (poptCallbackType)cb->arg;
+       /*@=castfcnptr@*/
+       if (!(cb->argInfo & POPT_CBFLAG_INC_DATA)) {
+           if (callbackData)
+               /*@-observertrans@*/    /* FIX: typedef double indirection. */
+               *callbackData = cb->descrip;
+               /*@=observertrans@*/
+       }
     }
+    /*@=modobserver =mods @*/
 
     return opt;
 }
 
-static const char *findNextArg(poptContext con, unsigned argx, int delete)
+static const char * findNextArg(poptContext con, unsigned argx, int delete)
+       /*@modifies con @*/
 {
     struct optionStackEntry * os = con->os;
     const char * arg;
@@ -403,6 +463,7 @@ static const char *findNextArg(poptContext con, unsigned argx, int delete)
        arg = NULL;
        while (os->next == os->argc && os > con->optionStack) os--;
        if (os->next == os->argc && os == con->optionStack) break;
+       if (os->argv != NULL)
        for (i = os->next; i < os->argc; i++) {
            if (os->argb && PBM_ISSET(i, os->argb)) continue;
            if (*os->argv[i] == '-') continue;
@@ -410,16 +471,21 @@ static const char *findNextArg(poptContext con, unsigned argx, int delete)
            arg = os->argv[i];
            if (delete) {
                if (os->argb == NULL) os->argb = PBM_ALLOC(os->argc);
+               if (os->argb != NULL)   /* XXX can't happen */
                PBM_SET(i, os->argb);
            }
            break;
        }
        if (os > con->optionStack) os--;
     } while (arg == NULL);
+    /*@-compdef@*/     /* FIX: con->os->argv undefined */
     return arg;
+    /*@=compdef@*/
 }
 
-static /*@only@*/ const char * expandNextArg(poptContext con, const char * s)
+static /*@only@*/ /*@null@*/ const char *
+expandNextArg(poptContext con, const char * s)
+       /*@modifies con @*/
 {
     const char *a;
     size_t alen;
@@ -428,6 +494,7 @@ static /*@only@*/ const char * expandNextArg(poptContext con, const char * s)
     char c;
 
     te = t = malloc(tn);;
+    if (t == NULL) return NULL;                /* XXX can't happen */
     while ((c = *s++) != '\0') {
        switch (c) {
 #if 0  /* XXX can't do this */
@@ -456,7 +523,7 @@ static /*@only@*/ const char * expandNextArg(poptContext con, const char * s)
        *te++ = c;
     }
     *te = '\0';
-    t = realloc(t, strlen(t)+1);       /* XXX memory leak, hard to plug */
+    t = realloc(t, strlen(t) + 1);     /* XXX memory leak, hard to plug */
     return t;
 }
 
@@ -464,10 +531,15 @@ static void poptStripArg(poptContext con, int which)
 {
     if (con->arg_strip == NULL)
        con->arg_strip = PBM_ALLOC(con->optionStack[0].argc);
+    if (con->arg_strip != NULL)                /* XXX can't happen */
     PBM_SET(which, con->arg_strip);
 }
 
-static int poptSaveLong(const struct poptOption * opt, long aLong) {
+static int poptSaveLong(const struct poptOption * opt, long aLong)
+{
+    if (opt->arg == NULL)
+       return POPT_ERROR_NULLARG;
+
     if (opt->argInfo & POPT_ARGFLAG_NOT)
        aLong = ~aLong;
     switch (opt->argInfo & POPT_ARGFLAG_LOGICALOPS) {
@@ -485,12 +557,16 @@ static int poptSaveLong(const struct poptOption * opt, long aLong) {
        break;
     default:
        return POPT_ERROR_BADOPERATION;
-       break;
+       /*@notreached@*/ break;
     }
     return 0;
 }
 
-static int poptSaveInt(const struct poptOption * opt, long aLong) {
+static int poptSaveInt(const struct poptOption * opt, long aLong)
+{
+    if (opt->arg == NULL)
+       return POPT_ERROR_NULLARG;
+
     if (opt->argInfo & POPT_ARGFLAG_NOT)
        aLong = ~aLong;
     switch (opt->argInfo & POPT_ARGFLAG_LOGICALOPS) {
@@ -508,7 +584,7 @@ static int poptSaveInt(const struct poptOption * opt, long aLong) {
        break;
     default:
        return POPT_ERROR_BADOPERATION;
-       break;
+       /*@notreached@*/ break;
     }
     return 0;
 }
@@ -533,6 +609,8 @@ int poptGetNextOpt(poptContext con)
     const struct poptOption * opt = NULL;
     int done = 0;
 
+    if (con == NULL)
+       return -1;
     while (!done) {
        const char * origOptString = NULL;
        poptCallbackType cb = NULL;
@@ -547,7 +625,7 @@ int poptGetNextOpt(poptContext con)
        }
        if (!con->os->nextCharArg && con->os->next == con->os->argc) {
            invokeCallbacksPOST(con, con->options);
-           if (con->doExec) execCommand(con);
+           if (con->doExec) return execCommand(con);
            return -1;
        }
 
@@ -561,9 +639,14 @@ int poptGetNextOpt(poptContext con)
                continue;
            }
            thisopt = con->os->next;
+           if (con->os->argv != NULL)  /* XXX can't happen */
            origOptString = con->os->argv[con->os->next++];
 
+           if (origOptString == NULL)  /* XXX can't happen */
+               return POPT_ERROR_BADOPT;
+
            if (con->restLeftover || *origOptString != '-') {
+               if (con->leftovers != NULL)     /* XXX can't happen */
                con->leftovers[con->numLeftovers++] = origOptString;
                if (con->flags & POPT_CONTEXT_POSIXMEHARDER)
                    con->restLeftover = 1;
@@ -572,10 +655,9 @@ int poptGetNextOpt(poptContext con)
 
            /* Make a copy we can hack at */
            localOptString = optString =
-                       strcpy(alloca(strlen(origOptString) + 1),
-                       origOptString);
+               strcpy(alloca(strlen(origOptString) + 1), origOptString);
 
-           if (!optString[0])
+           if (optString[0] == '\0')
                return POPT_ERROR_BADOPT;
 
            if (optString[1] == '-' && !optString[2]) {
@@ -626,6 +708,7 @@ int poptGetNextOpt(poptContext con)
 
        /* Process next short option */
        if (con->os->nextCharArg) {
+           /*@-branchstate@*/          /* FIX: W2DO? */
            origOptString = con->os->nextCharArg;
 
            con->os->nextCharArg = NULL;
@@ -637,7 +720,8 @@ int poptGetNextOpt(poptContext con)
            if (handleExec(con, NULL, *origOptString)) {
                /* Restore rest of short options for further processing */
                origOptString++;
-               if (*origOptString) con->os->nextCharArg = origOptString;
+               if (*origOptString != '\0')
+                   con->os->nextCharArg = origOptString;
                continue;
            }
 
@@ -648,9 +732,12 @@ int poptGetNextOpt(poptContext con)
            shorty = 1;
 
            origOptString++;
-           if (*origOptString) con->os->nextCharArg = origOptString;
+           if (*origOptString != '\0')
+               con->os->nextCharArg = origOptString;
+           /*@=branchstate@*/
        }
 
+       if (opt == NULL) return POPT_ERROR_BADOPT;      /* XXX can't happen */
        if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) {
            if (poptSaveInt(opt, 1L))
                return POPT_ERROR_BADOPERATION;
@@ -660,14 +747,17 @@ int poptGetNextOpt(poptContext con)
                    return POPT_ERROR_BADOPERATION;
            }
        } else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
-           if (con->os->nextArg) {
-               free((void *)con->os->nextArg);
-               con->os->nextArg = NULL;
-           }
+           con->os->nextArg = _free(con->os->nextArg);
+           /*@-usedef@*/       /* FIX: W2DO? */
            if (longArg) {
+           /*@=usedef@*/
+               /*@-evalorder@*/        /* FIX: W2DO? */
                con->os->nextArg = expandNextArg(con, longArg);
+               /*@=evalorder@*/
            } else if (con->os->nextCharArg) {
+               /*@-evalorder@*/        /* FIX: W2DO? */
                con->os->nextArg = expandNextArg(con, con->os->nextCharArg);
+               /*@=evalorder@*/
                con->os->nextCharArg = NULL;
            } else {
                while (con->os->next == con->os->argc &&
@@ -689,7 +779,11 @@ int poptGetNextOpt(poptContext con)
                        poptStripArg(con, con->os->next);
                    }
                
-                   con->os->nextArg = expandNextArg(con, con->os->argv[con->os->next++]);
+                   if (con->os->argv != NULL)  /* XXX can't happen */
+                   /*@-evalorder@*/    /* FIX: W2DO? */
+                   con->os->nextArg =
+                       expandNextArg(con, con->os->argv[con->os->next++]);
+                   /*@=evalorder@*/
                }
            }
 
@@ -732,24 +826,21 @@ int poptGetNextOpt(poptContext con)
 
                    if (con->os->nextArg) {
                        aDouble = strtod(con->os->nextArg, &end);
-                       if (*end)
+                       if (*end != '\0')
                            return POPT_ERROR_BADNUMBER;
                    }
 
-                   if (aDouble == +HUGE_VAL || aDouble == -HUGE_VAL)
+                   if ((aDouble - HUGE_VAL) < DBL_EPSILON ||
+                       (aDouble + HUGE_VAL) < DBL_EPSILON)
                        return POPT_ERROR_OVERFLOW;
-                   if (aDouble == 0.0 && errno == ERANGE)
+                   if ((aDouble - 0.0) < DBL_EPSILON && errno == ERANGE)
                        return POPT_ERROR_OVERFLOW;
                    if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_DOUBLE) {
                        *((double *) opt->arg) = aDouble;
                    } else {
-#ifdef ABS
-#undef ABS
-#endif
-#define ABS(a) (((a) < 0) ? -(a) : (a))
-                       if (ABS(aDouble) > FLT_MAX)
+                       if ((aDouble - FLT_MAX) > DBL_EPSILON)
                            return POPT_ERROR_OVERFLOW;
-                       if (ABS(aDouble) < FLT_MIN)
+                       if ((aDouble + FLT_MIN) > DBL_EPSILON)
                            return POPT_ERROR_OVERFLOW;
                        *((float *) opt->arg) = aDouble;
                    }
@@ -773,83 +864,107 @@ int poptGetNextOpt(poptContext con)
                            sizeof(*con->finalArgv) * con->finalArgvAlloced);
        }
 
+       if (con->finalArgv != NULL)
        {   char *s = malloc((opt->longName ? strlen(opt->longName) : 0) + 3);
-           if (opt->longName)
-               sprintf(s, "%s%s",
-                   ((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"),
-                   opt->longName);
-           else
-               sprintf(s, "-%c", opt->shortName);
-           con->finalArgv[con->finalArgvCount++] = s;
+           if (s != NULL) {    /* XXX can't happen */
+               if (opt->longName)
+                   sprintf(s, "%s%s",
+                       ((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"),
+                       opt->longName);
+               else
+                   sprintf(s, "-%c", opt->shortName);
+               con->finalArgv[con->finalArgvCount++] = s;
+           } else
+               con->finalArgv[con->finalArgvCount++] = NULL;
        }
 
        if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE)
-           /*@-ifempty@*/ ;
+           /*@-ifempty@*/ ; /*@=ifempty@*/
        else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL)
-           /*@-ifempty@*/ ;
+           /*@-ifempty@*/ ; /*@=ifempty@*/
        else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) {
-           if (con->os->nextArg)
+           if (con->finalArgv != NULL && con->os->nextArg)
                con->finalArgv[con->finalArgvCount++] =
+                       /*@-nullpass@*/ /* LCL: con->os->nextArg != NULL */
                        xstrdup(con->os->nextArg);
+                       /*@=nullpass@*/
        }
     }
 
-    return opt->val;
+    return (opt ? opt->val : -1);      /* XXX can't happen */
 }
 
-const char * poptGetOptArg(poptContext con) {
-    const char * ret = con->os->nextArg;
-    con->os->nextArg = NULL;
+const char * poptGetOptArg(poptContext con)
+{
+    const char * ret = NULL;
+    if (con) {
+       ret = con->os->nextArg;
+       con->os->nextArg = NULL;
+    }
     return ret;
 }
 
-const char * poptGetArg(poptContext con) {
-    const char * ret = (con->nextLeftover < con->numLeftovers)
-       ? con->leftovers[con->nextLeftover++] : NULL;
+const char * poptGetArg(poptContext con)
+{
+    const char * ret = NULL;
+    if (con && con->leftovers != NULL && con->nextLeftover < con->numLeftovers)
+       ret = con->leftovers[con->nextLeftover++];
     return ret;
 }
 
-const char * poptPeekArg(poptContext con) {
-    const char * ret = (con->nextLeftover < con->numLeftovers)
-       ? con->leftovers[con->nextLeftover] : NULL;
+const char * poptPeekArg(poptContext con)
+{
+    const char * ret = NULL;
+    if (con && con->leftovers != NULL && con->nextLeftover < con->numLeftovers)
+       ret = con->leftovers[con->nextLeftover];
     return ret;
 }
 
-const char ** poptGetArgs(poptContext con) {
-    if (con->numLeftovers == con->nextLeftover) return NULL;
+const char ** poptGetArgs(poptContext con)
+{
+    if (con == NULL ||
+       con->leftovers == NULL || con->numLeftovers == con->nextLeftover)
+       return NULL;
 
     /* some apps like [like RPM ;-) ] need this NULL terminated */
     con->leftovers[con->numLeftovers] = NULL;
 
+    /*@-nullret -nullstate @*/ /* FIX: typedef double indirection. */
     return (con->leftovers + con->nextLeftover);
+    /*@=nullret =nullstate @*/
 }
 
-void poptFreeContext(poptContext con) {
+poptContext poptFreeContext(poptContext con)
+{
     int i;
 
+    if (con == NULL) return con;
     poptResetContext(con);
-    if (con->os->argb) free(con->os->argb);
+    con->os->argb = _free(con->os->argb);
 
+    if (con->aliases != NULL)
     for (i = 0; i < con->numAliases; i++) {
-       if (con->aliases[i].longName) free((void *)con->aliases[i].longName);
-       free(con->aliases[i].argv);
+       con->aliases[i].longName = _free(con->aliases[i].longName);
+       con->aliases[i].argv = _free(con->aliases[i].argv);
     }
 
+    if (con->execs != NULL)
     for (i = 0; i < con->numExecs; i++) {
-       if (con->execs[i].longName) free((void *)con->execs[i].longName);
-       free((void *)con->execs[i].script);
+       con->execs[i].longName = _free(con->execs[i].longName);
+       con->execs[i].script = _free(con->execs[i].script);
     }
-    if (con->execs) free((void *)con->execs);
-
-    free(con->leftovers);
-    free(con->finalArgv);
-    if (con->appName) free((void *)con->appName);
-    if (con->aliases) free(con->aliases);
-    if (con->otherHelp) free((void *)con->otherHelp);
-    if (con->execPath) free((void *)con->execPath);
-    if (con->arg_strip) PBM_FREE(con->arg_strip);
+    con->execs = _free(con->execs);
+
+    con->leftovers = _free(con->leftovers);
+    con->finalArgv = _free(con->finalArgv);
+    con->appName = _free(con->appName);
+    con->aliases = _free(con->aliases);
+    con->otherHelp = _free(con->otherHelp);
+    con->execPath = _free(con->execPath);
+    con->arg_strip = PBM_FREE(con->arg_strip);
     
-    free(con);
+    con = _free(con);
+    return con;
 }
 
 int poptAddAlias(poptContext con, struct poptAlias newAlias,
@@ -867,7 +982,9 @@ int poptAddAlias(poptContext con, struct poptAlias newAlias,
     alias = con->aliases + aliasNum;
 
     alias->longName = (newAlias.longName)
+       /*@-nullpass@*/         /* FIX: malloc can return NULL. */
        ? strcpy(malloc(strlen(newAlias.longName) + 1), newAlias.longName)
+       /*@=nullpass@*/
        : NULL;
     alias->shortName = newAlias.shortName;
     alias->argc = newAlias.argc;
@@ -876,18 +993,20 @@ int poptAddAlias(poptContext con, struct poptAlias newAlias,
     return 0;
 }
 
-const char * poptBadOption(poptContext con, int flags) {
-    struct optionStackEntry * os;
+const char * poptBadOption(poptContext con, int flags)
+{
+    struct optionStackEntry * os = NULL;
 
-    if (flags & POPT_BADOPTION_NOALIAS)
-       os = con->optionStack;
-    else
-       os = con->os;
+    if (con != NULL)
+       os = (flags & POPT_BADOPTION_NOALIAS) ? con->optionStack : con->os;
 
-    return os->argv[os->next - 1];
+    /*@-nullderef@*/   /* LCL: os->argv != NULL */
+    return (os && os->argv ? os->argv[os->next - 1] : NULL);
+    /*@=nullderef@*/
 }
 
-const char *const poptStrerror(const int error) {
+const char *const poptStrerror(const int error)
+{
     switch (error) {
       case POPT_ERROR_NOARG:
        return POPT_("missing argument");
@@ -895,6 +1014,8 @@ const char *const poptStrerror(const int error) {
        return POPT_("unknown option");
       case POPT_ERROR_BADOPERATION:
        return POPT_("mutually exclusive logical operations requested");
+      case POPT_ERROR_NULLARG:
+       return POPT_("opt->arg should not be NULL");
       case POPT_ERROR_OPTSTOODEEP:
        return POPT_("aliases nested too deeply");
       case POPT_ERROR_BADQUOTE:
@@ -903,6 +1024,8 @@ const char *const poptStrerror(const int error) {
        return POPT_("invalid numeric value");
       case POPT_ERROR_OVERFLOW:
        return POPT_("number too large or too small");
+      case POPT_ERROR_MALLOC:
+       return POPT_("memory allocation failed");
       case POPT_ERROR_ERRNO:
        return strerror(errno);
       default:
@@ -910,8 +1033,10 @@ const char *const poptStrerror(const int error) {
     }
 }
 
-int poptStuffArgs(poptContext con, const char ** argv) {
+int poptStuffArgs(poptContext con, const char ** argv)
+{
     int argc;
+    int rc;
 
     if ((con->os - con->optionStack) == POPT_OPTION_DEPTH)
        return POPT_ERROR_OPTSTOODEEP;
@@ -924,30 +1049,34 @@ int poptStuffArgs(poptContext con, const char ** argv) {
     con->os->nextArg = NULL;
     con->os->nextCharArg = NULL;
     con->os->currAlias = NULL;
-    poptDupArgv(argc, argv, &con->os->argc, &con->os->argv);
+    rc = poptDupArgv(argc, argv, &con->os->argc, &con->os->argv);
     con->os->argb = NULL;
     con->os->stuffed = 1;
 
-    return 0;
+    return rc;
 }
 
-const char * poptGetInvocationName(poptContext con) {
-    return con->os->argv[0];
+const char * poptGetInvocationName(poptContext con)
+{
+    return (con->os->argv ? con->os->argv[0] : "");
 }
 
-int poptStrippedArgv(poptContext con, int argc, char **argv)
+int poptStrippedArgv(poptContext con, int argc, char ** argv)
 {
-    int i,j=1, numargs=argc;
+    int numargs = argc;
+    int j = 1;
+    int i;
     
+    if (con->arg_strip)
     for (i = 1; i < argc; i++) {
        if (PBM_ISSET(i, con->arg_strip))
            numargs--;
     }
     
     for (i = 1; i < argc; i++) {
-       if (PBM_ISSET(i, con->arg_strip))
+       if (con->arg_strip && PBM_ISSET(i, con->arg_strip))
            continue;
-       argv[j] = (j < numargs) ? argv[i] : '\0';
+       argv[j] = (j < numargs) ? argv[i] : NULL;
        j++;
     }
     
index 70bb408..b74f7d8 100644 (file)
@@ -84,6 +84,8 @@ extern "C" {
 #define POPT_ERROR_BADNUMBER   -17     /*!< invalid numeric value */
 #define POPT_ERROR_OVERFLOW    -18     /*!< number too large or too small */
 #define        POPT_ERROR_BADOPERATION -19     /*!< mutually exclusive logical operations requested */
+#define        POPT_ERROR_NULLARG      -20     /*!< opt->arg should not be NULL */
+#define        POPT_ERROR_MALLOC       -21     /*!< memory allocation failed */
 /*@}*/
 
 /** \ingroup popt
@@ -110,8 +112,8 @@ struct poptOption {
     int argInfo;
 /*@shared@*/ /*@null@*/ void * arg;    /*!< depends on argInfo */
     int val;                   /*!< 0 means don't return, just update flag */
-/*@shared@*/ /*@null@*/ const char * descrip;  /*!< description for autohelp -- may be NULL */
-/*@shared@*/ /*@null@*/ const char * argDescrip; /*!< argument description for autohelp */
+/*@observer@*/ /*@null@*/ const char * descrip;        /*!< description for autohelp -- may be NULL */
+/*@observer@*/ /*@null@*/ const char * argDescrip; /*!< argument description for autohelp */
 };
 
 /** \ingroup popt
@@ -135,7 +137,7 @@ extern struct poptOption poptHelpOptions[];
 
 /** \ingroup popt
  */
-typedef struct poptContext_s * poptContext;
+typedef /*@abstract@*/ struct poptContext_s * poptContext;
 
 /** \ingroup popt
  */
@@ -156,9 +158,10 @@ enum poptCallbackReason { POPT_CALLBACK_REASON_PRE,
  * @param data         @todo Document.
  */
 typedef void (*poptCallbackType) (poptContext con, 
-                                enum poptCallbackReason reason,
-                                const struct poptOption * opt,
-                                const char * arg, const void * data);
+               enum poptCallbackReason reason,
+               /*@null@*/ const struct poptOption * opt,
+               /*@null@*/ const char * arg,
+               /*@null@*/ const void * data);
 
 /** \ingroup popt
  * Initialize popt context.
@@ -169,7 +172,7 @@ typedef void (*poptCallbackType) (poptContext con,
  * @param flags                or'd POPT_CONTEXT_* bits
  * @return             initialized popt context
  */
-/*@only@*/ poptContext poptGetContext(
+/*@only@*/ /*@null@*/ poptContext poptGetContext(
                /*@dependent@*/ /*@keep@*/ const char * name,
                int argc, /*@dependent@*/ /*@keep@*/ const char ** argv,
                /*@dependent@*/ /*@keep@*/ const struct poptOption * options,
@@ -179,54 +182,55 @@ typedef void (*poptCallbackType) (poptContext con,
  * Reinitialize popt context.
  * @param con          context
  */
-void poptResetContext(poptContext con);
+void poptResetContext(/*@null@*/poptContext con);
 
 /** \ingroup popt
  * Return value of next option found.
  * @param con          context
  * @return             next option val, -1 on last item, POPT_ERROR_* on error
  */
-int poptGetNextOpt(poptContext con);
+int poptGetNextOpt(/*@null@*/poptContext con);
 /* returns NULL if no argument is available */
 
 /** \ingroup popt
  * @param con          context
  */
-/*@observer@*/ /*@null@*/ const char * poptGetOptArg(poptContext con);
+/*@observer@*/ /*@null@*/ const char * poptGetOptArg(/*@null@*/poptContext con);
 
 /** \ingroup popt
  * Return current option's argument.
  * @param con          context
  * @return             option argument, NULL if no more options are available
  */
-/*@observer@*/ /*@null@*/ const char * poptGetArg(poptContext con);
+/*@observer@*/ /*@null@*/ const char * poptGetArg(/*@null@*/poptContext con);
 
 /** \ingroup popt
  * Peek at  current option's argument.
  * @param con          context
  * @return             option argument
  */
-/*@observer@*/ /*@null@*/ const char * poptPeekArg(poptContext con);
+/*@observer@*/ /*@null@*/ const char * poptPeekArg(/*@null@*/poptContext con);
 
 /** \ingroup popt
  * Return remaining arguments.
  * @param con          context
  * @return             argument array, terminated with NULL
  */
-/*@observer@*/ /*@null@*/ const char ** poptGetArgs(poptContext con);
+/*@observer@*/ /*@null@*/ const char ** poptGetArgs(/*@null@*/poptContext con);
 
 /** \ingroup popt
  * Return the option which caused the most recent error.
  * @param con          context
  * @return             offending option
  */
-/*@observer@*/ const char * poptBadOption(poptContext con, int flags);
+/*@observer@*/ const char * poptBadOption(/*@null@*/poptContext con, int flags);
 
 /** \ingroup popt
  * Destroy context.
  * @param con          context
+ * @return             NULL
  */
-void poptFreeContext( /*@only@*/ poptContext con);
+/*@null@*/ poptContext poptFreeContext( /*@only@*/ /*@null@*/ poptContext con);
 
 /** \ingroup popt
  * Add arguments to context.
@@ -252,7 +256,9 @@ int poptAddAlias(poptContext con, struct poptAlias alias, int flags);
  * @param fn           file name to read
  * @return             0 on success, POPT_ERROR_ERRNO on failure
  */
-int poptReadConfigFile(poptContext con, const char * fn);
+int poptReadConfigFile(poptContext con, const char * fn)
+       /*@modifies fileSystem,
+               con->execs, con->numExecs @*/;
 
 /** \ingroup popt
  * Read default configuration from /etc/popt and $HOME/.popt.
@@ -260,7 +266,9 @@ int poptReadConfigFile(poptContext con, const char * fn);
  * @param useEnv       (unused)
  * @return             0 on success, POPT_ERROR_ERRNO on failure
  */
-int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv);
+int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv)
+       /*@modifies fileSystem,
+               con->execs, con->numExecs @*/;
 
 /** \ingroup popt
  * Duplicate an argument array.
@@ -273,8 +281,10 @@ int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv);
  * @retval argvPtr     address of returned argument array
  * @return             0 on success, POPT_ERROR_NOARG on failure
  */
-int poptDupArgv(int argc, const char **argv,
-               /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr);
+int poptDupArgv(int argc, /*@null@*/ const char **argv,
+               /*@null@*/ /*@out@*/ int * argcPtr,
+               /*@null@*/ /*@out@*/ const char *** argvPtr)
+       /*@modifies *argcPtr, *argvPtr @*/;
 
 /** \ingroup popt
  * Parse a string into an argument array.
@@ -288,14 +298,16 @@ int poptDupArgv(int argc, const char **argv,
  * @retval argvPtr     address of returned argument array
  */
 int poptParseArgvString(const char * s,
-               /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr);
+               /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr)
+       /*@modifies *argcPtr, *argvPtr @*/;
 
 /** \ingroup popt
  * Return formatted error string for popt failure.
  * @param error                popt error
  * @return             error string
  */
-/*@observer@*/ const char *const poptStrerror(const int error);
+/*@observer@*/ const char *const poptStrerror(const int error)
+       /*@*/;
 
 /** \ingroup popt
  * Limit search for executables.
@@ -339,7 +351,7 @@ void poptSetOtherOptionHelp(poptContext con, const char * text);
  * @param con          context
  * @return             new argc
  */
-int poptStrippedArgv(poptContext con, int argc, char **argv);
+int poptStrippedArgv(poptContext con, int argc, char ** argv);
 
 #ifdef  __cplusplus
 }
index 0cfd1a1..d518646 100644 (file)
@@ -9,30 +9,33 @@
 #include "system.h"
 #include "poptint.h"
 
-static void configLine(poptContext con, char * line) {
+static void configLine(poptContext con, char * line)
+       /*@modifies *line,
+               con->execs, con->numExecs @*/
+{
     int nameLength = strlen(con->appName);
-    char * opt;
+    const char * opt;
     struct poptAlias alias;
-    char * entryType;
-    char * longName = NULL;
+    const char * entryType;
+    const char * longName = NULL;
     char shortName = '\0';
     
     if (strncmp(line, con->appName, nameLength)) return;
     line += nameLength;
-    if (!*line || !isspace(*line)) return;
-    while (*line && isspace(*line)) line++;
+    if (*line == '\0' || !isspace(*line)) return;
+    while (*line != '\0' && isspace(*line)) line++;
     entryType = line;
 
-    while (!*line || !isspace(*line)) line++;
+    while (*line == '\0' || !isspace(*line)) line++;
     *line++ = '\0';
-    while (*line && isspace(*line)) line++;
-    if (!*line) return;
+    while (*line != '\0' && isspace(*line)) line++;
+    if (*line == '\0') return;
     opt = line;
 
-    while (!*line || !isspace(*line)) line++;
+    while (*line == '\0' || !isspace(*line)) line++;
     *line++ = '\0';
-    while (*line && isspace(*line)) line++;
-    if (!*line) return;
+    while (*line != '\0' && isspace(*line)) line++;
+    if (*line == '\0') return;
 
     if (opt[0] == '-' && opt[1] == '-')
        longName = opt + 2;
@@ -42,10 +45,11 @@ static void configLine(poptContext con, char * line) {
     if (!strcmp(entryType, "alias")) {
        if (poptParseArgvString(line, &alias.argc, &alias.argv)) return;
        alias.longName = longName, alias.shortName = shortName;
-       poptAddAlias(con, alias, 0);
+       (void) poptAddAlias(con, alias, 0);
     } else if (!strcmp(entryType, "exec")) {
        con->execs = realloc(con->execs,
                                sizeof(*con->execs) * (con->numExecs + 1));
+       if (con->execs == NULL) return; /* XXX can't happen */
        if (longName)
            con->execs[con->numExecs].longName = xstrdup(longName);
        else
@@ -54,13 +58,17 @@ static void configLine(poptContext con, char * line) {
        con->execs[con->numExecs].shortName = shortName;
        con->execs[con->numExecs].script = xstrdup(line);
        
+       /*@-noeffect@*/         /* LCL: broken? */
        con->numExecs++;
+       /*@=noeffect@*/
     }
 }
 
-int poptReadConfigFile(poptContext con, const char * fn) {
-    char * file, * chptr, * end;
-    char * buf, * dst;
+int poptReadConfigFile(poptContext con, const char * fn)
+{
+    const char * file, * chptr, * end;
+    char * buf;
+/*@dependent@*/ char * dst;
     int fd, rc;
     int fileLength;
 
@@ -76,27 +84,27 @@ int poptReadConfigFile(poptContext con, const char * fn) {
     (void) lseek(fd, 0, 0);
 
     file = alloca(fileLength + 1);
-    if (read(fd, file, fileLength) != fileLength) {
+    if (read(fd, (char *)file, fileLength) != fileLength) {
        rc = errno;
-       close(fd);
+       (void) close(fd);
        errno = rc;
        return POPT_ERROR_ERRNO;
     }
-    close(fd);
+    (void) close(fd);
 
     dst = buf = alloca(fileLength + 1);
 
     chptr = file;
     end = (file + fileLength);
+    /*@-infloops@*/    /* LCL: can't detect chptr++ */
     while (chptr < end) {
        switch (*chptr) {
          case '\n':
            *dst = '\0';
            dst = buf;
            while (*dst && isspace(*dst)) dst++;
-           if (*dst && *dst != '#') {
+           if (*dst && *dst != '#')
                configLine(con, dst);
-           }
            chptr++;
            break;
          case '\\':
@@ -114,6 +122,7 @@ int poptReadConfigFile(poptContext con, const char * fn) {
            break;
        }
     }
+    /*@=infloops@*/
 
     return 0;
 }
@@ -138,4 +147,3 @@ int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv) {
 
     return 0;
 }
-
index a76b03c..086cd43 100644 (file)
@@ -23,31 +23,33 @@ static void displayArgs(poptContext con,
     exit(0);
 }
 
+/*@-castfcnptr@*/
 struct poptOption poptHelpOptions[] = {
     { NULL, '\0', POPT_ARG_CALLBACK, (void *)&displayArgs, '\0', NULL, NULL },
     { "help", '?', 0, NULL, '?', N_("Show this help message"), NULL },
     { "usage", '\0', 0, NULL, 'u', N_("Display brief usage message"), NULL },
     POPT_TABLEEND
 } ;
-
+/*@=castfcnptr@*/
 
 /*@observer@*/ /*@null@*/ static const char *const
-getTableTranslationDomain(const struct poptOption *table)
+getTableTranslationDomain(/*@null@*/ const struct poptOption *table)
 {
-  const struct poptOption *opt;
-
-  for(opt = table;
-      opt->longName || opt->shortName || opt->arg;
-      opt++) {
-    if(opt->argInfo == POPT_ARG_INTL_DOMAIN)
-      return opt->arg;
-  }
+    const struct poptOption *opt;
 
-  return NULL;
+    if (table != NULL)
+    for (opt = table; opt->longName || opt->shortName || opt->arg; opt++) {
+       if (opt->argInfo == POPT_ARG_INTL_DOMAIN)
+           return opt->arg;
+    }
+    return NULL;
 }
 
 /*@observer@*/ /*@null@*/ static const char *const
-getArgDescrip(const struct poptOption * opt, const char *translation_domain)
+getArgDescrip(const struct poptOption * opt,
+               /*@-paramuse@*/         /* FIX: wazzup? */
+               /*@null@*/ const char * translation_domain)
+               /*@=paramuse@*/
 {
     if (!(opt->argInfo & POPT_ARG_MASK)) return NULL;
 
@@ -69,8 +71,8 @@ getArgDescrip(const struct poptOption * opt, const char *translation_domain)
 }
 
 static void singleOptionHelp(FILE * f, int maxLeftCol, 
-                            const struct poptOption * opt,
-                            const char *translation_domain)
+               const struct poptOption * opt,
+               /*@null@*/ const char *translation_domain)
 {
     int indentLength = maxLeftCol + 5;
     int lineLength = 79 - indentLength;
@@ -85,13 +87,15 @@ static void singleOptionHelp(FILE * f, int maxLeftCol,
     if (argDescrip)    nb += strlen(argDescrip);
 
     left = malloc(nb);
-    left[0] = left[maxLeftCol] = '\0';
+    if (left == NULL) return;  /* XXX can't happen */
+    left[0] = '\0';
+    left[maxLeftCol] = '\0';
 
     if (opt->longName && opt->shortName)
        sprintf(left, "-%c, %s%s", opt->shortName,
                ((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"),
                opt->longName);
-    else if (opt->shortName) 
+    else if (opt->shortName != '\0'
        sprintf(left, "-%c", opt->shortName);
     else if (opt->longName)
        sprintf(left, "%s%s",
@@ -113,11 +117,11 @@ static void singleOptionHelp(FILE * f, int maxLeftCol,
                if (opt->argInfo & POPT_ARGFLAG_NOT) aLong = ~aLong;
                switch (opt->argInfo & POPT_ARGFLAG_LOGICALOPS) {
                case POPT_ARGFLAG_OR:
-                   sprintf(le, "[|=0x%lx]", aLong);    break;
+                   sprintf(le, "[|=0x%lx]", (unsigned long)aLong);     break;
                case POPT_ARGFLAG_AND:
-                   sprintf(le, "[&=0x%lx]", aLong);    break;
+                   sprintf(le, "[&=0x%lx]", (unsigned long)aLong);     break;
                case POPT_ARGFLAG_XOR:
-                   sprintf(le, "[^=0x%lx]", aLong);    break;
+                   sprintf(le, "[^=0x%lx]", (unsigned long)aLong);     break;
                default:
                    if (!(aLong == 0L || aLong == 1L || aLong == -1L))
                        sprintf(le, "[=%ld]", aLong);
@@ -173,20 +177,22 @@ out:
 }
 
 static int maxArgWidth(const struct poptOption * opt,
-                      const char * translation_domain)
+                      /*@null@*/ const char * translation_domain)
 {
     int max = 0;
-    int this;
+    int this = 0;
     const char * s;
     
+    if (opt != NULL)
     while (opt->longName || opt->shortName || opt->arg) {
        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
+           if (opt->arg)       /* XXX program error */
            this = maxArgWidth(opt->arg, translation_domain);
            if (this > max) max = this;
        } else if (!(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) {
            this = sizeof("  ")-1;
-           if (opt->shortName) this += sizeof("-X")-1;
-           if (opt->shortName && opt->longName) this += sizeof(", ")-1;
+           if (opt->shortName != '\0') this += sizeof("-X")-1;
+           if (opt->shortName != '\0' && opt->longName) this += sizeof(", ")-1;
            if (opt->longName) {
                this += ((opt->argInfo & POPT_ARGFLAG_ONEDASH)
                        ? sizeof("-")-1 : sizeof("--")-1);
@@ -206,23 +212,25 @@ static int maxArgWidth(const struct poptOption * opt,
     return max;
 }
 
-static void singleTableHelp(FILE * f, const struct poptOption * table, 
-                           int left,
-                           const char *translation_domain)
+static void singleTableHelp(FILE * f,
+               /*@null@*/ const struct poptOption * table, int left,
+               /*@null@*/ const char * translation_domain)
 {
     const struct poptOption * opt;
     const char *sub_transdom;
 
+    if (table != NULL)
     for (opt = table; (opt->longName || opt->shortName || opt->arg); opt++) {
        if ((opt->longName || opt->shortName) && 
            !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
            singleOptionHelp(f, left, opt, translation_domain);
     }
 
+    if (table != NULL)
     for (opt = table; (opt->longName || opt->shortName || opt->arg); opt++) {
        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
            sub_transdom = getTableTranslationDomain(opt->arg);
-           if(!sub_transdom)
+           if (sub_transdom == NULL)
                sub_transdom = translation_domain;
            
            if (opt->descrip)
@@ -240,7 +248,10 @@ static int showHelpIntro(poptContext con, FILE * f)
 
     fprintf(f, POPT_("Usage:"));
     if (!(con->flags & POPT_CONTEXT_KEEP_FIRST)) {
+       /*@-nullderef@*/        /* LCL: wazzup? */
        fn = con->optionStack->argv[0];
+       /*@=nullderef@*/
+       if (fn == NULL) return len;
        if (strchr(fn, '/')) fn = strrchr(fn, '/') + 1;
        fprintf(f, " %s", fn);
        len += strlen(fn) + 1;
@@ -253,7 +264,7 @@ void poptPrintHelp(poptContext con, FILE * f, /*@unused@*/ int flags)
 {
     int leftColWidth;
 
-    showHelpIntro(con, f);
+    (void) showHelpIntro(con, f);
     if (con->otherHelp)
        fprintf(f, " %s\n", con->otherHelp);
     else
@@ -264,15 +275,15 @@ void poptPrintHelp(poptContext con, FILE * f, /*@unused@*/ int flags)
 }
 
 static int singleOptionUsage(FILE * f, int cursor, 
-                            const struct poptOption * opt,
-                            const char *translation_domain)
+               const struct poptOption * opt,
+               /*@null@*/ const char *translation_domain)
 {
     int len = 3;
     char shortStr[2] = { '\0', '\0' };
     const char * item = shortStr;
     const char * argDescrip = getArgDescrip(opt, translation_domain);
 
-    if (opt->shortName) {
+    if (opt->shortName!= '\0' ) {
        if (!(opt->argInfo & POPT_ARG_MASK)) 
            return cursor;      /* we did these already */
        len++;
@@ -296,47 +307,57 @@ static int singleOptionUsage(FILE * f, int cursor,
     fprintf(f, " [-%s%s%s%s]",
        ((opt->shortName || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) ? "" : "-"),
        item,
-       (argDescrip ? (opt->shortName ? " " : "=") : ""),
+       (argDescrip ? (opt->shortName != '\0' ? " " : "=") : ""),
        (argDescrip ? argDescrip : ""));
 
     return cursor + len + 1;
 }
 
-static int singleTableUsage(FILE * f, int cursor,
-       const struct poptOption * opt, const char * translation_domain)
+static int singleTableUsage(FILE * f,
+               int cursor, const struct poptOption * opt,
+               /*@null@*/ const char * translation_domain)
 {
+    /*@-branchstate@*/         /* FIX: W2DO? */
+    if (opt != NULL)
     for (; (opt->longName || opt->shortName || opt->arg) ; opt++) {
-        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INTL_DOMAIN)
+        if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INTL_DOMAIN) {
            translation_domain = (const char *)opt->arg;
-       else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) 
+       } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) {
+           if (opt->arg)       /* XXX program error */
            cursor = singleTableUsage(f, cursor, opt->arg, translation_domain);
-       else if ((opt->longName || opt->shortName) && 
-                !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN))
+       } else if ((opt->longName || opt->shortName) &&
+                !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) {
            cursor = singleOptionUsage(f, cursor, opt, translation_domain);
+       }
     }
+    /*@=branchstate@*/
 
     return cursor;
 }
 
-static int showShortOptions(const struct poptOption * opt, FILE * f, char * str)
+static int showShortOptions(const struct poptOption * opt, FILE * f,
+               /*@null@*/ char * str)
 {
-    char s[300];               /* this is larger then the ascii set, so
-                                  it should do just fine */
+    char * s = alloca(300);    /* larger then the ascii set */
 
     s[0] = '\0';
+    /*@-branchstate@*/         /* FIX: W2DO? */
     if (str == NULL) {
        memset(s, 0, sizeof(s));
        str = s;
     }
+    /*@=branchstate@*/
 
+    if (opt != NULL)
     for (; (opt->longName || opt->shortName || opt->arg); opt++) {
        if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK))
            str[strlen(str)] = opt->shortName;
        else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE)
-           showShortOptions(opt->arg, f, str);
+           if (opt->arg)       /* XXX program error */
+               (void) showShortOptions(opt->arg, f, str);
     } 
 
-    if (s != str || !*s)
+    if (s != str || *s != '\0')
        return 0;
 
     fprintf(f, " [-%s]", s);
@@ -349,7 +370,7 @@ void poptPrintUsage(poptContext con, FILE * f, /*@unused@*/ int flags)
 
     cursor = showHelpIntro(con, f);
     cursor += showShortOptions(con->options, f, NULL);
-    singleTableUsage(f, cursor, con->options, NULL);
+    (void) singleTableUsage(f, cursor, con->options, NULL);
 
     if (con->otherHelp) {
        cursor += strlen(con->otherHelp) + 1;
index 066e143..3a3ee9b 100644 (file)
@@ -9,6 +9,16 @@
 #ifndef H_POPTINT
 #define H_POPTINT
 
+/**
+ * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
+ * @param this         memory to free
+ * @retval             NULL always
+ */
+/*@unused@*/ static inline /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) {
+    if (this != NULL)  free((void *)this);
+    return NULL;
+}
+
 /* Bit mask macros. */
 typedef        unsigned int __pbm_bits;
 #define        __PBM_NBITS             (8 * sizeof (__pbm_bits))
@@ -20,50 +30,50 @@ typedef struct {
 #define        __PBM_BITS(set) ((set)->bits)
 
 #define        PBM_ALLOC(d)    calloc(__PBM_IX (d) + 1, sizeof(__pbm_bits))
-#define        PBM_FREE(s)     free(s);
+#define        PBM_FREE(s)     _free(s);
 #define PBM_SET(d, s)   (__PBM_BITS (s)[__PBM_IX (d)] |= __PBM_MASK (d))
 #define PBM_CLR(d, s)   (__PBM_BITS (s)[__PBM_IX (d)] &= ~__PBM_MASK (d))
 #define PBM_ISSET(d, s) ((__PBM_BITS (s)[__PBM_IX (d)] & __PBM_MASK (d)) != 0)
 
 struct optionStackEntry {
     int argc;
-/*@only@*/ const char ** argv;
-/*@only@*/ pbm_set * argb;
+/*@only@*/ /*@null@*/ const char ** argv;
+/*@only@*/ /*@null@*/ pbm_set * argb;
     int next;
-/*@only@*/ const char * nextArg;
-/*@keep@*/ const char * nextCharArg;
-/*@dependent@*/ struct poptAlias * currAlias;
+/*@only@*/ /*@null@*/ const char * nextArg;
+/*@keep@*/ /*@null@*/ const char * nextCharArg;
+/*@dependent@*/ /*@null@*/ struct poptAlias * currAlias;
     int stuffed;
 };
 
 struct execEntry {
-    const char * longName;
+/*@owned@*/ /*@null@*/ const char * longName;
     char shortName;
-    const char * script;
+/*@only@*/ /*@null@*/ const char * script;
 };
 
 struct poptContext_s {
     struct optionStackEntry optionStack[POPT_OPTION_DEPTH];
 /*@dependent@*/ struct optionStackEntry * os;
-/*@owned@*/ const char ** leftovers;
+/*@owned@*/ /*@null@*/ const char ** leftovers;
     int numLeftovers;
     int nextLeftover;
 /*@keep@*/ const struct poptOption * options;
     int restLeftover;
-/*@only@*/ const char * appName;
-/*@only@*/ struct poptAlias * aliases;
+/*@only@*/ /*@null@*/ const char * appName;
+/*@only@*/ /*@null@*/ struct poptAlias * aliases;
     int numAliases;
     int flags;
-    struct execEntry * execs;
+/*@owned@*/ /*@null@*/ struct execEntry * execs;
     int numExecs;
-/*@only@*/ const char ** finalArgv;
+/*@only@*/ /*@null@*/ const char ** finalArgv;
     int finalArgvCount;
     int finalArgvAlloced;
-/*@dependent@*/ struct execEntry * doExec;
+/*@dependent@*/ /*@null@*/ struct execEntry * doExec;
 /*@only@*/ const char * execPath;
     int execAbsolute;
 /*@only@*/ const char * otherHelp;
-    pbm_set * arg_strip;
+/*@null@*/ pbm_set * arg_strip;
 };
 
 #ifdef HAVE_LIBINTL_H
index 9133c36..fdce572 100644 (file)
@@ -18,6 +18,8 @@ int poptDupArgv(int argc, const char **argv,
     char * dst;
     int i;
 
+    if (argc <= 0 || argv == NULL)     /* XXX can't happen */
+       return POPT_ERROR_NOARG;
     for (i = 0; i < argc; i++) {
        if (argv[i] == NULL)
            return POPT_ERROR_NOARG;
@@ -25,6 +27,8 @@ int poptDupArgv(int argc, const char **argv,
     }
        
     dst = malloc(nb);
+    if (dst == NULL)                   /* XXX can't happen */
+       return POPT_ERROR_MALLOC;
     argv2 = (void *) dst;
     dst += (argc + 1) * sizeof(*argv);
 
@@ -34,8 +38,14 @@ int poptDupArgv(int argc, const char **argv,
     }
     argv2[argc] = NULL;
 
-    *argvPtr = argv2;
-    *argcPtr = argc;
+    if (argvPtr) {
+       *argvPtr = argv2;
+    } else {
+       free(argv2);
+       argv2 = NULL;
+    }
+    if (argcPtr)
+       *argcPtr = argc;
     return 0;
 }
 
@@ -48,28 +58,31 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
     int argc = 0;
     int buflen = strlen(s) + 1;
     char * buf = memset(alloca(buflen), 0, buflen);
+    int rc = POPT_ERROR_MALLOC;
 
+    if (argv == NULL) return rc;
     argv[argc] = buf;
 
-    for (src = s; *src; src++) {
+    for (src = s; *src != '\0'; src++) {
        if (quote == *src) {
            quote = '\0';
-       } else if (quote) {
+       } else if (quote != '\0') {
            if (*src == '\\') {
                src++;
                if (!*src) {
-                   free(argv);
-                   return POPT_ERROR_BADQUOTE;
+                   rc = POPT_ERROR_BADQUOTE;
+                   goto exit;
                }
                if (*src != quote) *buf++ = '\\';
            }
            *buf++ = *src;
        } else if (isspace(*src)) {
-           if (*argv[argc]) {
+           if (*argv[argc] != '\0') {
                buf++, argc++;
                if (argc == argvAlloced) {
                    argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
                    argv = realloc(argv, sizeof(*argv) * argvAlloced);
+                   if (argv == NULL) goto exit;
                }
                argv[argc] = buf;
            }
@@ -81,8 +94,8 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
          case '\\':
            src++;
            if (!*src) {
-               free(argv);
-               return POPT_ERROR_BADQUOTE;
+               rc = POPT_ERROR_BADQUOTE;
+               goto exit;
            }
            /*@fallthrough@*/
          default:
@@ -95,9 +108,9 @@ int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
        argc++, buf++;
     }
 
-    (void) poptDupArgv(argc, argv, argcPtr, argvPtr);
-
-    free(argv);
+    rc = poptDupArgv(argc, argv, argcPtr, argvPtr);
 
-    return 0;
+exit:
+    if (argv) free(argv);
+    return rc;
 }
index 43ad70f..8015c64 100644 (file)
@@ -44,12 +44,14 @@ char *alloca ();
 
 /*@only@*/ char * xstrdup (const char *str);
 
+#if !defined(__LCLINT__)
 #if HAVE_MCHECK_H && defined(__GNUC__)
 #define        vmefail()       (fprintf(stderr, "virtual memory exhausted.\n"), exit(EXIT_FAILURE), NULL)
 #define xstrdup(_str)   (strcpy((malloc(strlen(_str)+1) ? : vmefail()), (_str)))
 #else
 #define        xstrdup(_str)   strdup(_str)
 #endif  /* HAVE_MCHECK_H && defined(__GNUC__) */
+#endif /* !__LCLINT__ */
 
 
 #include "popt.h"
index 7b7f55f..919ea7c 100644 (file)
@@ -149,7 +149,7 @@ int main(int argc, const char ** argv) {
     fprintf(stdout, "\n");
 
 exit:
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
 #if HAVE_MCHECK_H && HAVE_MTRACE
     muntrace();   /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
 #endif
index 3181c0f..afac1c6 100644 (file)
@@ -133,7 +133,7 @@ main(int argc, const char ** argv) {
     /* although there are no options to be parsed, check for --help */
     poptGetNextOpt(optCon);
 
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
 
     printf( "dbusername %s\tdbpassword %s\n"
             "txhost %s\ttxsslport %d\ttxstoreid %d\tpathofkeyfile %s\n"
diff --git a/rpm.c b/rpm.c
index b727341..0e3cd66 100755 (executable)
--- a/rpm.c
+++ b/rpm.c
@@ -1281,7 +1281,7 @@ int main(int argc, const char ** argv)
        break;
     }
 
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
     rpmFreeMacros(NULL);
     rpmFreeMacros(&rpmCLIMacroContext);
     rpmFreeRpmrc();
index 461aebd..c2e9628 100644 (file)
@@ -6,8 +6,10 @@
 #include "rpmio_internal.h"
 #include "debug.h"
 
+/*@-redef@*/
 typedef unsigned int uint32;
 typedef unsigned char byte;
+/*@=redef@*/
 
 /*@access DIGEST_CTX@*/
 
@@ -358,7 +360,9 @@ MD5Transform(DIGEST_CTX ctx)
 }
 
 static int _ie = 0x44332211;
+/*@-redef@*/
 static union _mendian { int i; char b[4]; } *_endian = (union _mendian *)&_ie;
+/*@=redef@*/
 #define        IS_BIG_ENDIAN()         (_endian->b[0] == '\x44')
 #define        IS_LITTLE_ENDIAN()      (_endian->b[0] == '\x11')
 
@@ -367,6 +371,7 @@ static union _mendian { int i; char b[4]; } *_endian = (union _mendian *)&_ie;
  * @param buf          data buffer (uint32 aligned address)
  * @param nbytes       no. bytes of data (multiple of sizeof(uint32))
  */
+/*@-shadow@*/
 static void
 byteReverse(byte *buf, unsigned nbytes)
 {
@@ -379,6 +384,7 @@ byteReverse(byte *buf, unsigned nbytes)
        buf += 4;
     } while (--nlongs);
 }
+/*@=shadow@*/
 
 DIGEST_CTX
 rpmDigestInit(rpmDigestFlags flags)
index e815dae..60eab14 100644 (file)
@@ -62,13 +62,13 @@ struct MacroContext_s rpmCLIMacroContext;
  * Macro expansion state.
  */
 typedef struct MacroBuf {
-/*@shared@*/ const char *s;            /*!< Text to expand. */
-/*@shared@*/ char *t;          /*!< Expansion buffer. */
+/*@shared@*/ const char * s;           /*!< Text to expand. */
+/*@shared@*/ char * t;                 /*!< Expansion buffer. */
        size_t nb;              /*!< No. bytes remaining in expansion buffer. */
-       int depth;              /*!< Current expansion depth. */
-       int macro_trace;        /*!< Pre-print macro to expand? */
-       int expand_trace;       /*!< Post-print macro expansion? */
-/*@shared@*/ void *spec;       /*!< (future) %file expansion info. */
+       int depth;                      /*!< Current expansion depth. */
+       int macro_trace;                /*!< Pre-print macro to expand? */
+       int expand_trace;               /*!< Post-print macro expansion? */
+/*@shared@*/ /*@null@*/ void * spec;   /*!< (future) %file expansion info?. */
 /*@dependent@*/ MacroContext mc;
 } MacroBuf;
 
@@ -76,6 +76,7 @@ typedef struct MacroBuf {
 
 static int expandMacro(MacroBuf *mb);
 
+/*@-exportlocal@*/
 #define        MAX_MACRO_DEPTH 16
 int max_macro_depth = MAX_MACRO_DEPTH;
 
@@ -86,6 +87,7 @@ int print_expand_trace = 0;
 int print_macro_trace = 0;
 int print_expand_trace = 0;
 #endif
+/*@=exportlocal@*/
 
 #define        MACRO_CHUNK_SIZE        16
 
index a5f0971..9ddc770 100644 (file)
@@ -401,7 +401,9 @@ static struct FDIO_s fdio_s = {
 };
 FDIO_t fdio = /*@-compmempass@*/ &fdio_s /*@=compmempass@*/ ;
 
+/*@-redef@*/   /* see lib/falloc.c */
 FDIO_t fadio;  /* XXX usually NULL, filled in when linked with rpm */
+/*@=redef@*/
 
 int fdWritable(FD_t fd, int secs)
 {
@@ -1473,6 +1475,7 @@ static ssize_t ufdRead(void * cookie, /*@out@*/ char * buf, size_t count) {
     int bytesRead;
     int total;
 
+    *buf = '\0';       /* LCL: insistent bugger. */
     /* XXX preserve timedRead() behavior */
     if (fdGetIo(fd) == fdio) {
        struct stat sb;
@@ -1608,6 +1611,7 @@ static inline int ufdSeek(void * cookie, _libio_pos_t pos, int whence) {
     return fdSeek(cookie, pos, whence);
 }
 
+/*@-usereleased@*/     /* LCL: fd handling is tricky here. */
 int ufdClose( /*@only@*/ void * cookie)
 {
     FD_t fd = c2f(cookie);
@@ -1720,7 +1724,9 @@ fprintf(stderr, "-> \r\n");
     }
     return fdClose(fd);
 }
+/*@=usereleased@*/
 
+/*@-nullstate@*/       /* FIX: u->{ctrl,data}->url undef after XurlLink. */
 /*@null@*/ FD_t ftpOpen(const char *url, /*@unused@*/ int flags,
                /*@unused@*/ mode_t mode, /*@out@*/ urlinfo *uret)
 {
@@ -1755,7 +1761,9 @@ exit:
        *uret = u;
     return fd;
 }
+/*@=nullstate@*/
 
+/*@-nullstate@*/       /* FIX: u->{ctrl,data}->url undef after XurlLink. */
 static /*@null@*/ FD_t httpOpen(const char * url, /*@unused@*/ int flags,
                /*@unused@*/ mode_t mode, /*@out@*/ urlinfo * uret)
 {
@@ -1795,6 +1803,7 @@ exit:
        *uret = u;
     return fd;
 }
+/*@=nullstate@*/
 
 static /*@null@*/ FD_t ufdOpen(const char *url, int flags, mode_t mode)
 {
index 13bf75d..0533dbe 100644 (file)
@@ -331,6 +331,7 @@ int fdFileno(void * cookie);
 /*@=shadow@*/
 
 
+/*@-exportlocal@*/
 /** \ingroup rpmio
  */
 /*@null@*/ FD_t fdOpen(const char *path, int flags, mode_t mode);
@@ -360,6 +361,7 @@ int fdWritable(FD_t fd, int secs);
 /** \ingroup rpmio
  */
 int    fdReadable(FD_t fd, int secs);
+/*@=exportlocal@*/
 
 /** \ingroup rpmio
  * FTP and HTTP error codes.
@@ -393,7 +395,9 @@ typedef enum ftperrCode_e {
 
 /** \ingroup rpmio
  */
+/*@-exportlocal@*/
 int    ufdCopy(FD_t sfd, FD_t tfd);
+/*@=exportlocal@*/
 
 /** \ingroup rpmio
  */
@@ -405,6 +409,7 @@ int timedRead(FD_t fd, /*@out@*/ void * bufptr, int length);
 #define        timedRead       ufdio->read
 
 
+/*@-exportlocal@*/
 /** \ingroup rpmio
  */
 /*@observer@*/ extern FDIO_t fdio;
@@ -428,6 +433,7 @@ int timedRead(FD_t fd, /*@out@*/ void * bufptr, int length);
 /** \ingroup rpmio
  */
 /*@observer@*/ extern FDIO_t fadio;
+/*@=exportlocal@*/
 /*@}*/
 
 /*@unused@*/ static inline int xislower(int c) {return (c >= 'a' && c <= 'z');}
index 30607a2..12877f3 100644 (file)
@@ -168,21 +168,6 @@ extern "C" {
 int rpmlogGetNrecs(void);
 
 /**
- * Return text of last rpmError() message.
- * @return             text of last message
- */
-/*@observer@*/ /*@null@*/ const char * rpmlogMessage(void);
-
-/**
- * Return error code from last rpmError() message.
- * @deprecated Perl-RPM needs, what's really needed is predictable, non-i18n
- *     encumbered, error text that can be retrieved through rpmlogMessage()
- *     and parsed IMHO.
- * @return             code from last message
- */
-int rpmlogCode(void);
-
-/**
  * Print all rpmError() messages.
  * @param f            file handle (NULL uses stderr)
  */
@@ -210,10 +195,27 @@ int rpmlogSetMask (int mask);
  */
 /*@mayexit@*/ /*@printflike@*/ void rpmlog (int pri, const char *fmt, ...);
 
+/*@-exportlocal@*/
+/**
+ * Return text of last rpmError() message.
+ * @return             text of last message
+ */
+/*@observer@*/ /*@null@*/ const char * rpmlogMessage(void);
+
+/**
+ * Return error code from last rpmError() message.
+ * @deprecated Perl-RPM needs, what's really needed is predictable, non-i18n
+ *     encumbered, error text that can be retrieved through rpmlogMessage()
+ *     and parsed IMHO.
+ * @return             code from last message
+ */
+int rpmlogCode(void);
+
 /**
  * Set rpmlog callback function.
  */
 rpmlogCallback rpmlogSetCallback(rpmlogCallback cb);
+/*@=exportlocal@*/
 
 /**
  * Set rpmlog callback function.
index 7923f87..d5e467a 100644 (file)
@@ -17,7 +17,7 @@
     return NULL;
 }
 
-#if !(HAVE_MCHECK_H && defined(__GNUC__))
+#if !(HAVE_MCHECK_H && defined(__GNUC__)) && !defined(__LCLINT__)
 
 /*@only@*/ void * xmalloc (size_t size)
 {
diff --git a/rpmqv.c b/rpmqv.c
index 347eb78..ba54d66 100755 (executable)
--- a/rpmqv.c
+++ b/rpmqv.c
@@ -49,7 +49,9 @@ static int noPgp = 0;
 #define GETOPT_SHOWRC          1018
 #define        GETOPT_DEFINEMACRO      1020
 #define        GETOPT_EVALMACRO        1021
+#ifdef NOTYET
 #define        GETOPT_RCFILE           1022
+#endif
 
 enum modes {
 
@@ -146,7 +148,7 @@ static struct poptOption rpmAllPoptTable[] = {
  { "macros", '\0', POPT_ARG_STRING, &macrofiles, 0,
        N_("read <file:...> instead of default macro file(s)"),
        N_("<file:...>") },
-#ifndef        DYING
+#if !defined(GETOPT_RCFILE)
  { "rcfile", '\0', POPT_ARG_STRING, &rcfile, 0,
        N_("read <file:...> instead of default rpmrc file(s)"),
        N_("<file:...>") },
@@ -897,28 +899,36 @@ int main(int argc, const char ** argv)
 #endif
 
          case GETOPT_EXCLUDEPATH:
-           if (*optArg != '/') 
+           /*@-nullderef@*/    /* LCL: optarg != NULL */
+           if (optarg == NULL || *optArg != '/') 
                argerror(_("exclude paths must begin with a /"));
+           /*@=nullderef@*/
 
            relocations = xrealloc(relocations, 
                                  sizeof(*relocations) * (numRelocations + 1));
+           /*@-observertrans -dependenttrans@*/        /* FIX: W2DO? */
            relocations[numRelocations].oldPath = optArg;
            relocations[numRelocations++].newPath = NULL;
+           /*@=observertrans =dependenttrans@*/
            break;
 
          case GETOPT_RELOCATE:
-         { char * errString = NULL;
-           if (*optArg != '/') 
+         { char * newPath = NULL;
+           /*@-nullderef -nullpass@*/  /* LCL: optarg != NULL */
+           if (optarg == NULL || *optArg != '/') 
                argerror(_("relocations must begin with a /"));
-           if (!(errString = strchr(optArg, '=')))
+           if (!(newPath = strchr(optArg, '=')))
                argerror(_("relocations must contain a ="));
-           *errString++ = '\0';
-           if (*errString != '/') 
+           /*@=nullderef =nullpass@*/
+           *newPath++ = '\0';
+           if (*newPath != '/') 
                argerror(_("relocations must have a / following the ="));
            relocations = xrealloc(relocations, 
                                  sizeof(*relocations) * (numRelocations + 1));
+           /*@-observertrans -kepttrans@*/     /* FIX: W2DO? */
            relocations[numRelocations].oldPath = optArg;
-           relocations[numRelocations++].newPath = errString;
+           relocations[numRelocations++].newPath = newPath;
+           /*@=observertrans =kepttrans@*/
          } break;
 #endif /* IAM_RPMEIU */
 
@@ -955,23 +965,29 @@ int main(int argc, const char ** argv)
 #endif /* IAM_RPMK */
 
          case GETOPT_DEFINEMACRO:
+           /*@-nullderef -nullpass@*/  /* LCL: optarg != NULL */
+           if (optarg == NULL) break;  /* XXX can't happen. */
            (void) rpmDefineMacro(NULL, optArg, RMIL_CMDLINE);
            (void) rpmDefineMacro(&rpmCLIMacroContext, optArg, RMIL_CMDLINE);
+           /*@=nullderef =nullpass@*/
            noUsageMsg = 1;
            break;
 
          case GETOPT_EVALMACRO:
+           if (optarg == NULL) break;  /* XXX can't happen. */
          { const char *val = rpmExpand(optArg, NULL);
            fprintf(stdout, "%s\n", val);
            free((void *)val);
            noUsageMsg = 1;
          } break;
 
+#if defined(GETOPT_RCFILE)
          case GETOPT_RCFILE:
            fprintf(stderr, _("The --rcfile option has been eliminated.\n"));
            fprintf(stderr, _("Use \"--macros <file:...>\" instead.\n"));
            exit(EXIT_FAILURE);
            /*@notreached@*/ break;
+#endif
 
          default:
            fprintf(stderr, _("Internal error in argument processing (%d) :-(\n"), arg);
@@ -1568,7 +1584,7 @@ int main(int argc, const char ** argv)
 #if defined(IAM_RPMBT) || defined(IAM_RPMK)
 exit:
 #endif /* IAM_RPMBT || IAM_RPMK */
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
     rpmFreeMacros(NULL);
     rpmFreeMacros(&rpmCLIMacroContext);
     rpmFreeRpmrc();
index 2219eae..f3e1ccb 100755 (executable)
@@ -19,7 +19,7 @@ rpmdb=/usr/bin/rpmdb
 
 dist=7.0
 type=min
-arch=`$rpmq --eval '%{_arch}'`
+arch=`$rpm --eval '%{_arch}'`
 
 top=`pwd`
 root=$top/$dist
index b2c9d83..fc86444 100644 (file)
--- a/system.h
+++ b/system.h
@@ -90,7 +90,9 @@ extern int errno;
 #endif
 
 #ifdef STDC_HEADERS
+/*@-macrounrecog -incondefs -globuse@*/        /* FIX: shrug */
 #define getopt system_getopt
+/*@=macrounrecog =incondefs =globuse@*/
 /*@-skipansiheaders@*/
 #include <stdlib.h>
 /*@=skipansiheaders@*/
index 04f7c39..b43b377 100644 (file)
@@ -610,6 +610,6 @@ main(int argc, char *argv[])
 
     ec = do_inject(cmds, ncmds, poptGetArgs(optCon));
 
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
     return ec;
 }
index d392fc6..83f507f 100644 (file)
@@ -322,7 +322,7 @@ main(int argc, const char *argv[])
 
     ec = do_tsort(poptGetArgs(optCon));
 
-    poptFreeContext(optCon);
+    optCon = poptFreeContext(optCon);
 
     return ec;
 }