/*
-** 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
*/
/*
** nameChecks.c
*/
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# include "basic.h"
# include "nameChecks.h"
static bool checkCzechName (uentry p_ue, flagcode p_czechflag, bool p_report)
- /*@modifies p_ue, g_msgstream@*/ ;
+ /*@modifies p_ue, g_warningstream@*/ ;
static bool checkSlovakName (uentry p_ue, flagcode p_slovakflag, bool p_report)
- /*@modifies p_ue, g_msgstream@*/ ;
+ /*@modifies p_ue, g_warningstream@*/ ;
static cstring czechPrefix (cstring name)
{
static cstring slovakPrefix (cstring name)
{
- int i = 0;
+ size_t i = 0;
cstring_chars (name, c)
{
}
else
{
- int namelen = cstring_length (name);
+ size_t namelen = cstring_length (name);
int last = (int) '\0';
- int n = 1;
+ size_t n = 1;
cstring_chars (prefix, pc)
{
if (!matchPrefix (name, context_getString (flag)))
{
- if (optgenerror
- (flag,
+ llassert (flag != FLG_NAMECHECKS);
+
+ if (optgenerror2
+ (flag, FLG_NAMECHECKS,
message ("%s %s name is not consistent with %s "
"namespace prefix \"%s\"",
uentry_ekindName (ue),
if (matchPrefix (name, context_getString (rcode)))
{
- if (optgenerror
- (code,
+ if (optgenerror2
+ (code, FLG_NAMECHECKS,
message
("%s %s name is not a %s (it is a %s), "
"but matches the %s "
{
if (isupper ((unsigned char) c))
{
- if (optgenerror
- (FLG_CZECHOSLOVAKTYPES,
+ if (optgenerror2
+ (FLG_CZECHOSLOVAKTYPES, FLG_NAMECHECKS,
message
("%s %q name violates Czechoslovak naming convention. "
"Czechoslovak datatype names should not use uppercase "
if (c == '_' && charno != 2 && charno != 3)
{
- if (optgenerror
- (FLG_CZECHOSLOVAKTYPES,
+ if (optgenerror2
+ (FLG_CZECHOSLOVAKTYPES, FLG_NAMECHECKS,
message ("%s %q name violates Czechoslovak naming "
"convention. Czechoslovak datatype names "
"should not use the _ charater.",
if (!okay)
{
- if (optgenerror
- (czechoslovakflag,
+ if (optgenerror2
+ (czechoslovakflag, FLG_NAMECHECKS,
message ("%s %q name is not consistent with Czechoslovak "
"naming convention.",
uentry_ekindName (ue),
{
if (report)
{
- if (optgenerror
- (FLG_CZECHTYPES,
+ if (optgenerror2
+ (FLG_CZECHTYPES, FLG_NAMECHECKS,
message
("%s %q name violates Czech naming convention. "
"Czech datatype names should not use the _ charater.",
{
if (report)
{
- if (optgenerror
- (czechflag,
+ if (optgenerror2
+ (czechflag, FLG_NAMECHECKS,
message ("%s %q name is not consistent with Czech "
"naming convention. The name should "
"begin with %s_",
{
if (report)
{
- if (optgenerror
- (czechflag,
+ if (optgenerror2
+ (czechflag, FLG_NAMECHECKS,
message ("%s %q name is not consistent with Czech "
"naming convention. Accessible types: %q",
uentry_ekindName (ue),
{
if (report)
{
- if (optgenerror
- (czechflag,
+ if (optgenerror2
+ (czechflag, FLG_NAMECHECKS,
message
("%s %q name violates Czech naming convention. "
"Czech prefix %s is not the name of a type.",
{
if (report)
{
- if (optgenerror
- (FLG_SLOVAKTYPES,
+ if (optgenerror2
+ (FLG_SLOVAKTYPES, FLG_NAMECHECKS,
message
("%s %q name violates Slovak naming convention. "
"Slovak datatype names should not use uppercase "
{
if (report)
{
- if (optgenerror
- (slovakflag,
+ if (optgenerror2
+ (slovakflag, FLG_NAMECHECKS,
message ("%s %q name is not consistent with Slovak "
"naming convention. Accessible types: %q",
uentry_ekindName (ue),
{
if (report)
{
- if (optgenerror
- (slovakflag,
+ if (optgenerror2
+ (slovakflag, FLG_NAMECHECKS,
message ("%s %q name is not consistent with "
"Slovak naming convention. The "
"name should begin with %s followed "
{
if (report)
{
- if (optgenerror
- (slovakflag,
+ if (optgenerror2
+ (slovakflag, FLG_NAMECHECKS,
message
("%s %q name violates Slovak naming convention. "
"Slovak prefix %s is not the name of a type.",
** No file scope checks (yet)
*/
- /*@i423 add a file scope naming convention policy? */
+ /* add a file scope naming convention policy? */
return;
}
static ob_mstring cppNames[NCPPNAMES] =
{
"and", "and_eq", "asm",
- "bitand", "bitor", "bool", /* gasp: "bool", is special for lclint */
+ "bitand", "bitor", "bool", /* gasp: "bool", is special for splint */
"catch", "class", "compl", "const_class",
"delete", "dynamic_cast", "false", "friend",
"inline", "mutable", "namespace", "new",
if (cstring_isDefined (cstring_bsearch (name, &cppNames[0],
NCPPNAMES)))
{
- if (optgenerror
- (FLG_CPPNAMES,
+ if (optgenerror2
+ (FLG_CPPNAMES, FLG_NAMECHECKS,
message ("Name %s is a keyword or reserved word in C++",
name),
uentry_whereLast (ue)))
{
bool hasError = FALSE;
cstring name = uentry_observeRealName (ue);
- int length = cstring_length (name);
+ size_t length = cstring_length (name);
char fchar = (length >= 1) ? cstring_firstChar (name) : '\0';
char schar = (length >= 2) ? cstring_secondChar (name) : '\0';
char tchar = (length >= 3) ? cstring_getChar (name, 3) : '\0';
if (cstring_isDefined (cstring_bsearch (name, &reservedNames[0],
NRESERVEDNAMES)))
{
- hasError |= optgenerror
- (FLG_ANSIRESERVED,
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
message ("Name %s is reserved for the standard library",
name),
uentry_whereLast (ue));
}
if (uentry_isFileStatic (ue) || uentry_isVisibleExternally (ue) || uentry_isAnyTag (ue)
- || context_getFlag (FLG_ANSIRESERVEDLOCAL))
+ || context_getFlag (FLG_ISORESERVEDLOCAL))
{
if (fchar == '_')
{
- hasError |= optgenerror
- (FLG_ANSIRESERVED,
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
message
("Name %s is in the implementation name space (any identifier "
"beginning with underscore)",
if (fchar == '_'
&& (schar == '_' || isupper ((int) schar)))
{
- hasError |= optgenerror
- (FLG_ANSIRESERVED,
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
message
("Name %s is in the implementation name space (any identifier "
"beginning with underscore and either an uppercase letter or "
if (fchar == 'E' && (isdigit ((int) schar)
|| isupper ((int) schar)))
{
- hasError |= optgenerror
- (FLG_ANSIRESERVED,
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"Macros beginning with E and a digit or uppercase letter "
- "may be added to <errno.h>. (See ANSI, Section 4.13.1)",
+ "may be added to <errno.h>. (ISO99:7.26.3)",
name),
uentry_whereLast (ue));
}
&& (tchar == '_'))
&& (isupper ((int) rchar)))
{
- hasError |= optgenerror
- (FLG_ANSIRESERVED,
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"Macros beginning with \"LC_\" and an uppercase letter may "
- "be added to <locale.h>. (See ANSI, Section 4.13.3)",
+ "be added to <locale.h>. (ISO99:7.26.5)",
name),
uentry_whereLast (ue));
}
&& isupper ((int) cstring_getChar (name, 5)))))
|| (isupper ((int) rchar))))
{
- hasError |= optgenerror
- (FLG_ANSIRESERVED,
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"Macros that begin with SIG and an uppercase letter or SIG_ "
"and an uppercase letter may be added to "
- "<signal.h>. (See ISO99 7.14 or ANSI 4.13.5)",
+ "<signal.h>. (ISO99:7.14)",
name),
uentry_whereLast (ue));
}
- DPRINTF (("Here..."));
+ /*
+ ** evans - 2002-12-16: added this check (even though it is not required by ISO)
+ */
+
+ if (fchar == 'S' && schar == 'A' && tchar == '_')
+ {
+ hasError |= optgenerror2
+ (FLG_ISORESERVED, FLG_NAMECHECKS,
+ message
+ ("Name %s may be defined as a macro by Linux library. "
+ "It is not research by the ISO specification, but may produce conflicts on some systems.",
+ name),
+ uentry_whereLast (ue));
+ }
if ((uentry_isVisibleExternally (ue) && !uentry_isAnyTag (ue))
- || context_getFlag (FLG_ANSIRESERVEDLOCAL))
+ || context_getFlag (FLG_ISORESERVEDLOCAL))
{
flagcode flg;
if (uentry_isVisibleExternally (ue) && !uentry_isAnyTag (ue))
{
- flg = FLG_ANSIRESERVED;
+ flg = FLG_ISORESERVED;
}
else
{
- flg = FLG_ANSIRESERVEDLOCAL;
+ flg = FLG_ISORESERVEDLOCAL;
}
+ DPRINTF (("ue: %s", uentry_unparseFull (ue)));
+
/*
** These restrictions only apply to identifiers with global linkage.
*/
|| (fchar == 't' && schar == 'o'))
&& (islower ((int) tchar)))
{
- hasError |= optgenerror
- (flg,
+ hasError |= optgenerror2
+ (flg, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"Functions beginning with \"is\" or \"to\" and a lowercase "
- "letter may be added to <ctype.h>. (See ANSI, Section 4.13.2)",
+ "letter may be added to <ctype.h>. (ISO99:7.26.2)",
name),
uentry_whereLast (ue));
if ((cstring_lastChar (name) == 'f' || cstring_lastChar (name) == 'l')
&&
(((length == 4)
- && ((cstring_equalPrefix (name, "cos") ||
- cstring_equalPrefix (name, "sin") ||
- cstring_equalPrefix (name, "tan") ||
- cstring_equalPrefix (name, "exp") ||
- cstring_equalPrefix (name, "log") ||
- cstring_equalPrefix (name, "pow"))))
+ && ((cstring_equalPrefixLit (name, "cos") ||
+ cstring_equalPrefixLit (name, "sin") ||
+ cstring_equalPrefixLit (name, "tan") ||
+ cstring_equalPrefixLit (name, "exp") ||
+ cstring_equalPrefixLit (name, "log") ||
+ cstring_equalPrefixLit (name, "pow"))))
|| ((length == 5)
- && ((cstring_equalPrefix (name, "acos") ||
- cstring_equalPrefix (name, "asin") ||
- cstring_equalPrefix (name, "atan") ||
- cstring_equalPrefix (name, "cosh") ||
- cstring_equalPrefix (name, "sinh") ||
- cstring_equalPrefix (name, "sqrt") ||
- cstring_equalPrefix (name, "ceil") ||
- cstring_equalPrefix (name, "fabs") ||
- cstring_equalPrefix (name, "fmod") ||
- cstring_equalPrefix (name, "tanh") ||
- cstring_equalPrefix (name, "modf"))))
+ && ((cstring_equalPrefixLit (name, "acos") ||
+ cstring_equalPrefixLit (name, "asin") ||
+ cstring_equalPrefixLit (name, "atan") ||
+ cstring_equalPrefixLit (name, "cosh") ||
+ cstring_equalPrefixLit (name, "sinh") ||
+ cstring_equalPrefixLit (name, "sqrt") ||
+ cstring_equalPrefixLit (name, "ceil") ||
+ cstring_equalPrefixLit (name, "fabs") ||
+ cstring_equalPrefixLit (name, "fmod") ||
+ cstring_equalPrefixLit (name, "tanh") ||
+ cstring_equalPrefixLit (name, "modf"))))
|| ((length == 6)
- && ((cstring_equalPrefix (name, "atan2") ||
- cstring_equalPrefix (name, "floor") ||
- cstring_equalPrefix (name, "frexp") ||
- cstring_equalPrefix (name, "ldexp") ||
- cstring_equalPrefix (name, "log10"))))))
+ && ((cstring_equalPrefixLit (name, "atan2") ||
+ cstring_equalPrefixLit (name, "floor") ||
+ cstring_equalPrefixLit (name, "frexp") ||
+ cstring_equalPrefixLit (name, "ldexp") ||
+ cstring_equalPrefixLit (name, "log10"))))))
{
- hasError |= optgenerror
- (flg,
+ hasError |= optgenerror2
+ (flg, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"The names of all existing functions in <math.h> suffixed "
- "with 'f' or 'l' may be added to <math.h>. (See ANSI, Section 4.13.4)",
+ "with 'f' or 'l' may be added to <math.h>. (ISO:7.26.1)",
name),
uentry_whereLast (ue));
}
if (fchar == 's' && schar == 't' && tchar == 'r'
&& (islower ((int) rchar)))
{
- hasError |= optgenerror
- (flg,
+ hasError |= optgenerror2
+ (flg, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"Functions that begin with \"str\" and a lowercase letter "
- "may be added to <stdlib.h> or <string.h>. (See ANSI, Section 4.13.7)",
+ "may be added to <stdlib.h> or <string.h>. (ISO99:7.26.9)",
name),
uentry_whereLast (ue));
}
|| (fchar == 'w' && schar == 'c' && tchar == 's'))
&& (islower ((int) rchar)))
{
- hasError |= optgenerror
- (flg,
+ hasError |= optgenerror2
+ (flg, FLG_NAMECHECKS,
message
- ("Name %s is reserved for future ANSI library extensions. "
+ ("Name %s is reserved for future library extensions. "
"Functions that begin with \"mem\" or \"wcs\" and a "
- "lowercase letter letter may be added to <string.h>. (See ANSI, Section 4.13.8)",
+ "lowercase letter may be added to <string.h>. (ISO:7.26.11)",
name),
uentry_whereLast (ue));
}
{
if (noformal && !cstring_isDefined (fpfx))
{
- if (optgenerror
- (FLG_DECLPARAMNAME,
+ if (optgenerror2
+ (FLG_DECLPARAMNAME, FLG_NAMECHECKS,
message ("Declaration parameter has name: %q",
uentry_getName (p)),
uentry_whereLast (p)))
{
cstring pname = uentry_observeRealName (p);
- if (!cstring_equalPrefix (pname, cstring_toCharsSafe (fpfx)))
+ if (!cstring_equalPrefix (pname, fpfx))
{
if (context_getFlag (FLG_NAMECHECKS))
{
- if (optgenerror
- (FLG_DECLPARAMPREFIX,
+ if (optgenerror2
+ (FLG_DECLPARAMPREFIX, FLG_NAMECHECKS,
message ("Declaration parameter name %s does not begin "
"with protoparamprefix (%s)",
pname, fpfx),
}
}
-
-
-
+/* not yet checked: POSIX p. 527 - applications should not declare any symbols that end _MAX */