X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/15b3d2b27a3dce7a3b65e88fb0d1732e235117f4..35b9a1d988c06908076e3a6eeae55b1147879607:/src/general.c diff --git a/src/general.c b/src/general.c index ffd2368..9724200 100644 --- a/src/general.c +++ b/src/general.c @@ -1,6 +1,6 @@ /* -** LCLint - annotation-assisted static program checker -** Copyright (C) 1994-2001 University of Virginia, +** Splint - annotation-assisted static program checker +** Copyright (C) 1994-2003 University of Virginia, ** Massachusetts Institute of Technology ** ** This program is free software; you can redistribute it and/or modify it @@ -17,15 +17,15 @@ ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, ** MA 02111-1307, USA. ** -** For information on lclint: lclint-request@cs.virginia.edu -** To report a bug: lclint-bug@cs.virginia.edu -** For more information: http://lclint.cs.virginia.edu +** For information on splint: info@splint.org +** To report a bug: splint-bug@splint.org +** For more information: http://www.splint.org */ /* ** general.c */ -# include "lclintMacros.nf" +# include "splintMacros.nf" # include "basic.h" # undef malloc # undef realloc @@ -86,6 +86,7 @@ static long unsigned size_toLongUnsigned (size_t x) } /*@out@*/ void *dimalloc (size_t size, const char *name, int line) + /*@ensures maxSet(result) == (size - 1); @*/ { /* static void *lastaddr = 0; @@ -112,8 +113,15 @@ static long unsigned size_toLongUnsigned (size_t x) { if (size == 0) { - llbug (message ("Zero allocation at %q.", - fileloc_unparseRaw (cstring_fromChars (name), line))); + llcontbug (message ("Zero allocation at %q.", + fileloc_unparseRaw (cstring_fromChars (name), line))); + + /* + ** evans 2002-03-01 + ** Return some allocated storage...hope we get lucky. + */ + + return dimalloc (16, name, line); } else { @@ -179,21 +187,18 @@ void *direalloc (/*@out@*/ /*@null@*/ void *x, size_t size, /*@=mustdefine@*/ -# ifndef NOLCL char *FormatInt (int i) { char temp[255]; /* assume the integer has at most 254 digits */ char *outs; - - sprintf (temp, "%i", i); + int sres = snprintf (temp, 255, "%i", i); + check (sres >= 0 && sres <= 255); outs = (char *) dmalloc (sizeof (*outs) * (1 + strlen (temp))); strcpy (outs, temp); return (outs); } -# endif -# ifndef NOLCL bool firstWord (char *s, char *w) { llassert (s != NULL); @@ -206,7 +211,6 @@ bool firstWord (char *s, char *w) } return TRUE; } -# endif void mstring_markFree (char *s) { @@ -245,6 +249,18 @@ bool mstring_containsChar (const char *s, char c) return FALSE; } } + +bool mstring_containsString (const char *s, const char *c) +{ + if (mstring_isDefined (s)) + { + return (strstr (s, c) != NULL); + } + else + { + return FALSE; + } +} char *mstring_concat (const char *s1, const char *s2) { @@ -294,7 +310,7 @@ mstring_append (/*@only@*/ char *s1, char c) } extern -char *mstring_copy (char *s1) +char *mstring_copy (char *s1) /*@ensures maxRead(result) == maxRead(s1) /\ maxSet(result) == maxSet(s1) @*/ { if (s1 == NULL) { @@ -322,7 +338,7 @@ char *mstring_safePrint (char *s) } extern -char *mstring_create (int n) +char *mstring_create (size_t n) { char *s; @@ -342,6 +358,12 @@ fputline (FILE *out, char *s) check (fputc ('\n', out) == (int) '\n'); } +unsigned int int_toNonNegative (int x) /*@*/ +{ + llassert (x >= 0); + return (unsigned) x; +} + int int_log (int x) { int ret = 1; @@ -364,7 +386,7 @@ longUnsigned_fromInt (int x) return (long unsigned) x; } -size_t size_fromInt (int x) +size_t size_fromInt (int x) /*@ensures result==x@*/ { size_t res = (size_t) x; @@ -372,6 +394,22 @@ size_t size_fromInt (int x) return res; } +size_t size_fromLong (long x) /*@ensures result==x@*/ +{ + size_t res = (size_t) x; + + llassert ((long) res == x); + return res; +} + +size_t size_fromLongUnsigned (unsigned long x) /*@ensures result==x@*/ +{ + size_t res = (size_t) x; + + llassert ((unsigned long) res == x); + return res; +} + int size_toInt (size_t x) { int res = (int) x; @@ -393,9 +431,15 @@ long size_toLong (size_t x) char char_fromInt (int x) { - llassert ((x >= (int)'\0') && (x <= (int)'~')); + /* + ** evans 2001-09-28 - changed assertion in response to Anthony Giorgio's comment + ** that the old assertions failed for EBCDIC character set. Now we just check + ** that the result is equal. + */ - return ((char) x); + char res = (char) x; + llassert ((int) res == x); + return res; } /*@-czechfcns@*/