...
In this noncompliant example, the function copy()
is defined to take three arguments but is called with two arguments:
Code Block | ||||
---|---|---|---|---|
| ||||
/* In another source file */
#include <string.h>
void copy(char *dst, const char *src, size_t size) {
if (!strncpy(dst, src, size)) {
/* Report error */
}
}
/* In this source file, no copy prototype in scope */
void copy();
void g(const char *s) {
enum { BUFFERSIZE = 20 };
char buf[BUFFERSIZE];
copy(buf, s);
} |
Compliant Solution
In this compliant solution, the prototype for the copy()
function is included in the scope in the source file where it is used, and the copy()
function is passed the correct number and type of arguments:
Code Block | ||||
---|---|---|---|---|
| ||||
/* In another source file */
#include <string.h>
void copy(char *dst, const char *src, size_t size) {
if (strncpy(dst, src, size) == 0) {
/* Report error */
}
}
/* Copy prototype in scope in this source file */
void copy(char *dst, const char *src, size_t size);
void g(const char *s) {
enum { BUFFERSIZE = 20 };
char buf[BUFFERSIZE];
copy(buf, s, BUFFERSIZE);
}
|
Noncompliant Code Example
In this noncompliant example, the function buginf()
is defined to take a variable number of arguments and expects them all to be signed integers, with a sentinel value of -1
:
...
If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type float are promoted to double. These are called the default argument promotions. If the number of arguments does not equal the number of parameters, the behavior is undefined. If the function is defined with a type that includes a prototype, and either the prototype ends with an ellipsis (, ...) or the types of the arguments after promotion are not compatible with the types of the parameters, the behavior is undefined.
Compliant Solution
In this compliant solution, the prototype for the function buginf()
is included in the scope in the source file where it is used:
Code Block | ||||
---|---|---|---|---|
| ||||
/* In another source file */ void buginf(const char *fmt, ...) { /* ... */ } /* buginf prototype in scope in this source file */ void buginf(const char *fmt, ...); void h(void) { buginf("bug in function %s, line %d\n", "h", __LINE__); /* ... */ } |
Noncompliant Code Example
In this noncompliant example, the function f()
is defined to take an argument of type long
, but f()
is called from another file with an argument of type int
:
Code Block | ||||
---|---|---|---|---|
| ||||
/* In another source file */ long f(long x) { return x < 0 ? -x : x; } /* In this source file, no f prototype in scope */ long f(); long g(int x) { return f(x); } |
Compliant Solution
In this compliant solution, the prototype for the function f()
is included in the scope in the source file where it is used, and the function f()
is correctly called with an argument of type long
:
...