/*
-** 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
** 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
*/
/*
** cprim.c
*/
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# include "basic.h"
static bool cprim_isReal (cprim c)
{
if (c1 == c2) return TRUE;
+ DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2)));
+
if (c1 == CTX_ANYINTEGRAL)
{
if (context_getFlag (FLG_MATCHANYINTEGRAL)
if (context_getFlag (FLG_MATCHANYINTEGRAL)
|| context_getFlag (FLG_IGNOREQUALS))
{
- return (cprim_isAnyInt (c2)
- || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+ if (context_getFlag (FLG_IGNORESIGNS))
+ {
+ return (cprim_isAnyUnsignedInt (c2)
+ || (cprim_isUnsignedChar (c2) && context_msgCharInt ()));
+ }
+ else
+ {
+ return (cprim_isAnyInt (c2)
+ || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+ }
}
else if (context_getFlag (FLG_LONGUNSIGNEDUNSIGNEDINTEGRAL))
{
}
}
+
+ DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2)));
+
if (context_getFlag (FLG_RELAXTYPES))
{
if (cprim_isNumeric (c1) && cprim_isNumeric (c2)) return TRUE;
{
case CTX_CHAR:
case CTX_UCHAR:
- return (cprim_isAnyChar (c2)
- || (cprim_isAnyInt (c2) && (context_msgCharInt ())));
+ if (cprim_isAnyChar (c2)
+ || (cprim_isAnyInt (c2) && (context_msgCharInt ()))) {
+ return TRUE;
+ }
+ break;
case CTX_DOUBLE:
case CTX_FLOAT:
case CTX_LDOUBLE:
- return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE);
+ if (c2 == CTX_DOUBLE || c2 == CTX_FLOAT || c2 == CTX_LDOUBLE) {
+ return TRUE;
+ }
+ break;
case CTX_INT:
case CTX_LINT:
case CTX_LLINT:
case CTX_UINT:
case CTX_ULINT:
case CTX_USINT:
- return (cprim_isAnyInt (c2)
- || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+ if (cprim_isAnyInt (c2)
+ || (cprim_isAnyChar (c2) && context_msgCharInt ())) {
+ return TRUE;
+ }
+ /*@fallthrough@*/
default:
- return FALSE;
+ ;
}
}
- else
+
+ if (context_getFlag (FLG_IGNORESIGNS))
{
- if (context_getFlag (FLG_IGNORESIGNS))
+ if (c1 == CTX_UCHAR)
{
- if (c1 == CTX_UCHAR)
- {
- c1 = CTX_CHAR;
- }
- else if (c1 == CTX_UINT)
- {
- c1 = CTX_INT;
- }
- else if (c1 == CTX_ULINT)
- {
- c1 = CTX_LINT;
- }
- /* 2001-06-10: This fix provided by Jim Zelenka: */
- else if (c1 == CTX_ULLINT)
- {
- c1 = CTX_LLINT;
- }
- /* End fix */
- else if (c1 == CTX_USINT)
- {
- c1 = CTX_SINT;
- }
- else
- {
- ;
- }
-
- if (c2 == CTX_UCHAR)
- {
- c2 = CTX_CHAR;
- }
- else if (c2 == CTX_UINT)
- {
- c2 = CTX_INT;
- }
- else if (c2 == CTX_ULINT)
- {
- c2 = CTX_LINT;
- }
- /* 2001-06-10: This fix provided by Jim Zelenka: */
- else if (c2 == CTX_ULLINT)
- {
- c2 = CTX_LLINT;
- }
- /* End fix */
- else if (c2 == CTX_USINT)
- {
- c2 = CTX_SINT;
- }
- else
- {
- ;
- }
+ c1 = CTX_CHAR;
}
-
- if (c1 == c2) return TRUE;
-
- if (context_getFlag (FLG_FLOATDOUBLE))
+ else if (c1 == CTX_UINT)
{
- if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE)
- {
- return TRUE;
- }
- if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE)
- {
- return TRUE;
- }
+ c1 = CTX_INT;
}
+ else if (c1 == CTX_ULINT)
+ {
+ c1 = CTX_LINT;
+ }
+ /* 2001-06-10: This fix provided by Jim Zelenka: */
+ else if (c1 == CTX_ULLINT)
+ {
+ c1 = CTX_LLINT;
+ }
+ /* End fix */
+ else if (c1 == CTX_USINT)
+ {
+ c1 = CTX_SINT;
+ }
+ else
+ {
+ ;
+ }
+
+ if (c2 == CTX_UCHAR)
+ {
+ c2 = CTX_CHAR;
+ }
+ else if (c2 == CTX_UINT)
+ {
+ c2 = CTX_INT;
+ }
+ else if (c2 == CTX_ULINT)
+ {
+ c2 = CTX_LINT;
+ }
+ /* 2001-06-10: This fix provided by Jim Zelenka: */
+ else if (c2 == CTX_ULLINT)
+ {
+ c2 = CTX_LLINT;
+ }
+ /* End fix */
+ else if (c2 == CTX_USINT)
+ {
+ c2 = CTX_SINT;
+ }
+ else
+ {
+ ;
+ }
+ }
- if (!deep && context_getFlag (FLG_RELAXQUALS))
+ if (c1 == c2) return TRUE;
+
+ if (context_getFlag (FLG_FLOATDOUBLE))
+ {
+ if (c1 == CTX_FLOAT && c2 == CTX_DOUBLE)
{
- switch (c1)
- {
- case CTX_DOUBLE:
- return (c2 == CTX_FLOAT);
- case CTX_LDOUBLE:
- return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT);
- case CTX_SINT:
- return (c2 == CTX_CHAR && context_msgCharInt ());
- case CTX_INT:
- return (c2 == CTX_SINT
- || (cprim_isAnyChar (c2) && context_msgCharInt ()));
- case CTX_LLINT:
- return (c2 == CTX_SINT
- || c2 == CTX_INT
+ return TRUE;
+ }
+ if (c2 == CTX_FLOAT && c1 == CTX_DOUBLE)
+ {
+ return TRUE;
+ }
+ }
+
+ DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2)));
+
+ if (!deep && context_getFlag (FLG_RELAXQUALS))
+ {
+ switch (c1)
+ {
+ case CTX_DOUBLE:
+ return (c2 == CTX_FLOAT);
+ case CTX_LDOUBLE:
+ return (c2 == CTX_DOUBLE || c2 == CTX_FLOAT);
+ case CTX_SINT:
+ return ((c2 == CTX_CHAR && context_msgCharInt ())
+ || (c2 == CTX_INT && context_msgShortInt ())
+ || (c2 == CTX_LINT && context_msgShortInt () && context_msgLongInt ()));
+
+ case CTX_INT:
+ return ((c2 == CTX_SINT
+ || (cprim_isAnyChar (c2) && context_msgCharInt ())
+ || (c2 == CTX_LINT && context_msgLongInt ())));
+
+ case CTX_LLINT:
+ return (c2 == CTX_SINT
+ || c2 == CTX_INT
|| c2 == CTX_LINT
- || (cprim_isAnyChar (c2) && context_msgCharInt ()));
- case CTX_ULLINT:
- return (c2 == CTX_USINT
- || c2 == CTX_UINT
- || c2 == CTX_ULINT
- /* 2001-06-10: This fix provided by Jim Zelenka: */
- || (cprim_isAnyChar (c2) && context_msgCharInt ()));
- case CTX_LINT:
- return (c2 == CTX_SINT
- || c2 == CTX_INT
- || (cprim_isAnyChar (c2) && context_msgCharInt ()));
- case CTX_UINT:
- return (c2 == CTX_USINT
- || (c2 == CTX_UCHAR && context_msgCharInt ()));
- case CTX_USINT:
- return (c2 == CTX_UCHAR && context_msgCharInt ());
- case CTX_ULINT:
- /* 2001-06-10: This fix provided by Jim Zelenka: */
- return (c2 == CTX_UINT || c2 == CTX_USINT
- || (c2 == CTX_UCHAR && context_msgCharInt()));
- case CTX_UCHAR:
- return (c2 == CTX_UINT && context_msgCharInt ());
- case CTX_CHAR:
- return ((c2 == CTX_INT || c2 == CTX_SINT)
- && context_msgCharInt ());
- default:
- return FALSE;
- }
+ || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+ case CTX_ULLINT:
+ return (c2 == CTX_USINT
+ || c2 == CTX_UINT
+ || c2 == CTX_ULINT
+ /* 2001-06-10: This fix provided by Jim Zelenka: */
+ || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+ case CTX_LINT:
+ return (c2 == CTX_SINT
+ || c2 == CTX_INT
+ || (cprim_isAnyChar (c2) && context_msgCharInt ()));
+ case CTX_UINT:
+ return (c2 == CTX_USINT
+ || (c2 == CTX_UCHAR && context_msgCharInt ()));
+ case CTX_USINT:
+ return (c2 == CTX_UCHAR && context_msgCharInt ());
+ case CTX_ULINT:
+ /* 2001-06-10: This fix provided by Jim Zelenka: */
+ return (c2 == CTX_UINT || c2 == CTX_USINT
+ || (c2 == CTX_UCHAR && context_msgCharInt()));
+ case CTX_UCHAR:
+ return (c2 == CTX_UINT && context_msgCharInt ());
+ case CTX_CHAR:
+ return ((c2 == CTX_INT || c2 == CTX_SINT)
+ && context_msgCharInt ());
+ default:
+ return FALSE;
}
- else
+ }
+ else
+ {
+ switch (c1)
{
- switch (c1)
- {
- case CTX_DOUBLE:
- case CTX_LDOUBLE:
- return FALSE;
- case CTX_SINT:
- case CTX_INT:
- case CTX_LINT:
- case CTX_LLINT:
- return (c2 == CTX_CHAR && context_msgCharInt ());
- case CTX_UINT:
- case CTX_USINT:
- case CTX_ULINT:
- case CTX_ULLINT:
- return (c2 == CTX_UCHAR && context_msgCharInt ());
- case CTX_UCHAR:
- return (c2 == CTX_UINT && context_msgCharInt ());
- case CTX_CHAR:
- return ((c2 == CTX_INT || c2 == CTX_SINT)
- && context_msgCharInt ());
- default:
- return FALSE;
- }
+ case CTX_DOUBLE:
+ case CTX_LDOUBLE:
+ return FALSE;
+ case CTX_SINT:
+ if (c2 == CTX_INT && context_msgShortInt ()) {
+ return TRUE;
+ }
+ /*@fallthrough@*/
+ case CTX_INT:
+ if (c2 == CTX_INT && context_msgLongInt ()) {
+ return TRUE;
+ }
+
+ if (c2 == CTX_SINT && context_msgShortInt ()) {
+ return TRUE;
+ }
+ /*@fallthrough@*/
+ case CTX_LINT:
+ if (c2 == CTX_INT && context_msgLongInt ()) {
+ return TRUE;
+ }
+ /*@fallthrough@*/
+ case CTX_LLINT:
+ return (c2 == CTX_CHAR && context_msgCharInt ());
+ case CTX_UINT:
+ case CTX_USINT:
+ case CTX_ULINT:
+ case CTX_ULLINT:
+ return (c2 == CTX_UCHAR && context_msgCharInt ());
+ case CTX_UCHAR:
+ return (c2 == CTX_UINT && context_msgCharInt ());
+ case CTX_CHAR:
+ return ((c2 == CTX_INT || c2 == CTX_SINT)
+ && context_msgCharInt ());
+ default:
+ return FALSE;
}
}
}
|| (cprim_isAnyChar (c) && context_msgCharInt ()));
}
-
-
-
+int cprim_getExpectedBits (cprim c)
+{
+ /* Any basis to these numbers? Just guesses for now..., check ISO spec */
+ switch (c)
+ {
+ case CTX_UNKNOWN:
+ return 0;
+ case CTX_VOID:
+ return 0;
+ case CTX_CHAR:
+ return 8;
+ case CTX_UCHAR:
+ return 8;
+ case CTX_DOUBLE:
+ return 64;
+ case CTX_LDOUBLE:
+ return 128;
+ case CTX_FLOAT:
+ return 32;
+ case CTX_INT:
+ return 32;
+ case CTX_LINT:
+ return 64;
+ case CTX_LLINT:
+ return 128;
+ case CTX_ULLINT:
+ return 128;
+ case CTX_SINT:
+ return 8;
+ case CTX_UINT:
+ return 32;
+ case CTX_ULINT:
+ return 64;
+ case CTX_USINT:
+ return 8;
+ case CTX_UNSIGNEDINTEGRAL:
+ return 64;
+ case CTX_SIGNEDINTEGRAL:
+ return 64;
+ case CTX_ANYINTEGRAL:
+ return 64;
+ default:
+ return 0;
+ }
+}