X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/53306cab3dabf761f459f8f5fdc4b30eca6ec707..e0a05ba95145c0c1714b0c9a3e7eaf91a8ffc33b:/src/cprim.c diff --git a/src/cprim.c b/src/cprim.c index 6dd1be1..b77db8c 100644 --- a/src/cprim.c +++ b/src/cprim.c @@ -1,6 +1,6 @@ /* ** Splint - annotation-assisted static program checker -** Copyright (C) 1994-2002 University of Virginia, +** Copyright (C) 1994-2003 University of Virginia, ** Massachusetts Institute of Technology ** ** This program is free software; you can redistribute it and/or modify it @@ -81,7 +81,7 @@ static bool cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) { if (c1 == c2) return TRUE; - + DPRINTF (("cprim close: %s / %s", cprim_unparse (c1), cprim_unparse (c2))); if (c1 == CTX_ANYINTEGRAL) @@ -108,8 +108,13 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) if (c1 == CTX_UNSIGNEDINTEGRAL) { - if (context_getFlag (FLG_MATCHANYINTEGRAL) - || context_getFlag (FLG_IGNOREQUALS)) + /* We allow signed ints to match any integral if matchanyintegral is set */ + if (context_getFlag (FLG_MATCHANYINTEGRAL)) { + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + } + + if (context_getFlag (FLG_IGNOREQUALS)) { if (context_getFlag (FLG_IGNORESIGNS)) { @@ -134,8 +139,13 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) if (c1 == CTX_SIGNEDINTEGRAL) { - if (context_getFlag (FLG_MATCHANYINTEGRAL) - || context_getFlag (FLG_IGNOREQUALS)) + /* We allow signed ints to match any integral if matchanyintegral is set */ + if (context_getFlag (FLG_MATCHANYINTEGRAL)) { + return (cprim_isAnyInt (c2) + || (cprim_isAnyChar (c2) && context_msgCharInt ())); + } + + if (context_getFlag (FLG_IGNOREQUALS)) { return (cprim_isAnyInt (c2) || (cprim_isAnyChar (c2) && context_msgCharInt ())); @@ -469,6 +479,48 @@ bool cprim_isInt (cprim c) || (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; + } +}