X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/155af98de2d41917730964947d990b7fb70ddc01..e0a05ba95145c0c1714b0c9a3e7eaf91a8ffc33b:/src/cprim.c diff --git a/src/cprim.c b/src/cprim.c index 4a0210f..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,6 +81,8 @@ 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) { @@ -106,11 +108,24 @@ 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)) { - 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)) { @@ -124,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 ())); @@ -195,6 +215,9 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) } } + + 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; @@ -206,12 +229,18 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) { 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: @@ -220,156 +249,180 @@ cprim_closeEnoughAux (cprim c1, cprim c2, bool deep) 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; } } } @@ -426,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; + } +}