/*;-*-C-*-;
** Splint - annotation-assisted static program checker
-** Copyright (C) 1994-2001 University of Virginia,
+** Copyright (C) 1994-2002 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
** 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 information on splint: splint@cs.virginia.edu
+** To report a bug: splint-bug@cs.virginia.edu
** For more information: http://www.splint.org
*/
/*
/*
** Modified by Mike Smith
** Corrected missing 'line' in scanf() calls in handleSpecial().
-** Without this, I get an error when LCLint hits a '#line' directive
+** Without this, I get an error when Splint hits a '#line' directive
** in the pre-pre-processed source files. For safety, I have made these
** conditional on OS2 and MSDOS because I don't understand why noone else
** has seen this problem.
ULSuffix ({U}{L}|{L}{U})
%{
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# if defined(OS2) && defined(__IBMC__)
/* needed for isatty()... */
# include <io.h>
# else
+
+/*
+** Win32 doesn't have unistd.h
+*/
+
+# ifndef WIN32
# include <unistd.h>
# endif
+# endif
+
# include "basic.h"
# include "cgrammar.h"
"isnull" { return (processSpec (QISNULL)); }
"truenull" { return (processSpec (QTRUENULL)); }
"falsenull" { return (processSpec (QFALSENULL)); }
+"nullwhentrue" { return (processSpec (QTRUENULL)); }
+"nullwhenfalse" { return (processSpec (QFALSENULL)); }
"relnull" { return (processSpec (QRELNULL)); }
"reldef" { return (processSpec (QRELDEF)); }
"exposed" { return (processSpec (QEXPOSED)); }
{ "testinRange", QTESTINRANGE},
{ "requires", QPRECLAUSE } ,
{ "ensures", QPOSTCLAUSE } ,
+ { "invariant", QINVARIANT} ,
{ NULL, BADTOK }
} ;
{ "special", QSPECIAL } ,
{ "truenull", QTRUENULL } ,
{ "falsenull", QFALSENULL } ,
+ { "nullwhentrue", QTRUENULL } ,
+ { "falsewhennull", QFALSENULL } ,
{ "keep", QKEEP } ,
{ "kept", QKEPT } ,
{ "notnull", QNOTNULL } ,
voptgenerror
(FLG_WARNLINTCOMMENTS,
cstring_makeLiteral
- ("Traditional lint comment /*FALLTHROUGH*/ used. "
- "This is interpreted by "
- "LCLint in the same way as most Unix lints, but it is "
+ ("Traditional lint comment /*FALLTHROUGH*/ used. "
+ "Splint interprets this in the same way as most Unix lints, but it is "
"preferable to replace it with the /*@fallthrough@*/ "
"semantic comment"),
g_currentloc);
voptgenerror
(FLG_WARNLINTCOMMENTS,
cstring_makeLiteral
- ("Traditional lint comment /*FALLTHRU*/ used. "
- "This is interpreted by "
- "LCLint in the same way as most Unix lints, but it is "
+ ("Traditional lint comment /*FALLTHRU*/ used. "
+ "Splint interprets this in the same way as most Unix lints, but it is "
"preferable to replace it with the /*@fallthrough@*/ "
"semantic comment"),
g_currentloc);
voptgenerror
(FLG_WARNLINTCOMMENTS,
cstring_makeLiteral
- ("Traditional lint comment /*NOTREACHED*/ used. "
- "This is interpreted by "
- "LCLint in the same way as most Unix lints, but it is "
+ ("Traditional lint comment /*NOTREACHED*/ used. "
+ "Splint interprets this in the same way as most Unix lints, but it is "
"preferable to replace it with the /*@notreached@*/ "
"semantic comment."),
g_currentloc);
voptgenerror
(FLG_WARNLINTCOMMENTS,
cstring_makeLiteral
- ("Traditional lint comment /*PRINTFLIKE*/ used. "
- "This is interpreted by "
- "LCLint in the same way as most Unix lints, but it is "
+ ("Traditional lint comment /*PRINTFLIKE*/ used. "
+ "Splint interprets this in the same way as most Unix lints, but it is "
"preferable to replace it with either /*@printflike@*/, "
"/*@scanflike@*/ or /*@messagelike@*/."),
g_currentloc);
voptgenerror
(FLG_WARNLINTCOMMENTS,
cstring_makeLiteral
- ("Traditional lint comment /*ARGSUSED*/ used. "
- "This is interpreted by "
- "LCLint in the same way as most Unix lints, but it is "
+ ("Traditional lint comment /*ARGSUSED*/ used. "
+ "Splint interprets this in the same way as most Unix lints, but it is "
"preferable to use /*@unused@*/ annotations on "
"the unused parameters."),
g_currentloc);
char c;
char *ol;
cstring olc;
-
- strcpy (l, yyt + 1);
- /* Need to safe original l for deallocating. */
- ol = l;
+ int len_yyt;
- l += strlen (yyt) - 1;
+ len_yyt = strlen (yyt +1) ;
+
+ l = mstring_copy (yyt + 1);
while ((c = char_fromInt (lminput ())) != '\n' && c != '\0')
{
- *l++ = c;
+ l = mstring_append(l, c);
}
- *l = '\0';
+ /* Need to safe original l for deallocating. */
+ ol = l;
+
+ l += strlen (l);
+
olc = cstring_fromChars (ol);
if (cstring_equalPrefixLit (olc, "pragma"))
{
s--;
- if (flagcode_hasValue (fflag))
+ if (flagcode_hasNumber (fflag))
+ {
+ setValueFlag (fflag, extra);
+ }
+ else if (flagcode_hasChar (fflag))
{
setValueFlag (fflag, extra);
}