Calling a function with incorrect arguments can result in unexpected or unintended program behavior. Functions that are appropriately declared [[DCL07-A. Include the appropriate type information in function declarators]] will fail compilation if they are supplied with the wrong number or types of arguments. However, there are cases where supplying the incorrect arguments to a function will only generate compiler warnings. These warnings should be resolved [[MSC00-A. Compile cleanly at high warning levels]], but do not prevent program compilation.
Non-Compliant Code Example: (function pointers)
In this example, the function pointer fp
is used to refer to the function strchr()
, which is defined elsewhere. However, fp
is defined without the appropriate parameter list, and the function prototype for strchr()
is not visible to this program. As a result there is no type checking performed on the call to fp(12,2);
.
#include <stdio.h> extern char *strchr(); char *(*fp) (); int main(void) { char *c; fp = strchr; c = fp(12,2); printf("%s\n",c); }
Note that this example also violates recommendation [[DCL07-A. Include the appropriate type information in function declarators]].
Compliant Solution: (function pointers)
#include <string.h> char *(*fp) (cjar *,int); int main(void) { char *c; fp = strchr; c = fp("Hello",'H'); printf("%s\n",c); }
Non-Compliant Code Example: (variadic functions)
The POSIX function open()
[[Open Group 04]] is a variadic function with the following prototype:
int open(const char *path, int oflag, ... );
The open()
function accepts a third argument to determine a newly created file's access mode. If open()
is used to create a new file and the third argument is omitted, the file may be created with unintended access permissions [[FIO06-A. Create files with appropriate access permissions]].
/* ... */ int fd = open(file_name, O_CREAT | O_WRONLY); /* access permissions are missing */ if (fd == -1){ /* Handle Error */ } /* ... */
Compliant Solution: (variadic functions)
To correct this example, a third argument is specified in the call to open()
.
/* ... */ int fd = open(file_name, O_CREAT | O_WRONLY, file_access_permissions); if (fd == -1){ /* Handle Error */ } /* ... */