/*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2001 University of Virginia,
+** Splint - annotation-assisted static program checker
+** 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 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
*/
/*
** llerror.c
** error reporting procedures
*/
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# include <string.h>
# include <errno.h>
# include "llbasic.h"
# include "llmain.h"
-# include "version.h"
+# include "cpperror.h"
+# include "Headers/version.h" /* Visual C++ finds a different version.h on some path! */
/* Don't allow possibly-recursive assertion failures. */
# undef llassert
static void printIndentMessage (FILE *p_stream, /*@only@*/ cstring p_sc, int p_indent)
/*@modifies *p_stream@*/ ;
-# ifndef NOLCL
static int lclerrors = 0;
-# endif
-
-static int lastfileloclen = 10;
+static size_t lastfileloclen = 10;
static /*@only@*/ cstring lastmsg = cstring_undefined;
static int mcount = 0;
static /*@only@*/ cstring saveOneMessage = cstring_undefined;
static /*@only@*/ fileloc lastbug = fileloc_undefined;
static bool llgenerrorreal (char *p_srcFile, int p_srcLine,
/*@only@*/ cstring p_s, fileloc p_fl, bool p_iserror, bool p_indent)
- /*@modifies g_msgstream@*/ ;
+ /*@modifies g_warningstream@*/ ;
static bool llgenerroraux (char *p_srcFile, int p_srcLine,
/*@only@*/ cstring p_s, fileloc p_fl, bool p_iserror, bool p_indent)
- /*@modifies g_msgstream@*/ ;
+ /*@modifies g_warningstream@*/ ;
static void printError (FILE *p_stream, /*@only@*/ cstring p_sc)
/*@globals lastfileloclen @*/
static void printMessage (FILE *p_stream, /*@only@*/ cstring p_s)
/*@modifies *p_stream@*/ ;
-static void llgenhint (/*@only@*/ cstring p_s) /*@modifies g_msgstream@*/ ;
+static void llgenhint (/*@only@*/ cstring p_s) /*@modifies g_warningstream@*/ ;
static void showSourceLoc (char *srcFile, int srcLine)
- /*@modifies g_msgstream@*/
+ /*@modifies g_warningstream@*/
{
if (context_getFlag (FLG_SHOWSOURCELOC)) {
llgenhint (message ("%s:%d: Source code error generation point.",
static void
printBugReport (void)
{
- fprintf (stderr, " *** Please report bug to %s ***\n",
- LCLINT_MAINTAINER);
+ fprintf (g_errorstream, " *** Please report bug to %s ***\n",
+ SPLINT_MAINTAINER);
llflush ();
/* don't exit (EXIT_FAILURE); */
}
static bool s_needsPrepare = TRUE;
-void prepareMessage (void)
+void prepareMessage ()
{
- if (context_isPreprocessing ()
+ DPRINTF (("Prepare message: %s", bool_unparse (context_loadingLibrary ())));
+ showHerald ();
+
+ if ((context_isPreprocessing () || context_loadingLibrary ())
&& s_needsPrepare
- && context_getDebug (FLG_SHOWSCAN))
+ && context_getFlag (FLG_SHOWSCAN))
{
llflush ();
- fprintf (stderr, " >\n");
+ displayScanClose ();
s_needsPrepare = FALSE;
}
void closeMessage (void)
{
if (context_isPreprocessing ()
- && context_getDebug (FLG_SHOWSCAN))
+ && context_getFlag (FLG_SHOWSCAN))
{
llflush ();
- fprintf (stderr, "< more preprocessing .");
-
+ displayScanOpen (cstring_makeLiteral ("more preprocessing ."));
llassertprotect (!s_needsPrepare);
s_needsPrepare = TRUE;
}
{
context_setNeednl ();
prepareMessage ();
- printMessage (g_msgstream, s);
+ printMessage (g_messagestream, s);
closeMessage ();
}
void
lldiagmsg (/*@only@*/ cstring s)
{
+ static bool inmsg = FALSE;
+
+ if (inmsg)
+ {
+ fprintf (g_errorstream,
+ "Recursive message call detected: %s\n",
+ cstring_toCharsSafe (s));
+ llexit (LLFAILURE);
+ }
+
+ inmsg = TRUE;
+
context_setNeednl ();
prepareMessage ();
- printMessage (stderr, s);
+ printMessage (g_messagestream, s);
closeMessage ();
+
+ inmsg = FALSE;
}
void
{
context_setNeednl ();
prepareMessage ();
- printMessage (g_msgstream, s);
+ printMessage (g_messagestream, s);
closeMessage ();
}
-void flagWarning (cstring s)
+void llerror_flagWarning (cstring s)
{
if (context_getFlag (FLG_WARNFLAGS))
{
- showHerald ();
-
- if (fileloc_isBuiltin (g_currentloc))
- {
- llmsg (message ("Warning: %s", s));
- }
- else
- {
- llgenmsg (message ("Warning: %s", s), g_currentloc);
- }
+ llgenmsg (s, g_currentloc);
+ }
+ else
+ {
+ cstring_free (s);
}
}
static void
-llgenhint (/*@only@*/ cstring s) /*@modifies g_msgstream@*/
+llgenhint (/*@only@*/ cstring s) /*@modifies g_warningstream@*/
{
int indent = context_getIndentSpaces () - 1;
if (indent < 0) indent = 0;
context_setNeednl ();
- printIndentMessage (g_msgstream, s, indent);
+ printIndentMessage (g_warningstream, s, indent);
}
void
f2 = FLG_NAMECHECKS;
}
- if (cstring_isDefined (desc))
+ if (f1 == f2)
{
- llgenhint (message ("%s (Setting either %h%s or %h%s will suppress message)", desc,
- c,
- flagcode_unparse (f1),
- c,
- flagcode_unparse (f2)));
+ if (cstring_isDefined (desc))
+ {
+ llgenhint (message ("%s (Use %h%s to inhibit warning)", desc,
+ c,
+ flagcode_unparse (f1)));
+ }
+ else
+ {
+ llgenhint (message ("(Use %h%s to inhibit warning)",
+ c, flagcode_unparse (f1)));
+ }
}
else
{
- llgenhint (message ("(Setting either %h%s or %h%s will suppress message)", c,
- flagcode_unparse (f1),
- c, flagcode_unparse (f2)));
+ if (cstring_isDefined (desc))
+ {
+ llgenhint (message ("%s (Use either %h%s or %h%s to inhibit warning)", desc,
+ c,
+ flagcode_unparse (f1),
+ c,
+ flagcode_unparse (f2)));
+ }
+ else
+ {
+ llgenhint (message ("(Use either %h%s or %h%s to inhibit warning)", c,
+ flagcode_unparse (f1),
+ c, flagcode_unparse (f2)));
+ }
}
}
}
if (cstring_isDefined (desc))
{
- llgenhint (message ("%s (%h%s will suppress message)", desc, c,
+ llgenhint (message ("%s (Use %h%s to inhibit warning)", desc, c,
flagcode_unparse (f)));
}
else
{
- llgenhint (message ("(%h%s will suppress message)", c,
+ llgenhint (message ("(Use %h%s to inhibit warning)", c,
flagcode_unparse (f)));
}
}
if (cstring_isDefined (desc))
{
- printError (g_msgstream, message (" %s", desc));
+ printError (g_warningstream, message (" %s", desc));
}
}
}
**
** if there is a newline in first maxline characters, split there
** if line len is <= maxline, return no split
- ** if there is a ':' or ';' followed by ' ' in first maxline characters,
+ ** if there is a ':' or ';' or ',' followed by ' ' in first maxline characters,
** split there unless the ' ' is followed by a '}', then
** split after '}'
** of the ';' is inside quotation marks
{
int i = 0;
char savechar;
- char *lcolon, *lsemi, *splitat;
-
+ char *lcolon, *lsemi, *lcomma;
+ char *splitat;
+
splitat = NULL;
t = s + maxline - 1;
*t = '\0';
lcolon = strrchr (s, ':');
lsemi = strrchr (s, ';');
+ lcomma = strrchr (s, ',');
+
*t = savechar;
splitat = maxcp (lcolon, lsemi);
if (splitat != NULL && ((int)(splitat - s) > MINLINE)
&& *(splitat) != '\0'
&& *(splitat + 1) == ' '
- && (*(splitat + 2) != '}' && (*(splitat + 2) != '\0')))
+ && (*(splitat + 2) != '}'
+ && *(splitat + 2) != ','
+ && (*(splitat + 2) != '\0')))
{
*(splitat + 1) = '\0';
t = splitat + 2;
return;
}
+ if (lcomma != NULL && ((lcomma - s) > maxline - 5))
+ {
+ splitat = lcomma;
+
+ if (splitat != NULL && ((int)(splitat - s) > MINLINE)
+ && *(splitat) != '\0'
+ && *(splitat + 1) == ' '
+ && (*(splitat + 2) != '}'
+ && (*(splitat + 2) != '\0')))
+ {
+ *(splitat + 1) = '\0';
+ t = splitat + 2;
+ *tp = t;
+ llassertprotect (*tp == NULL || (*tp > osp));
+ return;
+ }
+ }
+
while (*t != ' ' && *t != '\t' && i < MAXSEARCH)
{
t--;
if (unprinted == 1 && cstring_isDefined (saveOneMessage))
{
prepareMessage ();
- printError (g_msgstream, saveOneMessage);
+ printError (g_warningstream, saveOneMessage);
closeMessage ();
saveOneMessage = cstring_undefined;
}
saveOneMessage = cstring_undefined;
}
- fprintf (g_msgstream, "%s: (%d more similar errors unprinted)\n",
+ fprintf (g_warningstream, "%s: (%d more similar errors unprinted)\n",
cstring_toCharsSafe (fileloc_filename (g_currentloc)),
mcount - context_getLimit ());
}
lastfileloclen = cstring_length (flstring);
prepareMessage ();
- (void) printError (g_msgstream, message ("%q: %q", flstring, s));
+ (void) printError (g_warningstream, message ("%q: %q", flstring, s));
closeMessage ();
}
cstring flstring = fileloc_unparse (fl);
prepareMessage ();
- (void) printIndentMessage (g_msgstream, message ("%q: %q", flstring, s), context_getIndentSpaces ());
+ (void) printIndentMessage (g_warningstream, message ("%q: %q", flstring, s), context_getIndentSpaces ());
closeMessage ();
}
llgenindentmsgnoloc (/*@only@*/ cstring s)
{
prepareMessage ();
- (void) printIndentMessage (g_msgstream, s, context_getIndentSpaces ());
+ (void) printIndentMessage (g_warningstream, s, context_getIndentSpaces ());
closeMessage ();
}
ctype ut1 = t1;
ctype ut2 = t2;
- DPRINTF (("Type error: %s / %s : %s / %s",
+ DPRINTF (("Type error [%s]: %s / %s : %s / %s",
+ flagcode_unparse (ocode),
exprNode_unparse (e1), exprNode_unparse (e2),
ctype_unparse (t1), ctype_unparse (t2)));
{
if (!bool_equal (ctype_isSigned (ut1), ctype_isSigned (ut2)))
{
- hcode = FLG_IGNORESIGNS;
+ if (ctype_isArbitraryIntegral (ctype_realType (ut1))
+ && !ctype_isArbitraryIntegral (ctype_realType (ut2)))
+ {
+ hcode = FLG_MATCHANYINTEGRAL;
+ }
+ else if (ctype_isArbitraryIntegral (ctype_realType (ut2))
+ && !ctype_isArbitraryIntegral (ctype_realType (ut1)))
+ {
+ hcode = FLG_MATCHANYINTEGRAL;
+ }
+ else
+ {
+ hcode = FLG_IGNORESIGNS;
+ }
}
else
{
;
}
}
- else if (ctype_isAbstract (ut1) && !ctype_isAbstract (ut2))
+ else
{
- uentry ue1 = usymtab_getTypeEntry (ctype_typeId (ut1));
- ctype ct = uentry_getType (ue1);
+ ;
+ }
+
+ if (hcode == INVALID_FLAG)
+ {
+ DPRINTF (("[%s] %s - %s / %s",
+ ctype_unparse (ut1),
+ bool_unparse (ctype_isEnum (ut1)),
+ bool_unparse (ctype_isEnum (ctype_realType (ut1))),
+ bool_unparse (ctype_isInt (ut2))));
- if (ctype_match (ct, ut2))
+ if (ctype_isAbstract (ut1) && !ctype_isAbstract (ut2))
{
- code = FLG_ABSTRACT;
- hint = message ("Underlying types match, but %s is an "
- "abstract type that is not accessible here.",
- ctype_unparse (t1));
+ uentry ue1 = usymtab_getTypeEntry (ctype_typeId (ut1));
+ ctype ct = uentry_getType (ue1);
+
+ if (ctype_match (ct, ut2))
+ {
+ code = FLG_ABSTRACT;
+ hint = message ("Underlying types match, but %s is an "
+ "abstract type that is not accessible here.",
+ ctype_unparse (t1));
+ }
}
- }
- else if (ctype_isAbstract (ut2) && !ctype_isAbstract (ut1))
- {
- uentry ue = usymtab_getTypeEntry (ctype_typeId (ut2));
- ctype ct = uentry_getType (ue);
+ else if (ctype_isAbstract (ut2) && !ctype_isAbstract (ut1))
+ {
+ uentry ue = usymtab_getTypeEntry (ctype_typeId (ut2));
+ ctype ct = uentry_getType (ue);
+
+ if (ctype_match (ct, ut1))
+ {
+ code = FLG_ABSTRACT;
+ hint = message ("Underlying types match, but %s is an "
+ "abstract type that is not accessible here.",
+ ctype_unparse (t2));
+ }
+ }
+ else
+ {
+ ; /* Not an abstract mismatch. */
+ }
+
- if (ctype_match (ct, ut1))
+ if (hcode == INVALID_FLAG)
{
- code = FLG_ABSTRACT;
- hint = message ("Underlying types match, but %s is an "
- "abstract type that is not accessible here.",
- ctype_unparse (t2));
+ if ((ctype_isEnum (ut1) && ctype_isInt (ut2))
+ || (ctype_isEnum (ut2) && ctype_isInt (ut1)))
+ {
+ hcode = FLG_ENUMINT;
+ }
+ else if ((ctype_isEnum (ut1) && ctype_isInt (ut2))
+ || (ctype_isEnum (ut2) && ctype_isInt (ut1)))
+ {
+ hcode = FLG_ENUMINT;
+ }
+ else if ((ctype_isSignedChar (ut1) && ctype_isUnsignedChar (ut2))
+ || (ctype_isUnsignedChar (ut1) && ctype_isSignedChar (ut2)))
+ {
+ hcode = FLG_CHARUNSIGNEDCHAR;
+ }
+ else if (ctype_isNumeric (ut1) && ctype_isNumeric (ut2))
+ {
+ hcode = FLG_RELAXTYPES;
+ DPRINTF (("Setting relax types!"));
+ }
+ else
+ {
+ DPRINTF (("No special type rule: %s / %s", ctype_unparse (ut1),
+ ctype_unparse (ut2)));
+ }
}
}
- else if ((ctype_isEnum (ut1) && ctype_isArbitraryIntegral (ut2))
- || (ctype_isEnum (ut2) && ctype_isArbitraryIntegral (ut1)))
- {
- code = FLG_ENUMINT;
- }
- else if ((ctype_isEnum (ut1) && ctype_isArbitraryIntegral (ut2))
- || (ctype_isEnum (ut2) && ctype_isArbitraryIntegral (ut1)))
- {
- code = FLG_ENUMINT;
- }
- else if ((ctype_isSignedChar (ut1) && ctype_isUnsignedChar (ut2))
- || (ctype_isUnsignedChar (ut1) && ctype_isSignedChar (ut2)))
- {
- code = FLG_CHARUNSIGNEDCHAR;
- }
- else if (ctype_isNumeric (ut1) && ctype_isNumeric (ut2))
- {
- code = FLG_RELAXTYPES;
- }
- else
- {
- DPRINTF (("No special type rule: %s / %s", ctype_unparse (ut1),
- ctype_unparse (ut2)));
- }
if (cstring_isDefined (hint))
{
if (hcode != INVALID_FLAG && hcode != ocode)
{
code = hcode;
- llshowhint (code);
+ if (context_flagOn (code, fl))
+ {
+ /* The flag is alreay set, something buggy in the flag code */
+ llcontbug (message ("No hint available, flag %s is already set.",
+ flagcode_unparse (code)));
+ }
+ else
+ {
+ llshowhint (code);
+ }
}
else
{
ctype t1, exprNode e1, ctype t2, exprNode e2,
/*@only@*/ cstring s, fileloc fl)
{
- return llgentypeerroraux (srcFile, srcLine, FLG_FORMATTYPE, t1, e1, t2, e2, s, fl);
+ if (!context_suppressFlagMsg (FLG_FORMATTYPE, fl))
+ {
+ return llgentypeerroraux (srcFile, srcLine, FLG_FORMATTYPE, t1, e1, t2, e2, s, fl);
+ }
+ else
+ {
+ cstring_free (s);
+ return FALSE;
+ }
}
bool
cstring_free (s);
return FALSE;
}
- else
- {
- ;
- }
-
+
if (llgenerrorreal (srcFile, srcLine, s, fl, iserror, indent)) {
return TRUE;
} else {
return FALSE;
}
+ /*
+ ** If herald has not been displayed, display it before the first message.
+ */
+
+ showHerald ();
+
if (iserror) context_hasError ();
if (context_unlimitedMessages ())
if (context_inIterDef ())
{
- fprintf (g_msgstream, "%s: (in iter %s)\n",
+ fprintf (g_warningstream, "%s: (in iter %s)\n",
cstring_toCharsSafe (fname),
cstring_toCharsSafe (context_inFunctionName ()));
}
else if (context_inIterEnd ())
{
- fprintf (g_msgstream, "%s: (in iter finalizer %s)\n",
+ fprintf (g_warningstream, "%s: (in iter finalizer %s)\n",
cstring_toCharsSafe (fname),
cstring_toCharsSafe (context_inFunctionName ()));
}
else if (context_inMacro ())
{
- fprintf (g_msgstream, "%s: (in macro %s)\n", cstring_toCharsSafe (fname),
+ fprintf (g_warningstream, "%s: (in macro %s)\n", cstring_toCharsSafe (fname),
cstring_toCharsSafe (context_inFunctionName ()));
}
else
{
- fprintf (g_msgstream, "%s: (in function %s)\n",
+ fprintf (g_warningstream, "%s: (in function %s)\n",
cstring_toCharsSafe (fname),
cstring_toCharsSafe (context_inFunctionName ()));
}
if (indent)
{
- printError (g_msgstream, message (" %q: %q", flstring, s));
+ printError (g_warningstream, message (" %q: %q", flstring, s));
}
else
{
- printError (g_msgstream, message ("%q: %q", flstring, s));
+ printError (g_warningstream, message ("%q: %q", flstring, s));
}
showSourceLoc (srcFile, srcLine);
void printError (FILE *stream, /*@only@*/ cstring sc)
{
int maxlen = context_getLineLen ();
- int nspaces = lastfileloclen + 5;
+ size_t nspaces = lastfileloclen + 5;
int nextlen = maxlen - nspaces;
- int len = cstring_length (sc);
+ size_t len = cstring_length (sc);
int indent = 0;
char *s = cstring_toCharsSafe (sc);
char *os = s;
DPRINTF (("Print error: [%s]", sc));
- if (len < (maxlen + nextlen) && (strchr (s, '\n') == NULL))
+ if (size_toInt (len) < (maxlen + nextlen) && (strchr (s, '\n') == NULL))
{
mstring_split (&s, &t, maxlen, &indent);
{
len = mstring_length (t);
- if (len < (maxlen - 3) && (strchr (t, '\n') == NULL)
- && len > (nextlen - 1))
+ if (size_toInt (len) < (maxlen - 3) && (strchr (t, '\n') == NULL)
+ && size_toInt (len) > (nextlen - 1))
{
fprintf (stream, " %s\n", t);
}
char *spaces = (char *) dmalloc ((nspaces + 1) * sizeof (*spaces));
int i;
- for (i = 0; i < nspaces; i++)
+ for (i = 0; i < size_toInt (nspaces); i++)
{
spaces[i] = ' ';
}
{
DPRINTF (("Here 1: [%s]", sc));
- if (len < (maxlen + maxlen - 1) && (strchr (s, '\n') != NULL))
+ if (size_toInt (len) < (maxlen + maxlen - 1) && (strchr (s, '\n') != NULL))
{
nspaces = ((maxlen + maxlen - 1) - len) / 2;
char *spaces = (char *) dmalloc ((nspaces + 1) * sizeof (*spaces));
int i;
- for (i = 0; i < nspaces; i++)
+ for (i = 0; i < size_toInt (nspaces); i++)
{
spaces[i] = ' ';
}
if (t != NULL)
{
char *spaces = (char *) dmalloc ((nspaces + 1) * sizeof (*spaces));
- int i;
+ size_t i;
for (i = 0; i < nspaces; i++)
{
xllfatalbug (char *srcFile, int srcLine, /*@only@*/ cstring s)
{
prepareMessage ();
- printError (stderr, message ("%q: *** Fatal bug: %q",
- fileloc_unparse (g_currentloc), s));
+ printError (g_errorstream, message ("%q: *** Fatal bug: %q",
+ fileloc_unparse (g_currentloc), s));
showSourceLoc (srcFile, srcLine);
printCodePoint ();
printBugReport ();
llexit (LLFAILURE);
}
-# ifndef NOLCL
void
lclfatalbug (char *msg)
{
prepareMessage ();
- printError (stderr,
+ printError (g_errorstream,
message ("*** Fatal Bug: %s", cstring_fromChars (msg)));
printCodePoint ();
printBugReport ();
llexit (LLFAILURE);
}
-# endif
void
checkParseError (void)
{
cstring temps = fileloc_unparseRaw (file, line);
- fprintf (stderr, "%s: Recursive bug detected: %s\n",
+ fprintf (g_errorstream,
+ "%s: Recursive bug detected: %s\n",
cstring_toCharsSafe (temps),
cstring_toCharsSafe (s));
cstring_free (temps);
prepareMessage ();
- /*@i3232@*/
- /*
- if (fileloc_isRealLib (g_currentloc))
- {
- DPRINTF (("Here we are!"));
- llfatalerror (message ("%q: Library file appears to be corrupted. Error: %q: %s",
- fileloc_unparse (g_currentloc),
- fileloc_unparseRaw (file, line),
- s));
- }
- */
-
if (fileloc_withinLines (lastparseerror, g_currentloc, 7))
{
llfatalerror (message ("%q: Cannot recover from parse error.",
fileloc_unparse (g_currentloc)));
}
- (void) fflush (g_msgstream);
- printError (stderr, message ("%q: *** Internal Bug at %q: %q [errno: %d]",
- fileloc_unparse (g_currentloc),
- fileloc_unparseRaw (file, line),
- s, errno));
- printCodePoint ();
+ (void) fflush (g_warningstream);
+
+ printError (g_errorstream,
+ message ("%q: *** Internal Bug at %q: %q [errno: %d]",
+ fileloc_unparse (g_currentloc),
+ fileloc_unparseRaw (file, line),
+ s, errno));
+
+ /* printCodePoint (); no longer useful */
- (void) fflush (stderr);
- perror ("Possible system error diagnostic: ");
- (void) fflush (stderr);
+ llflush ();
+
+ /*
+ ** This is confusing, and hardly ever useful.
+
+ if (errno != 0)
+ {
+ perror ("Possible system error diagnostic: ");
+ }
+
+ **
+ */
printBugReport ();
+ llflush ();
numbugs++;
if (numbugs > context_getBugsLimit () && fileloc_withinLines (lastbug, g_currentloc, 2))
{
- llfatalerror (message ("%q: Cannot recover from last bug. (If you really want LCLint to try to continue, use -bugslimit <n>.)",
- fileloc_unparse (g_currentloc)));
+ llfatalerror
+ (message ("%q: Cannot recover from last bug. "
+ "(If you really want Splint to try to continue, use -bugslimit <n>.)",
+ fileloc_unparse (g_currentloc)));
}
- fprintf (stderr, " (attempting to continue, results may be incorrect)\n");
+ fprintf (g_errorstream, " (attempting to continue, results may be incorrect)\n");
fileloc_free (lastbug);
lastbug = fileloc_copy (g_currentloc);
closeMessage ();
-
- (void) fflush (stderr);
inbug = FALSE;
}
-# ifndef NOLCL
void
lclbug (/*@only@*/ cstring s)
{
prepareMessage ();
- printError (stderr, message ("*** Internal Bug: %q", s));
+ printError (g_errorstream, message ("*** Internal Bug: %q", s));
printCodePoint ();
printBugReport ();
- fprintf (stderr, " (attempting to continue, results may be incorrect)\n");
+ fprintf (g_errorstream, " (attempting to continue, results may be incorrect)\n");
closeMessage ();
}
-# endif
void
-llfatalerror (cstring s)
+xllfatalerror (char *srcFile, int srcLine, cstring s)
{
prepareMessage ();
- printError (stderr, s);
- printError (stderr, cstring_makeLiteral ("*** Cannot continue."));
+ printError (g_errorstream, s);
+ printError (g_errorstream, cstring_makeLiteral ("*** Cannot continue."));
+ showSourceLoc (srcFile, srcLine);
llexit (LLFAILURE);
}
void
-llfatalerrorLoc (/*@only@*/ cstring s)
+xllfatalerrorLoc (char *srcFile, int srcLine, /*@only@*/ cstring s)
{
prepareMessage ();
- (void) fflush (g_msgstream);
- printError (stderr, message ("%q: %q", fileloc_unparse (g_currentloc), s));
- printError (stderr, cstring_makeLiteral ("*** Cannot continue."));
- (void) fflush (g_msgstream);
+ (void) fflush (g_warningstream);
+ printError (g_errorstream, message ("%q: %q", fileloc_unparse (g_currentloc), s));
+ printError (g_errorstream, cstring_makeLiteral ("*** Cannot continue."));
+ showSourceLoc (srcFile, srcLine);
+ (void) fflush (g_warningstream);
llexit (LLFAILURE);
}
-void
-xllgloberror (char *srcFile, int srcLine, /*@only@*/ cstring s)
-{
- if (context_inSuppressRegion ())
- {
- cstring_free (s);
- }
- else
- {
- context_setNeednl ();
- prepareMessage ();
- context_hasError ();
- flagcode_recordError (FLG_SPECIAL);
- printError (g_msgstream, s);
- showSourceLoc (srcFile, srcLine);
- closeMessage ();
- }
-}
-
-# ifndef NOLCL
bool
lclHadError (void)
{
if (ltoken_getCode (t) != NOTTOKEN)
{
cstring loc = ltoken_unparseLoc (t);
-
lastfileloclen = cstring_length (loc);
- printError (g_msgstream, message ("%q: %q", loc, msg));
+ printError (g_warningstream, message ("%q: %q", loc, msg));
showSourceLoc (srcFile, srcLine);
}
else
{
- printError (g_msgstream, msg);
+ printError (g_warningstream, msg);
showSourceLoc (srcFile, srcLine);
}
}
lclplainerror (/*@only@*/ cstring msg)
{
lclerrors++;
-
- printError (g_msgstream, msg);
+ printError (g_warningstream, msg);
}
void
lclfatalerror (ltoken t, /*@only@*/ cstring msg)
{
- lclerror (t, msg);
- (void) fflush (g_msgstream);
- printError (stderr, cstring_makeLiteral ("*** Cannot continue"));
+ if (ltoken_getCode (t) != NOTTOKEN)
+ {
+ cstring loc = ltoken_unparseLoc (t);
+ lastfileloclen = cstring_length (loc);
+ printError (g_errorstream, message ("%q: %q", loc, msg));
+ }
+ else
+ {
+ printError (g_errorstream, msg);
+ }
+
+ printError (g_errorstream, cstring_makeLiteral ("*** Cannot continue"));
llexit (LLFAILURE);
}
void
lclplainfatalerror (/*@only@*/ cstring msg)
{
- (void) fflush (g_msgstream);
- printError (stderr, message ("*** Cannot continue: %q", msg));
+ (void) fflush (g_warningstream);
+ printError (g_errorstream, message ("*** Cannot continue: %q", msg));
llexit (LLFAILURE);
}
lclerror (id, message ("Identifier redeclared: %s", s));
}
}
-# endif
void genppllerror (flagcode code, /*@only@*/ cstring s)
{
{
if (context_getFlag (code))
{
- if (context_getFlag (FLG_SHOWSCAN) && !context_isInCommandLine ())
+ if (!context_isInCommandLine ())
{
- fprintf (g_msgstream, " >\n");
+ displayScanClose ();
}
llerror (code, s);
llsuppresshint ('-', code);
}
- if (context_getFlag (FLG_SHOWSCAN) && !context_isInCommandLine ())
+ if (!context_isInCommandLine ())
{
- fprintf (stderr, "< more preprocessing .");
+ displayScanOpen (cstring_makeLiteral ("< more preprocessing ."));
}
}
else
void pplldiagmsg (cstring s)
{
- if (context_getDebug (FLG_SHOWSCAN) && !context_isInCommandLine ())
+ if (!context_isInCommandLine ())
{
- fprintf (stderr, " >\n");
+ displayScanClose ();
lldiagmsg (s);
- fprintf (stderr, "< more preprocessing .");
+ displayScanOpen (cstring_makeLiteral ("< more preprocessing ."));
}
else
{
void loadllmsg (cstring s)
{
- if (context_getDebug (FLG_SHOWSCAN))
- {
- fprintf (stderr, " >\n");
- lldiagmsg (s);
- fprintf (stderr, "< .");
- }
- else
- {
- lldiagmsg (s);
- }
+ displayScanClose ();
+ lldiagmsg (s);
+ displayScanOpen (cstring_makeLiteral ("< ."));
}
static void llreportparseerror (/*@only@*/ cstring s)
}
}
+bool xcppoptgenerror (char *srcFile, int srcLine,
+ flagcode o,
+ /*@only@*/ cstring s,
+ cppReader *pfile)
+{
+ bool res = FALSE;
+ fileloc loc = cppReader_getLoc (pfile);
+
+ if (context_flagOn (o, loc))
+ {
+ if (xlloptgenerror (srcFile, srcLine, o, s, loc))
+ {
+ cppReader_printContainingFiles (pfile);
+ res = TRUE;
+ }
+ }
+ else
+ {
+ cstring_free (s);
+ }
+
+ fileloc_free (loc);
+
+ return res;
+}
+
bool xlloptgenerror (char *srcFile, int srcLine,
flagcode o, /*@only@*/ cstring s, fileloc loc)
{
return FALSE;
}
-void llparseerror (cstring s)
+void xllparseerror (char *srcFile, int srcLine, cstring s)
{
if (context_getFlag (FLG_TRYTORECOVER))
{
{
if (cstring_isDefined (s))
{
- llfatalerror (message ("%q: Parse Error: %q. "
- "Too many errors, giving up.",
- fileloc_unparse (g_currentloc), s));
+ xllfatalerror (srcFile, srcLine,
+ message ("%q: Parse Error: %q. "
+ "Too many errors, giving up.",
+ fileloc_unparse (g_currentloc), s));
}
else
{
- llfatalerror (message ("%q: Parse Error. Too many errors, giving up.",
- fileloc_unparse (g_currentloc)));
+ xllfatalerror (srcFile, srcLine,
+ message ("%q: Parse Error. Too many errors, giving up.",
+ fileloc_unparse (g_currentloc)));
}
}
else
{
llreportparseerror (message ("Parse Error: %q. Attempting to continue.",
s));
+ showSourceLoc (srcFile, srcLine);
}
else
{
llreportparseerror (message ("Parse Error. Attempting to continue."));
+ showSourceLoc (srcFile, srcLine);
}
}
}
msg = message ("Parse Error.");
}
- llfatalerror
- (message ("%q: %s (For help on parse errors, "
- "see lclint -help parseerrors.)",
+ xllfatalerror
+ (srcFile, srcLine,
+ message ("%q: %s (For help on parse errors, "
+ "see splint -help parseerrors.)",
fileloc_unparse (g_currentloc), msg));
}
}
# if 0
# ifdef HOMEVERSION
llflush ();
- printError (stderr, message ("%q: *** Internal Bug at %q: %q [errno: %d]",
- fileloc_unparse (g_currentloc),
- fileloc_unparseRaw (file, line),
- s, errno));
+ printError (g_errorstream, message ("%q: *** Internal Bug at %q: %q [errno: %d]",
+ fileloc_unparse (g_currentloc),
+ fileloc_unparseRaw (file, line),
+ s, errno));
printCodePoint ();
llflush ();
# endif
void llflush (void)
{
- (void) fflush (g_msgstream);
- (void) fflush (stderr);
+ (void) fflush (g_warningstream);
+ (void) fflush (g_messagestream);
+}
+
+static bool s_scanOpen = FALSE;
+
+void displayScan (cstring msg)
+{
+ if (s_scanOpen)
+ {
+ displayScanClose ();
+ }
+
+ llassert (!s_scanOpen);
+
+ if (context_getFlag (FLG_SHOWSCAN))
+ {
+ showHerald ();
+ fprintf (g_messagestream, "< %s >\n", cstring_toCharsSafe (msg));
+ (void) fflush (g_messagestream);
+ }
+
+ cstring_free (msg);
+}
+
+void displayScanOpen (cstring msg)
+{
+ if (s_scanOpen)
+ {
+ displayScanClose ();
+ }
+
+ llassert (!s_scanOpen);
+ s_scanOpen = TRUE;
+
+ if (context_getFlag (FLG_SHOWSCAN))
+ {
+ fprintf (g_messagestream, "< %s", cstring_toCharsSafe (msg));
+ (void) fflush (g_messagestream);
+ }
+
+ cstring_free (msg);
}
+
+void displayScanContinue (/*@temp@*/ cstring msg)
+{
+ if (context_getFlag (FLG_SHOWSCAN))
+ {
+ if (s_scanOpen)
+ {
+ fprintf (g_messagestream, "%s", cstring_toCharsSafe (msg));
+ (void) fflush (g_messagestream);
+ }
+ else
+ {
+ /*
+ ** Don't call bug recursively
+ */
+
+ fprintf (stderr, "*** Bug: scan continue scan not open\n");
+ }
+ }
+}
+
+void displayScanClose (void)
+{
+ if (s_scanOpen)
+ {
+ if (context_getFlag (FLG_SHOWSCAN))
+ {
+ fprintf (g_messagestream, " >\n");
+ (void) fflush (g_messagestream);
+ }
+ }
+ else
+ {
+ /*
+ ** Don't call bug recursively
+ */
+
+ fprintf (stderr, "*** Bug: scan close scan not open\n");
+ }
+
+ s_scanOpen = FALSE;
+}
+
+