I tried the below c program & I expected to get compile time error, but why compiler isn't giving any error?
#include <stdio.h>
int main(void)
{
printf("%d\n");
return 0;
}
Why output is compiler dependent? Here is the output on various compilers
Output on Orwell Dev C++ IDE (uses gcc 4.8.1) : 0
Output on Visual C++ provided by Visual Studio 2010 : 0
CodeBlocks IDE (uses gcc 4.7.1) : garbage value
Online compiler ideone.com : garbage value
What is going wrong here ?
The printf function uses its first argument to determine how many arguments will follow and of what types they are. If you don't use enough arguments or if they are of the wrong type than printf will get confuses, with as a result wrong answers.
Printf is not the thing being buffered, it's stdio, so all similar functions will behave in the same way. To demonstrate the buffering, all you have to do is printf a lot of characters, usually more than 1024, and printf will print as you will have exceeded the maximum buffer length and it will automatically fflush.
"printf" is the name of one of the main C output functions, and stands for "print formatted". printf format strings are complementary to scanf format strings, which provide formatted input (lexing aka. parsing).
The printf function (the name comes from “print formatted”) prints a string on the screen using a “format string” that includes the instructions to mix several strings and produce the final string to be printed on the screen.
Your program will compile fine, as printf()
is a variadic function and the matching check of the number of format specifiers with supplied argument is not performed by default.
At runtime, your program exhibits undefined behaviour, as there in no argument supplied which has to be printed using the supplied format specifier.
As per chapter 7.19.6.1, c99
standard, (from fprintf()
)
If there are insufficient arguments for the format, the behavior is undefined.
If you compile using -Wformat
flag in gcc
, your compiler will produce the warning for the mismatch.
Because of how C variadic arguments work, the compiler cannot track their correct usage. It is still (syntactically) legal to provide less, or more, parameters that the function needs to work, although this generally ends up as undefined behavior when looking at the standard.
The declaration of printf
looks like this:
int printf(const char*, ...);
The compiler only sees ...
, and knows that there may be zero or more additional arguments that the function may or may not use. The called function does not know how many arguments it is passed; it can, at best, assume that it was passed all the information it needs and nothing more.
Contrast this with other languages, like C#:
void WriteLine(string format, params object[] arguments);
Here, the method knows exactly how many additional arguments is was passed (doing arguments.Length
).
In C, variadic functions and especially printf
are a frequent cause of security vulnerabilities. Printf
ends up reading raw bytes from the stack, which may leak important details about your application and its security environment.
For this reason, Clang and GCC support a special extension to validate printf
formats. If you use an invalid format string, you'll get a warning (not an error).
code.c:4:11: warning: more '%' conversions than data arguments [-Wformat]
printf("%d\n");
~~^
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With