...
This noncompliant code example declares the msg identifier at file scope and reuses the same identifier to declare a character array local to the report_error() function. The programmer may unintentionally copy the function argument to the locally declared msg array within the report_error() function. Depending on the programmer's intention, this either fails to initialize the global variable msg, or this allows the local msg buffer to overflow by using the global value msgsize as a bounds for the local buffer.
| Code Block | ||||
|---|---|---|---|---|
| ||||
static char msg[100];
static const size_t msgsize = sizeof( msg);
void report_error(const char *str) {
char msg[80];
snprintf(msg, msgsize, "Error: %s\n", str);
/* ... */
}
int main() {
/* ... */
report_error("some error");
}
|
...
This compliant solution uses different, more descriptive variable names.
| Code Block | ||||
|---|---|---|---|---|
| ||||
static char message[100];
static const size_t message_size = sizeof( message);
void report_error(const char *str) {
char msg[80];
snprintf(msg, sizeof( msg), "Error: %s\n", str);
/* ... */
}
int main() {
/* ... */
report_error("some error");
}
|
...
DCL01-EX1: A function argument in a function declaration may clash with a variable in a containing scope, provided that when the function is defined, the argument has a name that clashes with no variables in any containing scopes.
| Code Block | ||||
|---|---|---|---|---|
| ||||
extern int name;
void f(char *name); // declaration: no problem here
// ...
void f(char *arg) { // definition: no problem, arg doesn't hide name
// use arg
}
|
...