From 95f01d39a57c3c3d8ebf80cfd78e67c550dc32e5 Mon Sep 17 00:00:00 2001 From: jbj Date: Wed, 2 Apr 2003 21:16:26 +0000 Subject: [PATCH] Splint clean. CVS patchset: 6729 CVS date: 2003/04/02 21:16:26 --- beecrypt/entropy.c | 2 +- build/buildio.h | 2 +- file/compress.c | 6 +- lib/.splintrc | 2 + lib/depends.c | 2 + lib/formats.c | 28 ++++++++- lib/fs.c | 15 +++-- lib/fsm.c | 125 ++++++++++++++++++++++++++--------------- lib/fsm.h | 73 ++++++++++++++---------- lib/misc.c | 10 ++++ lib/poptALL.c | 4 ++ lib/psm.c | 27 ++++++--- lib/psm.h | 9 ++- lib/query.c | 2 + lib/rpmchecksig.c | 15 +++-- lib/rpmds.c | 5 ++ lib/rpmds.h | 4 +- lib/rpmfi.c | 7 +++ lib/rpmfi.h | 13 +++-- lib/rpminstall.c | 4 +- lib/rpmrc.c | 2 +- lib/rpmte.c | 2 +- lib/rpmte.h | 3 +- lib/rpmts.h | 8 ++- lib/transaction.c | 7 ++- lib/verify.c | 3 + rpmio/digest.c | 15 +++-- rpmio/fts.c | 5 +- rpmio/fts.h | 4 +- rpmio/rpmio_internal.h | 2 + rpmio/rpmpgp.h | 4 +- rpmio/rpmsq.c | 87 ++++++++++++++++++++++------ rpmio/rpmsq.h | 61 ++++++++++++++------ rpmio/rpmsw.c | 20 ++++++- rpmio/rpmsw.h | 2 + 35 files changed, 414 insertions(+), 166 deletions(-) diff --git a/beecrypt/entropy.c b/beecrypt/entropy.c index 077e85c3a..f71a45949 100644 --- a/beecrypt/entropy.c +++ b/beecrypt/entropy.c @@ -63,7 +63,7 @@ extern int nanosleep (const struct timespec *__requested_time, /*@out@*/ /*@null@*/ struct timespec *__remaining) - /*@modifies errno @*/; + /*@modifies *__remaining, errno @*/; extern void aio_init (const struct aioinit *__init) diff --git a/build/buildio.h b/build/buildio.h index c34245312..b38ba93a0 100644 --- a/build/buildio.h +++ b/build/buildio.h @@ -15,7 +15,7 @@ typedef /*@abstract@*/ struct cpioSourceArchive_s { unsigned int cpioArchiveSize; FD_t cpioFdIn; -/*@refcounted@*/ +/*@refcounted@*/ /*@relnull@*/ rpmfi cpioList; /*@only@*/ struct rpmlead * lead; /* XXX FIXME: exorcize lead/arch/os */ diff --git a/file/compress.c b/file/compress.c index 533fdc91f..6fd8de38b 100644 --- a/file/compress.c +++ b/file/compress.c @@ -202,7 +202,8 @@ uncompressgzipped(const unsigned char *old, /*@=type@*/ /*@=sizeoftype@*/ if (rc != Z_OK) { - (void) fprintf(stderr,"%s: zlib: %s\n", __progname, z.msg); + fprintf(stderr,"%s: zlib: %s\n", __progname, + (z.msg != NULL ? z.msg : "")); return 0; } @@ -210,7 +211,8 @@ uncompressgzipped(const unsigned char *old, rc = inflate(&z, Z_SYNC_FLUSH); /*@=type@*/ if (rc != Z_OK && rc != Z_STREAM_END) { - fprintf(stderr,"%s: zlib: %s\n", __progname, z.msg); + fprintf(stderr,"%s: zlib: %s\n", __progname, + (z.msg != NULL ? z.msg : "")); return 0; } diff --git a/lib/.splintrc b/lib/.splintrc index f84dc6e6c..165d898ac 100644 --- a/lib/.splintrc +++ b/lib/.splintrc @@ -19,6 +19,8 @@ -redecl -bufferoverflowhigh +-nullpass + # --- +partial artifacts -declundef -exportheadervar diff --git a/lib/depends.c b/lib/depends.c index cf80ef4d8..856759916 100644 --- a/lib/depends.c +++ b/lib/depends.c @@ -376,7 +376,9 @@ static int unsatisfiedDepend(rpmts ts, rpmds dep, int adding) memset(data, 0, sizeof(*data)); data->data = datap; data->size = datalen; +/*@-nullstate@*/ /* FIX: data->data may be NULL */ xx = dbiGet(dbi, dbcursor, key, data, DB_SET); +/*@=nullstate@*/ DNEVR = key->data; DNEVRlen = key->size; datap = data->data; diff --git a/lib/formats.c b/lib/formats.c index cf07474ca..a07a9fcfc 100644 --- a/lib/formats.c +++ b/lib/formats.c @@ -244,7 +244,10 @@ static size_t xmlstrlen(const char * s) size_t len = 0; int c; - while ((c = *s++) != '\0') { +/*@-boundsread@*/ + while ((c = *s++) != '\0') +/*@=boundsread@*/ + { switch (c) { case '<': case '>': len += 4; /*@switchbreak@*/ break; case '&': len += 5; /*@switchbreak@*/ break; @@ -262,6 +265,7 @@ static char * xmlstrcpy(/*@returned@*/ char * t, const char * s) char * te = t; int c; +/*@-bounds@*/ while ((c = *s++) != '\0') { switch (c) { case '<': te = stpcpy(te, "<"); /*@switchbreak@*/ break; @@ -271,6 +275,7 @@ static char * xmlstrcpy(/*@returned@*/ char * t, const char * s) } } *te = '\0'; +/*@=bounds@*/ return t; } @@ -283,6 +288,7 @@ static char * xmlstrcpy(/*@returned@*/ char * t, const char * s) * @param element (unused) * @return formatted string */ +/*@-bounds@*/ static /*@only@*/ char * xmlFormat(int_32 type, const void * data, char * formatPrefix, int padding, /*@unused@*/ int element) @@ -294,7 +300,9 @@ static /*@only@*/ char * xmlFormat(int_32 type, const void * data, const char * s = NULL; char * t, * te; unsigned long anint = 0; + int xx; +/*@-branchstate@*/ switch (type) { case RPM_I18NSTRING_TYPE: case RPM_STRING_TYPE: @@ -303,9 +311,15 @@ static /*@only@*/ char * xmlFormat(int_32 type, const void * data, break; case RPM_BIN_TYPE: { int cpl = b64encode_chars_per_line; +/*@-mods@*/ b64encode_chars_per_line = 0; +/*@=mods@*/ +/*@-formatconst@*/ s = base64Format(type, data, formatPrefix, padding, element); +/*@=formatconst@*/ +/*@-mods@*/ b64encode_chars_per_line = cpl; +/*@=mods@*/ xtag = "base64"; } break; case RPM_CHAR_TYPE: @@ -324,14 +338,17 @@ static /*@only@*/ char * xmlFormat(int_32 type, const void * data, return xstrdup(_("(invalid xml type)")); /*@notreached@*/ break; } +/*@=branchstate@*/ +/*@-branchstate@*/ if (s == NULL) { int tlen = 32; t = memset(alloca(tlen+1), 0, tlen+1); - snprintf(t, tlen, "%lu", anint); + xx = snprintf(t, tlen, "%lu", anint); s = t; xtag = "integer"; } +/*@=branchstate@*/ nb = 2 * strlen(xtag) + sizeof("\t<>") + xmlstrlen(s); te = t = alloca(nb); @@ -341,19 +358,24 @@ static /*@only@*/ char * xmlFormat(int_32 type, const void * data, te = stpcpy( stpcpy( stpcpy(te, ""); /* XXX s was malloc'd */ +/*@-branchstate@*/ if (!strcmp(xtag, "base64")) s = _free(s); +/*@=branchstate@*/ nb += padding; val = xmalloc(nb+1); /*@-boundswrite@*/ strcat(formatPrefix, "s"); /*@=boundswrite@*/ - snprintf(val, nb, formatPrefix, t); +/*@-formatconst@*/ + xx = snprintf(val, nb, formatPrefix, t); +/*@=formatconst@*/ val[nb] = '\0'; return val; } +/*@=bounds@*/ /** * Display signature fingerprint and time. diff --git a/lib/fs.c b/lib/fs.c index cf473e037..f78582bb7 100644 --- a/lib/fs.c +++ b/lib/fs.c @@ -10,15 +10,18 @@ /*@-usereleased -onlytrans@*/ struct fsinfo { -/*@only@*/ const char * mntPoint; /*!< path to mount point. */ - dev_t dev; /*!< devno for mount point. */ - int rdonly; /*!< is mount point read only? */ +/*@only@*/ /*@relnull@*/ + const char * mntPoint; /*!< path to mount point. */ + dev_t dev; /*!< devno for mount point. */ + int rdonly; /*!< is mount point read only? */ }; /*@unchecked@*/ -/*@only@*/ /*@null@*/ static struct fsinfo * filesystems = NULL; +/*@only@*/ /*@null@*/ +static struct fsinfo * filesystems = NULL; /*@unchecked@*/ -/*@only@*/ /*@null@*/ static const char ** fsnames = NULL; +/*@only@*/ /*@null@*/ +static const char ** fsnames = NULL; /*@unchecked@*/ static int numFilesystems = 0; @@ -236,7 +239,9 @@ static int getFilesystemList(void) fsnames[numFilesystems] = NULL; /*@=boundswrite@*/ +/*@-nullstate@*/ /* FIX: fsnames[] may be NULL */ return 0; +/*@=nullstate@*/ } #endif /* HAVE_MNTCTL */ diff --git a/lib/fsm.c b/lib/fsm.c index 0f3eda7ec..edb6e9fdb 100644 --- a/lib/fsm.c +++ b/lib/fsm.c @@ -9,7 +9,10 @@ #include #include "cpio.h" + #include "fsm.h" +#define fsmUNSAFE fsmStage + #include "rpmerr.h" #define _RPMFI_INTERNAL @@ -31,8 +34,11 @@ #define _FSM_DEBUG 0 /*@unchecked@*/ int _fsm_debug = _FSM_DEBUG; + +/*@-exportheadervar@*/ /*@unchecked@*/ int _fsm_threads = 0; +/*@=exportheadervar@*/ /* XXX Failure to remove is not (yet) cause for failure. */ /*@-exportlocal -exportheadervar@*/ @@ -246,7 +252,7 @@ static /*@null@*/ void * dnlFreeIterator(/*@only@*//*@null@*/ const void * a) /** \ingroup payload */ -static inline int dnlCount(const DNLI_t dnli) +static inline int dnlCount(/*@null@*/ const DNLI_t dnli) /*@*/ { return (dnli ? dnli->fi->dc : 0); @@ -254,7 +260,7 @@ static inline int dnlCount(const DNLI_t dnli) /** \ingroup payload */ -static inline int dnlIndex(const DNLI_t dnli) +static inline int dnlIndex(/*@null@*/ const DNLI_t dnli) /*@*/ { return (dnli ? dnli->isave : -1); @@ -268,7 +274,8 @@ static inline int dnlIndex(const DNLI_t dnli) */ /*@-boundsread@*/ /*@-usereleased@*/ -static /*@only@*/ void * dnlInitIterator(/*@special@*/ const FSM_t fsm, +static /*@only@*/ /*@null@*/ +void * dnlInitIterator(/*@special@*/ const FSM_t fsm, int reverse) /*@uses fsm->iter @*/ /*@*/ @@ -357,7 +364,8 @@ static /*@only@*/ void * dnlInitIterator(/*@special@*/ const FSM_t fsm, * @return next directory name */ /*@-boundsread@*/ -static /*@observer@*/ const char * dnlNextIterator(/*@null@*/ DNLI_t dnli) +static /*@observer@*/ /*@null@*/ +const char * dnlNextIterator(/*@null@*/ DNLI_t dnli) /*@modifies dnli @*/ { const char * dn = NULL; @@ -382,14 +390,18 @@ static /*@observer@*/ const char * dnlNextIterator(/*@null@*/ DNLI_t dnli) /*@=boundsread@*/ static void * fsmThread(void * arg) - /*@modifies arg @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies arg, fileSystem, internalState @*/ { FSM_t fsm = arg; +/*@-unqualifiedtrans@*/ return ((void *) fsmStage(fsm, fsm->nstage)); +/*@=unqualifiedtrans@*/ } int fsmNext(FSM_t fsm, fileStage nstage) - /*@modifies fsm @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { fsm->nstage = nstage; if (_fsm_threads) @@ -407,8 +419,8 @@ 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 @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { struct stat * st = &fsm->sb; int rc = 0; @@ -583,7 +595,9 @@ int fsmSetup(FSM_t fsm, fileStage goal, *fsm->archiveSize = (fdGetCpioPos(fsm->cfd) - pos); /*@=boundswrite@*/ +/*@-nullstate@*/ /* FIX: *fsm->failedFile may be NULL */ return ec; +/*@=nullstate@*/ } int fsmTeardown(FSM_t fsm) @@ -759,10 +773,11 @@ int fsmMapAttrs(FSM_t fsm) * @param fsm file state machine data * @return 0 on success */ +/*@-compdef@*/ static int expandRegular(/*@special@*/ FSM_t fsm) - /*@uses fsm->sb @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@uses fsm->fmd5sum, fsm->md5sum, fsm->sb, fsm->wfd @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { const struct stat * st = &fsm->sb; int left = st->st_size; @@ -772,7 +787,7 @@ static int expandRegular(/*@special@*/ FSM_t fsm) if (rc) goto exit; - if (st->st_size > 0 && (fsm->fmd5sum || fsm->md5sum)) + if (st->st_size > 0 && (fsm->fmd5sum != NULL || fsm->md5sum != NULL)) fdInitDigest(fsm->wfd, PGPHASHALGO_MD5, 0); while (left) { @@ -819,6 +834,7 @@ exit: (void) fsmNext(fsm, FSM_WCLOSE); return rc; } +/*@=compdef@*/ /** \ingroup payload * Write next item to payload stream. @@ -826,10 +842,11 @@ exit: * @param writeData should data be written? * @return 0 on success */ -static int writeFile(/*@special@*/ FSM_t fsm, int writeData) +/*@-compdef -compmempass@*/ +static int writeFile(/*@special@*/ /*@partial@*/ FSM_t fsm, int writeData) /*@uses fsm->path, fsm->opath, fsm->sb, fsm->osb, fsm->cfd @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { const char * path = fsm->path; const char * opath = fsm->opath; @@ -859,7 +876,6 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData) /*@=branchstate@*/ if (fsm->mapFlags & CPIO_MAP_ABSOLUTE) { -/*@-compdef@*/ /* FIX: dirName/baseName annotations ? */ /*@-boundswrite@*/ int nb = strlen(fsm->dirName) + strlen(fsm->baseName) + sizeof("."); char * t = alloca(nb); @@ -869,7 +885,6 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData) *t++ = '.'; t = stpcpy( stpcpy(t, fsm->dirName), fsm->baseName); /*@=boundswrite@*/ -/*@=compdef@*/ } else if (fsm->mapFlags & CPIO_MAP_PATH) { rpmfi fi = fsmGetFi(fsm); fsm->path = @@ -926,14 +941,18 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData) } #if HAVE_MMAP +/*@-branchstate@*/ if (mapped != (void *)-1) { xx = msync(mapped, nmapped, MS_ASYNC); #if defined(MADV_DONTNEED) xx = madvise(mapped, nmapped, MADV_DONTNEED); #endif - /*@-noeffect@*/ xx = munmap(mapped, nmapped) /*@=noeffect@*/; +/*@-noeffect@*/ + xx = munmap(mapped, nmapped); +/*@=noeffect@*/ fsm->rdbuf = rdbuf; } +/*@=branchstate@*/ #endif } else if (writeData && S_ISLNK(st->st_mode)) { @@ -954,22 +973,23 @@ static int writeFile(/*@special@*/ FSM_t fsm, int writeData) exit: if (fsm->rfd != NULL) (void) fsmNext(fsm, FSM_RCLOSE); - /*@-dependenttrans@*/ +/*@-dependenttrans@*/ fsm->opath = opath; fsm->path = path; - /*@=dependenttrans@*/ +/*@=dependenttrans@*/ return rc; } +/*@=compdef =compmempass@*/ /** \ingroup payload * Write set of linked files to payload stream. * @param fsm file state machine data * @return 0 on success */ -static int writeLinkedFile(/*@special@*/ FSM_t fsm) +static int writeLinkedFile(/*@special@*/ /*@partial@*/ FSM_t fsm) /*@uses fsm->path, fsm->nsuffix, fsm->ix, fsm->li, fsm->failedFile @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { const char * path = fsm->path; const char * nsuffix = fsm->nsuffix; @@ -983,12 +1003,15 @@ static int writeLinkedFile(/*@special@*/ FSM_t fsm) fsm->ix = -1; /*@-boundswrite@*/ +/*@-branchstate@*/ for (i = fsm->li->nlink - 1; i >= 0; i--) { if (fsm->li->filex[i] < 0) continue; fsm->ix = fsm->li->filex[i]; +/*@-compdef@*/ rc = fsmNext(fsm, FSM_MAP); +/*@=compdef@*/ /* Write data after last link. */ rc = writeFile(fsm, (i == 0)); @@ -1000,6 +1023,7 @@ static int writeLinkedFile(/*@special@*/ FSM_t fsm) fsm->path = _free(fsm->path); fsm->li->filex[i] = -1; } +/*@=branchstate@*/ /*@=boundswrite@*/ fsm->ix = iterIndex; @@ -1014,10 +1038,11 @@ static int writeLinkedFile(/*@special@*/ FSM_t fsm) * @return 0 on success */ /*@-boundsread@*/ -static int fsmMakeLinks(/*@special@*/ FSM_t fsm) +/*@-compdef@*/ +static int fsmMakeLinks(/*@special@*/ /*@partial@*/ FSM_t fsm) /*@uses fsm->path, fsm->opath, fsm->nsuffix, fsm->ix, fsm->li @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { const char * path = fsm->path; const char * opath = fsm->opath; @@ -1071,6 +1096,7 @@ static int fsmMakeLinks(/*@special@*/ FSM_t fsm) fsm->opath = opath; return ec; } +/*@=compdef@*/ /*@=boundsread@*/ /** \ingroup payload @@ -1078,11 +1104,12 @@ static int fsmMakeLinks(/*@special@*/ FSM_t fsm) * @param fsm file state machine data * @return 0 on success */ -static int fsmCommitLinks(/*@special@*/ FSM_t fsm) +/*@-compdef@*/ +static int fsmCommitLinks(/*@special@*/ /*@partial@*/ FSM_t fsm) /*@uses fsm->path, fsm->nsuffix, fsm->ix, fsm->sb, fsm->li, fsm->links @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { const char * path = fsm->path; const char * nsuffix = fsm->nsuffix; @@ -1119,16 +1146,17 @@ static int fsmCommitLinks(/*@special@*/ FSM_t fsm) fsm->path = path; return rc; } +/*@=compdef@*/ /** * Remove (if created) directories not explicitly included in package. * @param fsm file state machine data * @return 0 on success */ -static int fsmRmdirs(/*@special@*/ FSM_t fsm) +static int fsmRmdirs(/*@special@*/ /*@partial@*/ FSM_t fsm) /*@uses fsm->path, fsm->dnlx, fsm->ldn, fsm->rdbuf, fsm->iter @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { const char * path = fsm->path; void * dnli = dnlInitIterator(fsm, 1); @@ -1158,7 +1186,9 @@ static int fsmRmdirs(/*@special@*/ FSM_t fsm) do { if (*te == '/') { *te = '\0'; +/*@-compdef@*/ rc = fsmNext(fsm, FSM_RMDIR); +/*@=compdef@*/ *te = '/'; } if (rc) @@ -1180,12 +1210,12 @@ static int fsmRmdirs(/*@special@*/ FSM_t fsm) * @param fsm file state machine data * @return 0 on success */ -static int fsmMkdirs(/*@special@*/ FSM_t fsm) +static int fsmMkdirs(/*@special@*/ /*@partial@*/ 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 @*/ - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { struct stat * st = &fsm->sb; struct stat * ost = &fsm->osb; @@ -1296,11 +1326,10 @@ static int fsmMkdirs(/*@special@*/ FSM_t fsm) * @param fsm file state machine data * @return 0 on success */ -static int fsmStat(FSM_t fsm) - /*@globals errno, fileSystem, internalState @*/ - /*@modifies fsm, errno, fileSystem, internalState @*/ +static int fsmStat(/*@special@*/ /*@partial@*/ FSM_t fsm) + /*@globals fileSystem, internalState @*/ + /*@modifies fsm, fileSystem, internalState @*/ { - int saveerrno = errno; int rc = 0; if (fsm->path != NULL) { @@ -1526,7 +1555,9 @@ int fsmStage(FSM_t fsm, fileStage stage) /* Detect and create directories not explicitly in package. */ if (fsm->goal == FSM_PKGINSTALL) { +/*@-compdef@*/ rc = fsmNext(fsm, FSM_MKDIRS); +/*@=compdef@*/ if (!rc) fsm->mkdirsdone = 1; } @@ -1683,7 +1714,9 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; rc = fsmNext(fsm, FSM_RENAME); if (!rc) rpmMessage(RPMMESS_WARNING, - _("%s saved as %s\n"), fsm->opath, fsm->path); + _("%s saved as %s\n"), + (fsm->opath ? fsm->opath : ""), + (fsm->path ? fsm->path : "")); fsm->path = _free(fsm->path); fsm->opath = opath; } @@ -1818,7 +1851,8 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; rc = fsmNext(fsm, FSM_RENAME); if (!rc) { rpmMessage(RPMMESS_WARNING, _("%s saved as %s\n"), - fsm->opath, fsm->path); + (fsm->opath ? fsm->opath : ""), + (fsm->path ? fsm->path : "")); } fsm->path = _free(fsm->path); fsm->path = path; @@ -1887,7 +1921,8 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; if (!rc && fsm->nsuffix) { const char * opath = fsmFsPath(fsm, st, NULL, NULL); rpmMessage(RPMMESS_WARNING, _("%s created as %s\n"), - (opath ? opath : ""), fsm->path); + (opath ? opath : ""), + (fsm->path ? fsm->path : "")); opath = _free(opath); } fsm->opath = _free(fsm->opath); @@ -2057,9 +2092,9 @@ if (!(fsm->mapFlags & CPIO_ALL_HARDLINKS)) break; fsm->path, (rc < 0 ? strerror(errno) : "")); if (rc < 0) switch (errno) { - case ENOENT: rc = CPIOERR_ENOENT; break; - case ENOTEMPTY: rc = CPIOERR_ENOTEMPTY; break; - default: rc = CPIOERR_RMDIR_FAILED; break; + case ENOENT: rc = CPIOERR_ENOENT; /*@switchbreak@*/ break; + case ENOTEMPTY: rc = CPIOERR_ENOTEMPTY; /*@switchbreak@*/ break; + default: rc = CPIOERR_RMDIR_FAILED; /*@switchbreak@*/ break; } break; case FSM_CHOWN: diff --git a/lib/fsm.h b/lib/fsm.h index 2fe8e004c..98ac8d5ea 100644 --- a/lib/fsm.h +++ b/lib/fsm.h @@ -93,9 +93,12 @@ typedef enum fileStage_e { * Keeps track of the set of all hard links to a file in an archive. */ struct hardLink_s { -/*@owned@*/ struct hardLink_s * next; -/*@owned@*/ const char ** nsuffix; -/*@owned@*/ int * filex; +/*@owned@*/ /*@relnull@*/ + struct hardLink_s * next; +/*@owned@*/ + const char ** nsuffix; +/*@owned@*/ + int * filex; struct stat sb; int nlink; int linksLeft; @@ -118,23 +121,25 @@ struct fsmIterator_s { * File name and stat information. */ struct fsm_s { -/*@owned@*/ +/*@owned@*/ /*@relnull@*/ const char * path; /*!< Current file name. */ -/*@owned@*/ +/*@owned@*/ /*@relnull@*/ const char * opath; /*!< Original file name. */ +/*@relnull@*/ FD_t cfd; /*!< Payload file handle. */ +/*@relnull@*/ FD_t rfd; /*!< read: File handle. */ -/*@dependent@*/ +/*@dependent@*/ /*@relnull@*/ char * rdbuf; /*!< read: Buffer. */ -/*@owned@*/ +/*@owned@*/ /*@relnull@*/ char * rdb; /*!< read: Buffer allocated. */ size_t rdsize; /*!< read: Buffer allocated size. */ size_t rdlen; /*!< read: Number of bytes requested.*/ size_t rdnb; /*!< read: Number of bytes returned. */ FD_t wfd; /*!< write: File handle. */ -/*@dependent@*/ +/*@dependent@*/ /*@relnull@*/ char * wrbuf; /*!< write: Buffer. */ -/*@owned@*/ +/*@owned@*/ /*@relnull@*/ char * wrb; /*!< write: Buffer allocated. */ size_t wrsize; /*!< write: Buffer allocated size. */ size_t wrlen; /*!< write: Number of bytes requested.*/ @@ -142,23 +147,23 @@ struct fsm_s { /*@only@*/ /*@null@*/ FSMI_t iter; /*!< File iterator. */ int ix; /*!< Current file iterator index. */ -/*@only@*/ +/*@only@*/ /*@relnull@*/ struct hardLink_s * links; /*!< Pending hard linked file(s). */ -/*@only@*/ +/*@only@*/ /*@relnull@*/ struct hardLink_s * li; /*!< Current hard linked file(s). */ /*@kept@*/ /*@null@*/ unsigned int * archiveSize; /*!< Pointer to archive size. */ /*@kept@*/ /*@null@*/ const char ** failedFile; /*!< First file name that failed. */ -/*@shared@*/ +/*@shared@*/ /*@relnull@*/ const char * subdir; /*!< Current file sub-directory. */ /*@unused@*/ char subbuf[64]; /* XXX eliminate */ -/*@observer@*/ +/*@observer@*/ /*@relnull@*/ const char * osuffix; /*!< Old, preserved, file suffix. */ -/*@observer@*/ +/*@observer@*/ /*@relnull@*/ const char * nsuffix; /*!< New, created, file suffix. */ -/*@shared@*/ +/*@shared@*/ /*@relnull@*/ const char * suffix; /*!< Current file suffix. */ char sufbuf[64]; /* XXX eliminate */ /*@only@*/ /*@null@*/ @@ -175,13 +180,13 @@ struct fsm_s { int rc; /*!< External file stage return code. */ int commit; /*!< Commit synchronously? */ cpioMapFlags mapFlags; /*!< Bit(s) to control mapping. */ -/*@shared@*/ +/*@shared@*/ /*@relnull@*/ const char * dirName; /*!< File directory name. */ -/*@shared@*/ +/*@shared@*/ /*@relnull@*/ const char * baseName; /*!< File base name. */ -/*@shared@*/ +/*@shared@*/ /*@relnull@*/ const char * fmd5sum; /*!< Hex MD5 sum (NULL disables). */ -/*@shared@*/ +/*@shared@*/ /*@relnull@*/ const char * md5sum; /*!< Binary MD5 sum (NULL disables). */ unsigned fflags; /*!< File flags. */ @@ -215,14 +220,14 @@ extern "C" { /** * Create file state machine instance. - * @return file state machine data + * @return file state machine */ /*@only@*/ FSM_t newFSM(void) /*@*/; /** * Destroy file state machine instance. - * @param fsm file state machine data + * @param fsm file state machine * @return always NULL */ /*@null@*/ FSM_t freeFSM(/*@only@*/ /*@null@*/ FSM_t fsm) @@ -231,7 +236,7 @@ extern "C" { /** * Load external data into file state machine. - * @param fsm file state machine data + * @param fsm file state machine * @param goal * @param ts transaction set * @param fi transaction element file info @@ -252,7 +257,7 @@ int fsmSetup(FSM_t fsm, fileStage goal, /** * Clean file state machine. - * @param fsm file state machine data + * @param fsm file state machine * @return 0 on success */ int fsmTeardown(FSM_t fsm) @@ -262,7 +267,7 @@ int fsmTeardown(FSM_t fsm) /*@-exportlocal@*/ /** * Retrieve transaction set from file state machine iterator. - * @param fsm file state machine data + * @param fsm file state machine * @return transaction set */ rpmts fsmGetTs(const FSM_t fsm) @@ -270,7 +275,7 @@ rpmts fsmGetTs(const FSM_t fsm) /** * Retrieve transaction element file info from file state machine iterator. - * @param fsm file state machine data + * @param fsm file state machine * @return transaction element file info */ rpmfi fsmGetFi(/*@partial@*/ const FSM_t fsm) @@ -278,32 +283,40 @@ rpmfi fsmGetFi(/*@partial@*/ const FSM_t fsm) /** * Map next file path and action. - * @param fsm file state machine data + * @param fsm file state machine */ int fsmMapPath(FSM_t fsm) /*@modifies fsm @*/; /** * Map file stat(2) info. - * @param fsm file state machine data + * @param fsm file state machine */ int fsmMapAttrs(FSM_t fsm) /*@modifies fsm @*/; /*@=exportlocal@*/ +/** + * File state machine driver. + * @param fsm file state machine + * @param nstage next stage + * @return 0 on success + */ int fsmNext(FSM_t fsm, fileStage nstage) - /*@modifies fsm @*/; + /*@globals errno, fileSystem, internalState @*/ + /*@modifies fsm, errno, fileSystem, internalState @*/; /** * File state machine driver. - * @param fsm file state machine data + * @param fsm file state machine * @param stage next stage * @return 0 on success */ +/*@-exportlocal@*/ int fsmStage(/*@partial@*/ FSM_t fsm, fileStage stage) /*@globals errno, fileSystem, internalState @*/ /*@modifies fsm, errno, fileSystem, internalState @*/; -#define fsmUNSAFE fsmStage +/*@=exportlocal@*/ #ifdef __cplusplus } diff --git a/lib/misc.c b/lib/misc.c index 7bd6a15e2..f42c847a4 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -84,7 +84,9 @@ char ** splitString(const char * str, int length, char sep) list[i] = NULL; +/*@-nullret@*/ /* FIX: list[i] is NULL */ return list; +/*@=nullret@*/ } /*@=bounds@*/ @@ -346,11 +348,15 @@ if (_debug) fprintf(stderr, "*** GLOB maxb %d diskURL %d %*s globURL %p %s\n", (int)maxb, (int)nb, (int)nb, av[j], globURL, globURL); /*@-branchstate@*/ +#ifdef DYING if (argc == 0) argv = xmalloc((gl.gl_pathc+1) * sizeof(*argv)); else if (gl.gl_pathc > 0) +#endif argv = xrealloc(argv, (argc+gl.gl_pathc+1) * sizeof(*argv)); /*@=branchstate@*/ + + if (argv != NULL) for (i = 0; i < gl.gl_pathc; i++) { const char * globFile = &(gl.gl_pathv[i][0]); if (globRoot > globURL && globRoot[-1] == '/') @@ -378,12 +384,16 @@ fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, globURL); exit: av = _free(av); +/*@-branchstate@*/ if (rc || argvPtr == NULL) { +/*@-dependenttrans -unqualifiedtrans@*/ if (argv != NULL) for (i = 0; i < argc; i++) argv[i] = _free(argv[i]); argv = _free(argv); +/*@=dependenttrans =unqualifiedtrans@*/ } +/*@=branchstate@*/ return rc; } diff --git a/lib/poptALL.c b/lib/poptALL.c index 08370fc3c..2bee3b853 100644 --- a/lib/poptALL.c +++ b/lib/poptALL.c @@ -29,6 +29,8 @@ extern int _fps_debug; /*@unchecked@*/ extern int _fsm_debug; + +/*@unchecked@*/ extern int _fsm_threads; /*@unchecked@*/ @@ -36,6 +38,8 @@ extern int _hdr_debug; /*@unchecked@*/ extern int _psm_debug; + +/*@unchecked@*/ extern int _psm_threads; /*@unchecked@*/ diff --git a/lib/psm.c b/lib/psm.c index 78c227bf5..c755cf8f1 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -58,11 +58,11 @@ int rpmVersionCompare(Header first, Header second) NULL)) epochTwo = NULL; - if (epochOne && !epochTwo) + if (epochOne != NULL && epochTwo == NULL) return 1; - else if (!epochOne && epochTwo) + else if (epochOne == NULL && epochTwo != NULL) return -1; - else if (epochOne && epochTwo) { + else if (epochOne != NULL && epochTwo != NULL) { /*@-boundsread@*/ if (*epochOne < *epochTwo) return -1; @@ -285,6 +285,11 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, /*@-onlytrans@*/ /* FIX: te reference */ fi->te = rpmtsElement(ts, 0); /*@=onlytrans@*/ + if (fi->te == NULL) { /* XXX can't happen */ + rc = RPMRC_FAIL; + goto exit; + } + /*@-nullpass@*/ /* FIX fi->h may be null */ fi->te->h = headerLink(fi->h); /*@=nullpass@*/ @@ -585,6 +590,7 @@ static rpmRC runScript(rpmpsm psm, Header h, const char * sln, } maxPrefixLength = 0; + if (prefixes != NULL) for (i = 0; i < numPrefixes; i++) { len = strlen(prefixes[i]); if (len > maxPrefixLength) maxPrefixLength = len; @@ -597,7 +603,7 @@ static rpmRC runScript(rpmpsm psm, Header h, const char * sln, /*@-branchstate@*/ if (makeTempFile((!rpmtsChrootDone(ts) ? rootDir : "/"), &fn, &fd)) { - if (freePrefixes) free(prefixes); + if (prefixes != NULL && freePrefixes) free(prefixes); return RPMRC_FAIL; } /*@=branchstate@*/ @@ -694,6 +700,7 @@ static rpmRC runScript(rpmpsm psm, Header h, const char * sln, /*@=modobserver@*/ } + if (prefixes != NULL) for (i = 0; i < numPrefixes; i++) { sprintf(prefixBuf, "RPM_INSTALL_PREFIX%d=%s", i, prefixes[i]); xx = doputenv(prefixBuf); @@ -725,7 +732,9 @@ static rpmRC runScript(rpmpsm psm, Header h, const char * sln, psm->stepName, sln, n, v, r, argv[0], (unsigned)getpid()); unsetenv("MALLOC_CHECK_"); +/*@-nullstate@*/ xx = execv(argv[0], (char *const *)argv); +/*@=nullstate@*/ break; default: break; @@ -944,7 +953,7 @@ static rpmRC runTriggers(rpmpsm psm) if (numPackage < 0) return RPMRC_NOTFOUND; - if (fi->h != NULL) /* XXX can't happen */ + if (fi != NULL && fi->h != NULL) /* XXX can't happen */ { Header triggeredH; rpmdbMatchIterator mi; int countCorrection = psm->countCorrection; @@ -1133,14 +1142,18 @@ rpmpsm rpmpsmNew(rpmts ts, rpmte te, rpmfi fi) } static void * rpmpsmThread(void * arg) - /*@modifies psm @*/ + /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ + /*@modifies arg, rpmGlobalMacroContext, fileSystem, internalState @*/ { rpmpsm psm = arg; +/*@-unqualifiedtrans@*/ return ((void *) rpmpsmStage(psm, psm->nstage)); +/*@=unqualifiedtrans@*/ } static int rpmpsmNext(rpmpsm psm, pkgStage nstage) - /*@modifies psm @*/ + /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ + /*@modifies psm, rpmGlobalMacroContext, fileSystem, internalState @*/ { psm->nstage = nstage; if (_psm_threads) diff --git a/lib/psm.h b/lib/psm.h index 866966e02..c0d388e01 100644 --- a/lib/psm.h +++ b/lib/psm.h @@ -68,9 +68,11 @@ struct rpmpsm_s { rpmts ts; /*!< transaction set */ /*@dependent@*/ /*@null@*/ rpmte te; /*!< current transaction element */ -/*@refcounted@*/ +/*@refcounted@*/ /*@relnull@*/ rpmfi fi; /*!< transaction element file info */ +/*@relnull@*/ FD_t cfd; /*!< Payload file handle. */ +/*@relnull@*/ FD_t fd; /*!< Repackage file handle. */ Header oh; /*!< Repackage header. */ /*@null@*/ @@ -136,13 +138,13 @@ rpmpsm XrpmpsmUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmpsm psm, * @param msg * @return new package state machine reference */ -/*@unused@*/ /*@newref@*/ +/*@unused@*/ /*@newref@*/ /*@null@*/ rpmpsm rpmpsmLink (/*@null@*/ rpmpsm psm, /*@null@*/ const char * msg) /*@modifies psm @*/; /** @todo Remove debugging entry from the ABI. */ /*@-exportlocal@*/ -/*@newref@*/ +/*@newref@*/ /*@null@*/ rpmpsm XrpmpsmLink (/*@null@*/ rpmpsm psm, /*@null@*/ const char * msg, const char * fn, unsigned ln) /*@modifies psm @*/; @@ -166,6 +168,7 @@ rpmpsm rpmpsmFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmpsm psm) * @param fi file info set * @return new package state machine */ +/*@null@*/ rpmpsm rpmpsmNew(rpmts ts, /*@null@*/ rpmte te, rpmfi fi) /*@modifies ts, fi @*/; diff --git a/lib/query.c b/lib/query.c index d14af10a1..c8102dc5c 100644 --- a/lib/query.c +++ b/lib/query.c @@ -480,7 +480,9 @@ restart: } /* Read list of packages from manifest. */ +/*@-nullstate@*/ /* FIX: *av may be NULL */ res = rpmReadPackageManifest(fd, &ac, &av); +/*@=nullstate@*/ if (res != RPMRC_OK) { rpmError(RPMERR_MANIFEST, _("%s: not an rpm package (or package manifest): %s\n"), diff --git a/lib/rpmchecksig.c b/lib/rpmchecksig.c index 9207cf2a3..de66dd9f2 100644 --- a/lib/rpmchecksig.c +++ b/lib/rpmchecksig.c @@ -27,8 +27,9 @@ static int _print_pkts = 0; /** */ /*@-boundsread@*/ -static int manageFile(FD_t *fdp, const char **fnp, int flags, - /*@unused@*/ int rc) +static int manageFile(/*@out@*/ FD_t *fdp, + /*@null@*/ /*@out@*/ const char **fnp, + int flags, /*@unused@*/ int rc) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies *fdp, *fnp, rpmGlobalMacroContext, fileSystem, internalState @*/ @@ -36,9 +37,8 @@ static int manageFile(FD_t *fdp, const char **fnp, int flags, const char *fn; FD_t fd; - if (fdp == NULL) { /* programmer error */ + if (fdp == NULL) /* programmer error */ return 1; - } /*@-boundswrite@*/ /* close and reset *fdp to NULL */ @@ -49,7 +49,7 @@ static int manageFile(FD_t *fdp, const char **fnp, int flags, } /* open a file and set *fdp */ - if (*fdp == NULL && fnp && *fnp) { + if (*fdp == NULL && fnp != NULL && *fnp != NULL) { fd = Fopen(*fnp, ((flags & O_WRONLY) ? "w.ufdio" : "r.ufdio")); if (fd == NULL || Ferror(fd)) { rpmError(RPMERR_OPEN, _("%s: open failed: %s\n"), *fnp, @@ -67,7 +67,7 @@ static int manageFile(FD_t *fdp, const char **fnp, int flags, rpmError(RPMERR_MAKETEMP, _("makeTempFile failed\n")); return 1; } - if (fnp) + if (fnp != NULL) *fnp = fn; *fdp = fdLink(fd, "manageFile return"); fd = fdFree(fd, "manageFile return"); @@ -76,9 +76,8 @@ static int manageFile(FD_t *fdp, const char **fnp, int flags, /*@=boundswrite@*/ /* no operation */ - if (*fdp && fnp && *fnp) { + if (*fdp != NULL && fnp != NULL && *fnp != NULL) return 0; - } /* XXX never reached */ return 1; diff --git a/lib/rpmds.c b/lib/rpmds.c index 50cb1cf7f..78cc7da2d 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -605,10 +605,13 @@ assert(argv[ac] != NULL); t = stpcpy(t, argv[ac]) + 1; } av[ac] = NULL; +/*@-nullret@*/ return av; +/*@=nullret@*/ } /*@=bounds@*/ +/*@null@*/ static rpmds rpmdsDup(const rpmds ods) /*@modifies ods @*/ { @@ -707,6 +710,8 @@ int save; } /*@=branchstate@*/ ds = *dsp; + if (ds == NULL) + return -1; /* * Add new entries. diff --git a/lib/rpmds.h b/lib/rpmds.h index ec44887f2..9a027f0cd 100644 --- a/lib/rpmds.h +++ b/lib/rpmds.h @@ -85,12 +85,12 @@ rpmds XrpmdsUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmds ds, * @param msg * @return new dependency set reference */ -/*@unused@*/ /*@newref@*/ +/*@unused@*/ /*@newref@*/ /*@null@*/ rpmds rpmdsLink (/*@null@*/ rpmds ds, /*@null@*/ const char * msg) /*@modifies ds @*/; /** @todo Remove debugging entry from the ABI. */ -/*@newref@*/ +/*@newref@*/ /*@null@*/ rpmds XrpmdsLink (/*@null@*/ rpmds ds, /*@null@*/ const char * msg, const char * fn, unsigned ln) /*@modifies ds @*/; diff --git a/lib/rpmfi.c b/lib/rpmfi.c index eae07fdde..54522a889 100644 --- a/lib/rpmfi.c +++ b/lib/rpmfi.c @@ -734,6 +734,9 @@ assert(p != NULL); fn = xrealloc(fn, fileAlloced); } /*@=branchstate@*/ + + if (fn == NULL) /* XXX can't happen */ + continue; *fn = '\0'; fnlen = stpcpy( stpcpy(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn; @@ -766,7 +769,9 @@ assert(p != NULL); } if (j < 0) continue; +/*@-nullderef@*/ /* FIX: fModes may be NULL */ ft = whatis(fModes[i]); +/*@=nullderef@*/ /* On install, a relocate to NULL means skip the path. */ if (relocations[j].newPath == NULL) { @@ -928,7 +933,9 @@ assert(p != NULL); baseNames = hfd(baseNames, RPM_STRING_ARRAY_TYPE); dirNames = hfd(dirNames, RPM_STRING_ARRAY_TYPE); +/*@-dependenttrans@*/ fn = _free(fn); +/*@=dependenttrans@*/ return h; } diff --git a/lib/rpmfi.h b/lib/rpmfi.h index 0993be0bb..666c6d2ca 100644 --- a/lib/rpmfi.h +++ b/lib/rpmfi.h @@ -44,9 +44,9 @@ struct rpmfi_s { /*@only@*/ /*?null?*/ const char ** dnl; /*!< Directory name(s) (from header) */ -/*@only@*/ /*?null?*/ +/*@only@*/ /*@relnull@*/ const char ** fmd5s; /*!< File MD5 sum(s) (from header) */ -/*@only@*/ /*?null?*/ +/*@only@*/ /*@relnull@*/ const char ** flinks; /*!< File link(s) (from header) */ /*@only@*/ /*@null@*/ const char ** flangs; /*!< File lang(s) (from header) */ @@ -102,7 +102,7 @@ struct rpmfi_s { int_32 fc; /*!< No. of files. */ /*=============================*/ -/*@dependent@*/ +/*@dependent@*/ /*@relnull@*/ rpmte te; HGE_t hge; /*!< Vector to headerGetEntry() */ @@ -115,7 +115,7 @@ struct rpmfi_s { gid_t gid; /*!< File gid (default). */ uint_32 flags; /*!< File flags (default). */ fileAction action; /*!< File disposition (default). */ -/*@owned@*/ +/*@owned@*/ /*@relnull@*/ fileAction * actions; /*!< File disposition(s). */ /*@owned@*/ struct fingerPrint_s * fps; /*!< File fingerprint(s). */ @@ -126,7 +126,7 @@ struct rpmfi_s { /*@unused@*/ int_32 * odil; /*!< Original dirindex(s) (from header) */ -/*@only@*/ +/*@only@*/ /*@relnull@*/ unsigned char * md5s; /*!< File md5 sums in binary. */ /*@only@*/ /*@null@*/ @@ -197,7 +197,7 @@ rpmfi XrpmfiUnlink (/*@killref@*/ /*@only@*/ /*@null@*/ rpmfi fi, * @param msg * @return new file info set reference */ -/*@unused@*/ +/*@unused@*/ /*@null@*/ rpmfi rpmfiLink (/*@null@*/ rpmfi fi, /*@null@*/ const char * msg) /*@modifies fi @*/; @@ -208,6 +208,7 @@ rpmfi rpmfiLink (/*@null@*/ rpmfi fi, /*@null@*/ const char * msg) * @param ln * @return NULL always */ +/*@null@*/ rpmfi XrpmfiLink (/*@null@*/ rpmfi fi, /*@null@*/ const char * msg, const char * fn, unsigned ln) /*@modifies fi @*/; diff --git a/lib/rpminstall.c b/lib/rpminstall.c index 64b3c17e5..f0702c004 100644 --- a/lib/rpminstall.c +++ b/lib/rpminstall.c @@ -601,7 +601,9 @@ maybe_manifest: } /* Read list of packages from manifest. */ +/*@-nullstate@*/ /* FIX: *eiu->argv can be NULL */ rc = rpmReadPackageManifest(eiu->fd, &eiu->argc, &eiu->argv); +/*@=nullstate@*/ if (rc != RPMRC_OK) rpmError(RPMERR_MANIFEST, _("%s: not an rpm package (or package manifest): %s\n"), *eiu->fnp, Fstrerror(eiu->fd)); @@ -1024,7 +1026,7 @@ IDTX IDTXglob(rpmts ts, const char * globstr, rpmTag tag) tidp = NULL; /*@-branchstate@*/ - if (hge(h, tag, &type, (void **) &tidp, &count) && tidp) { + if (hge(h, tag, &type, (void **) &tidp, &count) && tidp != NULL) { idtx = IDTXgrow(idtx, 1); if (idtx == NULL || idtx->idt == NULL) diff --git a/lib/rpmrc.c b/lib/rpmrc.c index 1dbc4b1a8..284f4570f 100644 --- a/lib/rpmrc.c +++ b/lib/rpmrc.c @@ -28,7 +28,7 @@ const char * macrofiles = MACROFILES; /*@observer@*/ /*@unchecked@*/ static const char * platform = "/etc/rpm/platform"; -/*@only@*/ /*@relnul@*/ /*@unchecked@*/ +/*@only@*/ /*@relnull@*/ /*@unchecked@*/ static const char ** platpat = NULL; /*@unchecked@*/ static int nplatpat = 0; diff --git a/lib/rpmte.c b/lib/rpmte.c index 9003f53fe..e1e882f6d 100644 --- a/lib/rpmte.c +++ b/lib/rpmte.c @@ -574,7 +574,7 @@ fprintf(stderr, "*** tsi %p ++ %s:%d\n", tsi, fn, ln); * @param tsi transaction element iterator * @return transaction element, NULL on termination */ -static /*@dependent@*/ /*@null@*/ +static /*@null@*/ /*@dependent@*/ rpmte rpmtsiNextElement(rpmtsi tsi) /*@modifies tsi @*/ { diff --git a/lib/rpmte.h b/lib/rpmte.h index 0ac558fcd..6e1c78d2e 100644 --- a/lib/rpmte.h +++ b/lib/rpmte.h @@ -59,7 +59,7 @@ struct tsortInfo_s { struct rpmte_s { rpmElementType type; /*!< Package disposition (installed/removed). */ -/*@refcounted@*/ /*@null@*/ +/*@refcounted@*/ /*@relnull@*/ Header h; /*!< Package header. */ /*@only@*/ const char * NEVR; /*!< Package name-version-release. */ @@ -324,6 +324,7 @@ rpmte rpmteParent(rpmte te) * @param pte new parent transaction element * @return previous parent transaction element */ +/*@null@*/ rpmte rpmteSetParent(rpmte te, rpmte pte) /*@modifies te @*/; diff --git a/lib/rpmts.h b/lib/rpmts.h index f06aee4eb..26b98333e 100644 --- a/lib/rpmts.h +++ b/lib/rpmts.h @@ -115,6 +115,7 @@ struct rpmts_s { /*@null@*/ int (*solve) (rpmts ts, rpmds key, const void * data) /*@modifies ts @*/; /*!< Search for NEVRA key. */ +/*@relnull@*/ const void * solveData; /*!< Solve callback data */ int nsuggests; /*!< No. of depCheck suggestions. */ /*@only@*/ /*@null@*/ @@ -722,8 +723,9 @@ int rpmtsNElements(rpmts ts) * Return (ordered) transaction set element. * @param ts transaction set * @param ix transaction element index - * @return transaction element + * @return transaction element (or NULL) */ +/*@null@*/ /*@dependent@*/ rpmte rpmtsElement(rpmts ts, int ix) /*@*/; @@ -829,8 +831,8 @@ int rpmtsSetNotifyCallback(rpmts ts, */ /*@newref@*/ rpmts rpmtsCreate(void) - /*@globals rpmGlobalMacroContext @*/ - /*@modifies rpmGlobalMacroContext @*/; + /*@globals rpmGlobalMacroContext, internalState @*/ + /*@modifies rpmGlobalMacroContext, internalState @*/; /** \ingroup rpmts * Add package to be installed to transaction set. diff --git a/lib/transaction.c b/lib/transaction.c index 0c8129d95..41ceba2f5 100644 --- a/lib/transaction.c +++ b/lib/transaction.c @@ -864,7 +864,7 @@ static void skipFiles(const rpmts ts, rpmfi fi) /* * Skip i18n language specific files. */ - if (fi->flangs && languages && *fi->flangs[i]) { + if (languages != NULL && fi->flangs != NULL && *fi->flangs[i]) { const char **lang, *l, *le; for (lang = languages; *lang != NULL; lang++) { if (!strcmp(*lang, "all")) @@ -957,11 +957,13 @@ static void skipFiles(const rpmts ts, rpmfi fi) } } +/*@-dependenttrans@*/ if (netsharedPaths) freeSplitString(netsharedPaths); #ifdef DYING /* XXX freeFi will deal with this later. */ fi->flangs = _free(fi->flangs); #endif if (languages) freeSplitString((char **)languages); +/*@=dependenttrans@*/ } /*@=bounds@*/ /*@=mustmod@*/ @@ -1464,6 +1466,7 @@ ts->ms_repackage += rpmswDiff(rpmswNow(&ts->end), &ts->begin)/1000; continue; /* XXX can't happen */ psm = rpmpsmNew(ts, p, fi); +assert(psm != NULL); psm->unorderedSuccessor = (rpmtsiOc(pi) >= rpmtsUnorderedSuccessors(ts, -1) ? 1 : 0); @@ -1524,7 +1527,9 @@ ts->ms_repackage += rpmswDiff(rpmswNow(&ts->end), &ts->begin)/1000; fi->fstates = NULL; fi->actions = NULL; +/*@-nullstate@*/ /* FIX: fi->actions is NULL */ fi = rpmfiFree(fi); +/*@=nullstate@*/ savep = rpmtsSetRelocateElement(ts, p); fi = rpmfiNew(ts, p->h, RPMTAG_BASENAMES, 1); diff --git a/lib/verify.c b/lib/verify.c index 29c0cfda5..36af08cc6 100644 --- a/lib/verify.c +++ b/lib/verify.c @@ -224,6 +224,9 @@ static int rpmVerifyScript(/*@unused@*/ QVA_t qva, rpmts ts, rpmpsm psm = rpmpsmNew(ts, NULL, fi); int rc = 0; + if (psm == NULL) /* XXX can't happen */ + return rc; + if (scriptFd != NULL) rpmtsSetScriptFd(psm->ts, scriptFd); diff --git a/rpmio/digest.c b/rpmio/digest.c index b587324a7..1cca844c4 100644 --- a/rpmio/digest.c +++ b/rpmio/digest.c @@ -35,7 +35,8 @@ struct DIGEST_CTX_s { DIGEST_CTX rpmDigestDup(DIGEST_CTX octx) { - DIGEST_CTX nctx = memcpy(xcalloc(1, sizeof(*nctx)), octx, sizeof(*nctx)); + DIGEST_CTX nctx; + nctx = memcpy(xcalloc(1, sizeof(*nctx)), octx, sizeof(*nctx)); nctx->param = memcpy(xcalloc(1, nctx->paramlen), octx->param, nctx->paramlen); return nctx; } @@ -98,6 +99,9 @@ DPRINTF((stderr, "*** Init(%x) ctx %p param %p\n", flags, ctx, ctx->param)); int rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len) { + if (ctx == NULL) + return -1; + DPRINTF((stderr, "*** Update(%p,%p,%d) param %p \"%s\"\n", ctx, data, len, ctx->param, ((char *)data))); /*@-boundsread@*/ return (*ctx->Update) (ctx->param, data, len); @@ -119,13 +123,16 @@ static union _dendian { /*@-boundswrite@*/ int -rpmDigestFinal(/*@only@*/ DIGEST_CTX ctx, /*@out@*/ void ** datap, - /*@out@*/ size_t *lenp, int asAscii) +rpmDigestFinal(DIGEST_CTX ctx, void ** datap, size_t *lenp, int asAscii) { - uint32 * digest = xmalloc(ctx->digestlen); + uint32 * digest; char * t; int i; + if (ctx == NULL) + return -1; + digest = xmalloc(ctx->digestlen); + DPRINTF((stderr, "*** Final(%p,%p,%p,%d) param %p digest %p\n", ctx, datap, lenp, asAscii, ctx->param, digest)); /*@-noeffectuncon@*/ /* FIX: check rc */ (void) (*ctx->Digest) (ctx->param, digest); diff --git a/rpmio/fts.c b/rpmio/fts.c index f11c17cb2..85ecbf89e 100644 --- a/rpmio/fts.c +++ b/rpmio/fts.c @@ -299,6 +299,9 @@ Fts_close(FTS * sp) register FTSENT *freep, *p; int saved_errno; + if (sp == NULL) + return 0; + /* * This still works if we haven't read anything -- the dummy structure * points to the root list, so we step through to the end of the root @@ -361,7 +364,7 @@ Fts_read(FTS * sp) int saved_errno; /* If finished or unrecoverable error, return NULL. */ - if (sp->fts_cur == NULL || ISSET(FTS_STOP)) + if (sp == NULL || sp->fts_cur == NULL || ISSET(FTS_STOP)) return (NULL); /* Set current node pointer. */ diff --git a/rpmio/fts.h b/rpmio/fts.h index 487eb7dc8..ff9c613da 100644 --- a/rpmio/fts.h +++ b/rpmio/fts.h @@ -185,7 +185,7 @@ FTSENT *Fts_children (FTS * sp, int instr) __THROW * @param sp file hierarchy state * @return 0 on sucess, -1 on error */ -int Fts_close (/*@only@*/ FTS * sp) __THROW +int Fts_close (/*@only@*/ /*@null@*/ FTS * sp) __THROW /*@globals fileSystem, internalState @*/ /*@modifies *sp, fileSystem, internalState @*/; @@ -208,7 +208,7 @@ FTS *Fts_open (char * const * argv, int options, * @return file set member */ /*@null@*/ -FTSENT *Fts_read (FTS * sp) __THROW +FTSENT *Fts_read (/*@null@*/ FTS * sp) __THROW /*@globals fileSystem, internalState @*/ /*@modifies *sp, fileSystem, internalState @*/; diff --git a/rpmio/rpmio_internal.h b/rpmio/rpmio_internal.h index 4256021c0..64eebd59f 100644 --- a/rpmio/rpmio_internal.h +++ b/rpmio/rpmio_internal.h @@ -356,6 +356,7 @@ void fdPush(FD_t fd, FDIO_t io, void * fp, int fdno) /** \ingroup rpmio */ +/*@-uniondef@*/ /*@unused@*/ static inline void fdstat_enter(/*@null@*/ FD_t fd, int opx) /*@globals internalState @*/ @@ -396,6 +397,7 @@ void fdstat_exit(/*@null@*/ FD_t fd, int opx, ssize_t rc) fd->stats->begin = end; /* structure assignment */ /*@=boundswrite@*/ } +/*@=uniondef@*/ /** \ingroup rpmio */ diff --git a/rpmio/rpmpgp.h b/rpmio/rpmpgp.h index f4061015c..b3102e09b 100644 --- a/rpmio/rpmpgp.h +++ b/rpmio/rpmpgp.h @@ -1378,7 +1378,7 @@ DIGEST_CTX rpmDigestInit(pgpHashAlgo hashalgo, rpmDigestFlags flags) * @param len no. bytes of data * @return 0 on success */ -int rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len) +int rpmDigestUpdate(/*@null@*/ DIGEST_CTX ctx, const void * data, size_t len) /*@modifies ctx @*/; /** \ingroup rpmio @@ -1392,7 +1392,7 @@ int rpmDigestUpdate(DIGEST_CTX ctx, const void * data, size_t len) * @param asAscii return digest as ascii string? * @return 0 on success */ -int rpmDigestFinal(/*@only@*/ DIGEST_CTX ctx, +int rpmDigestFinal(/*@only@*/ /*@null@*/ DIGEST_CTX ctx, /*@null@*/ /*@out@*/ void ** datap, /*@null@*/ /*@out@*/ size_t * lenp, int asAscii) /*@modifies *datap, *lenp @*/; diff --git a/rpmio/rpmsq.c b/rpmio/rpmsq.c index a27c84b33..fe58d0983 100644 --- a/rpmio/rpmsq.c +++ b/rpmio/rpmsq.c @@ -1,13 +1,32 @@ +/*@-unrecog@*/ /** \ingroup rpmio * \file rpmio/rpmsq.c */ #include "system.h" - + +#if defined(__LCLINT__) +struct qelem; +/*@-exportheader@*/ +extern void insque(struct qelem * __elem, struct qelem * __prev) + /*@modifies __elem, prev @*/; +extern void remque(struct qelem * __elem) + /*@modifies __elem @*/; +/*@=exportheader@*/ +#endif + +#include +#include +#include +#include + #if defined(HAVE_PTHREAD_H) && !defined(__LCLINT__) #include +/*@unchecked@*/ +static pthread_mutex_t rpmsigTbl_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; + #define DO_LOCK() pthread_mutex_lock(&rpmsigTbl_lock); #define DO_UNLOCK() pthread_mutex_unlock(&rpmsigTbl_lock); #define INIT_LOCK() \ @@ -36,14 +55,14 @@ #define DO_LOCK() #define DO_UNLOCK() #define INIT_LOCK() -#define ADD_REF(__tbl) -#define SUB_REF(__tbl) +#define ADD_REF(__tbl) /*@-noeffect@*/ (0) /*@=noeffect@*/ +#define SUB_REF(__tbl) /*@-noeffect@*/ (0) /*@=noeffect@*/ #define CLEANUP_HANDLER(__handler, __arg, __oldtypeptr) #define CLEANUP_RESET(__execute, __oldtype) #define SAME_THREAD(_a, _b) (42) -#define ME() (((void *))getpid()) +#define ME() (((void *)getpid())) #endif /* HAVE_PTHREAD_H */ @@ -57,10 +76,14 @@ int _rpmsq_debug = _RPMSQ_DEBUG; /*@unchecked@*/ static struct rpmsqElem rpmsqRock; + +/*@-compmempass@*/ /*@unchecked@*/ rpmsq rpmsqQueue = &rpmsqRock; +/*@=compmempass@*/ -int rpmsqInsert(void * elem, void * prev) +/*@-mustmod@*/ +int rpmsqInsert(void * elem, /*@unused@*/ void * prev) { rpmsq sq = (rpmsq) elem; int ret = -1; @@ -78,17 +101,24 @@ fprintf(stderr, " Insert(%p): %p\n", ME(), sq); sq->reaped = 0; sq->status = 0; sq->reaper = 1; +/*@-bounds@*/ sq->pipes[0] = sq->pipes[1] = -1; +/*@=bounds@*/ +/*@-unqualifiedtrans@*/ sq->id = ME(); +/*@=unqualifiedtrans@*/ ret = pthread_mutex_init(&sq->mutex, NULL); ret = pthread_cond_init(&sq->cond, NULL); +#if !defined(__LCLINT__) /* XXX FIXME */ insque(elem, (prev ? prev : rpmsqQueue)); +#endif ret = sigrelse(SIGCHLD); } } return ret; } +/*@=mustmod@*/ int rpmsqRemove(void * elem) { @@ -109,9 +139,11 @@ fprintf(stderr, " Remove(%p): %p\n", ME(), sq); ret = pthread_cond_destroy(&sq->cond); ret = pthread_mutex_destroy(&sq->mutex); sq->id = NULL; - if (sq->pipes[1]) close(sq->pipes[1]); - if (sq->pipes[0]) close(sq->pipes[0]); +/*@-bounds@*/ + if (sq->pipes[1]) ret = close(sq->pipes[1]); + if (sq->pipes[0]) ret = close(sq->pipes[0]); sq->pipes[0] = sq->pipes[1] = -1; +/*@=bounds@*/ #ifdef NOTYET /* rpmpsmWait debugging message needs */ sq->reaper = 1; sq->status = 0; @@ -127,14 +159,11 @@ fprintf(stderr, " Remove(%p): %p\n", ME(), sq); /*@unchecked@*/ sigset_t rpmsqCaught; -/*@unchecked@*/ -static pthread_mutex_t rpmsigTbl_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; - /*@unchecked@*/ /*@-fullinitblock@*/ static struct rpmsig_s { int signum; - void (*handler) (int signum, siginfo_t * info, void * context); + void (*handler) (int signum, void * info, void * context); int active; struct sigaction oact; } rpmsigTbl[] = { @@ -155,7 +184,10 @@ static struct rpmsig_s { /*@=fullinitblock@*/ /*@-incondefs@*/ -void rpmsqAction(int signum, siginfo_t * info, void * context) +void rpmsqAction(int signum, + /*@unused@*/ void * info, /*@unused@*/ void * context) + /*@globals rpmsqQueue @*/ + /*@modifies rpmsqQueue @*/ { int save = errno; rpmsig tbl; @@ -186,7 +218,9 @@ void rpmsqAction(int signum, siginfo_t * info, void * context) /*@innercontinue@*/ continue; sq->reaped = reaped; sq->status = status; +#if defined(HAVE_PTHREAD_H) && !defined(__LCLINT__) (void) pthread_cond_signal(&sq->cond); +#endif /*@innerbreak@*/ break; } } @@ -201,6 +235,8 @@ void rpmsqAction(int signum, siginfo_t * info, void * context) /*@=incondefs@*/ int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler) + /*@globals rpmsigTbl @*/ + /*@modifies rpmsigTbl @*/ { int tblsignum = (signum >= 0 ? signum : -signum); struct sigaction sa; @@ -208,8 +244,10 @@ int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler) int ret = -1; DO_LOCK (); +#if !defined(__LCLINT__) if (rpmsqQueue->id == NULL) rpmsqQueue->id = ME(); +#endif for (tbl = rpmsigTbl; tbl->signum >= 0; tbl++) { if (tblsignum != tbl->signum) continue; @@ -217,13 +255,15 @@ int rpmsqEnable(int signum, /*@null@*/ rpmsqAction_t handler) if (signum >= 0) { /* Enable. */ if (ADD_REF(tbl) <= 0) { (void) sigdelset(&rpmsqCaught, tbl->signum); - sigemptyset (&sa.sa_mask); + (void) sigemptyset (&sa.sa_mask); +/*@-compdef -type @*/ sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = (handler != NULL ? handler : tbl->handler); if (sigaction(tbl->signum, &sa, &tbl->oact) < 0) { SUB_REF(tbl); break; } +/*@=compdef =type @*/ tbl->active = 1; /* XXX just in case */ if (handler != NULL) tbl->handler = handler; @@ -265,18 +305,22 @@ fprintf(stderr, " Enable(%p): %p\n", ME(), sq); pid = fork(); if (pid < (pid_t) 0) { /* fork failed. */ +/*@-bounds@*/ xx = close(sq->pipes[0]); xx = close(sq->pipes[1]); sq->pipes[0] = sq->pipes[1] = -1; +/*@=bounds@*/ goto out; } else if (pid == (pid_t) 0) { /* Child. */ int yy; /* Block to permit parent to wait. */ +/*@-bounds@*/ xx = close(sq->pipes[1]); xx = read(sq->pipes[0], &yy, sizeof(yy)); xx = close(sq->pipes[0]); sq->pipes[0] = sq->pipes[1] = -1; +/*@=bounds@*/ #ifdef _RPMSQ_DEBUG /*@-modfilesys@*/ @@ -297,10 +341,12 @@ fprintf(stderr, " Parent(%p): %p child %d\n", ME(), sq, sq->child); #endif #ifdef DYING +/*@-bounds@*/ /* Unblock child. */ xx = close(sq->pipes[0]); xx = close(sq->pipes[1]); sq->pipes[0] = sq->pipes[1] = -1; +/*@=bounds@*/ #endif } @@ -317,7 +363,7 @@ out: */ static int rpmsqWaitUnregister(rpmsq sq) /*@globals fileSystem, internalState @*/ - /*@modifies fileSystem, internalState @*/ + /*@modifies sq, fileSystem, internalState @*/ { struct rpmsw_s end; int same_thread = 0; @@ -330,11 +376,13 @@ static int rpmsqWaitUnregister(rpmsq sq) ret = pthread_mutex_lock(&sq->mutex); /* Start the child. */ +/*@-bounds@*/ if (sq->pipes[0] >= 0) xx = close(sq->pipes[0]); if (sq->pipes[1] >= 0) xx = close(sq->pipes[1]); sq->pipes[0] = sq->pipes[1] = -1; +/*@=bounds@*/ (void) rpmswNow(&sq->begin); @@ -347,7 +395,9 @@ static int rpmsqWaitUnregister(rpmsq sq) } /*@=infloops@*/ +/*@-uniondef@*/ sq->msecs = rpmswDiff(rpmswNow(&end), &sq->begin)/1000; +/*@=uniondef@*/ sq->script_msecs += sq->msecs; if (same_thread) @@ -432,6 +482,8 @@ fprintf(stderr, " Thread(%p): %p\n", ME(), pth); */ static void sigchld_cancel (void *arg) + /*@globals fileSystem, internalState @*/ + /*@modifies fileSystem, internalState @*/ { pid_t child = *(pid_t *) arg; pid_t result; @@ -453,6 +505,7 @@ sigchld_cancel (void *arg) /** * Execute a command, returning its status. */ +/*@-bounds@*/ int rpmsqExecve (const char ** argv) { @@ -476,8 +529,8 @@ rpmsqExecve (const char ** argv) } DO_UNLOCK (); - sigemptyset (&newMask); - sigaddset (&newMask, SIGCHLD); + (void) sigemptyset (&newMask); + (void) sigaddset (&newMask, SIGCHLD); if (sigprocmask (SIG_BLOCK, &newMask, &oldMask) < 0) { DO_LOCK (); if (SUB_REF (rpmsigTbl_sigchld) == 0) @@ -529,3 +582,5 @@ out: DO_UNLOCK (); return status; } +/*@=bounds@*/ +/*@=unrecog@*/ diff --git a/rpmio/rpmsq.h b/rpmio/rpmsq.h index 04fcf5e84..6d80f7853 100644 --- a/rpmio/rpmsq.h +++ b/rpmio/rpmsq.h @@ -6,18 +6,23 @@ * */ -#include -#include -#include -#include /* XXX insque(3)/remque(3) protos. */ - #include +/** + */ typedef struct rpmsig_s * rpmsig; +/** + */ typedef struct rpmsqElem * rpmsq; -typedef void (*rpmsqAction_t) (int signum, siginfo_t *info, void *context) +/** + * Default signal handler prototype. + * @param signum signal number + * @param info (siginfo_t) signal info + * @param context signal context + */ +typedef void (*rpmsqAction_t) (int signum, void * info, void * context) /*@*/; /*@-redecl@*/ @@ -44,8 +49,10 @@ struct rpmsqElem { pthread_cond_t cond; }; +/*@-exportlocal@*/ /*@unchecked@*/ extern rpmsq rpmsqQueue; +/*@=exportlocal@*/ /*@unchecked@*/ extern sigset_t rpmsqCaught; @@ -55,21 +62,38 @@ extern sigset_t rpmsqCaught; #endif /** + * Insert node into from queue. + * @param elem node to link + * @param prev previous node from queue + * @return 0 on success */ +/*@-exportlocal@*/ int rpmsqInsert(/*@null@*/ void * elem, /*@null@*/ void * prev) - /*@globals rpmsqQueue @*/ - /*@modifies elem, rpmsqQueue @*/; - -/** - */ -int rpmsqRemove(/*@null@*/ void * elem) /*@modifies elem @*/; +/*@=exportlocal@*/ /** + * Remove node from queue. + * @param elem node to link + * @return 0 on success */ -void rpmsqAction(int signum, siginfo_t * info, void * context) - /*@globals rpmsqCaught, fileSystem @*/ - /*@modifies rpmsqCaught, fileSystem @*/; +/*@-exportlocal@*/ +int rpmsqRemove(/*@null@*/ void * elem) + /*@globals fileSystem, internalState @*/ + /*@modifies elem, fileSystem, internalState @*/; +/*@=exportlocal@*/ + +/** + * Default signal handler. + * @param signum signal number + * @param info (siginfo_t) signal info + * @param context signal context + */ +/*@-exportlocal@*/ +void rpmsqAction(int signum, void * info, void * context) + /*@globals rpmsqCaught, errno, fileSystem @*/ + /*@modifies rpmsqCaught, errno, fileSystem @*/; +/*@=exportlocal@*/ /** * Enable or disable a signal handler. @@ -106,14 +130,15 @@ pid_t rpmsqWait(rpmsq sq) * @return 0 on success */ int rpmsqThread(void * (*start) (void * arg), void * arg) - /*@globals fileSystem, internalState @*/ - /*@modifies fileSystem, internalState @*/; + /*@globals internalState @*/ + /*@modifies internalState @*/; /** * Execute a command, returning its status. */ int rpmsqExecve (const char ** argv) - /*@*/; + /*@globals fileSystem, internalState @*/ + /*@modifies fileSystem, internalState @*/; #ifdef __cplusplus } diff --git a/rpmio/rpmsw.c b/rpmio/rpmsw.c index 6c6d9af7c..4d521deb2 100644 --- a/rpmio/rpmsw.c +++ b/rpmio/rpmsw.c @@ -8,8 +8,10 @@ #if defined(__LCLINT__) /*@-exportheader@*/ -extern int nanosleep(const struct timespec *req, /*@out@*/ struct timespec *rem) - /*@modifies rem @*/; +extern int nanosleep(const struct timespec *__requested_time, + /*@out@*/ /*@null@*/ struct timespec *__remaining) + /*@globals errno @*/ + /*@modifies *__remaining, errno @*/; /*@=exportheader@*/ #endif @@ -153,7 +155,9 @@ static rpmtime_t rpmswCalibrate(void) int rc; int i; +/*@-uniondef@*/ (void) rpmswNow(&begin); +/*@=uniondef@*/ req.tv_sec = 0; req.tv_nsec = 20 * 1000 * 1000; for (i = 0; i < 100; i++) { @@ -166,7 +170,9 @@ static rpmtime_t rpmswCalibrate(void) break; req = rem; /* structure assignment */ } +/*@-uniondef@*/ ticks = rpmswDiff(rpmswNow(&end), &begin); +/*@=uniondef@*/ return ticks; } @@ -199,7 +205,9 @@ rpmtime_t rpmswInit(void) /* Start wall clock. */ rpmsw_type = 0; +/*@-uniondef@*/ (void) rpmswNow(&begin); +/*@=uniondef@*/ /* Get no. of cycles in 20ms nanosleep */ rpmsw_type = 1; @@ -209,7 +217,9 @@ rpmtime_t rpmswInit(void) /* Compute wall clock delta in usecs. */ rpmsw_type = 0; +/*@-uniondef@*/ usecs = rpmswDiff(rpmswNow(&end), &begin); +/*@=uniondef@*/ rpmsw_type = 1; @@ -224,8 +234,10 @@ rpmtime_t rpmswInit(void) #endif /* Calculate timing overhead in usecs. */ +/*@-uniondef@*/ (void) rpmswNow(&begin); usecs = rpmswDiff(rpmswNow(&end), &begin); +/*@=uniondef@*/ rpmsw_overhead *= i; rpmsw_overhead += usecs; @@ -241,7 +253,9 @@ rpmtime_t rpmswInit(void) int rpmswEnter(rpmop op) { op->count++; +/*@-uniondef@*/ (void) rpmswNow(&op->begin); +/*@=uniondef@*/ return 0; } @@ -249,7 +263,9 @@ int rpmswExit(rpmop op, ssize_t rc) { struct rpmsw_s end; +/*@-uniondef@*/ op->usecs += rpmswDiff(rpmswNow(&end), &op->begin); +/*@=uniondef@*/ if (rc > 0) op->bytes += rc; return 0; diff --git a/rpmio/rpmsw.h b/rpmio/rpmsw.h index 91f9d9cb4..48bcf1b20 100644 --- a/rpmio/rpmsw.h +++ b/rpmio/rpmsw.h @@ -61,9 +61,11 @@ rpmtime_t rpmswDiff(/*@null@*/ rpmsw end, /*@null@*/ rpmsw begin) /** Return benchmark time stamp overhead. * @return overhead in micro-seconds */ +/*@-exportlocal@*/ rpmtime_t rpmswInit(void) /*@globals internalState @*/ /*@modifes internalState @*/; +/*@=exportlocal@*/ /** \ingroup rpmio * Enter timed operation.