Welcome! Today, I'm going to walk you through the proper use of the printf
function in C without any missteps. Let's get started!
TLDR: The Safe Way to Use printf
If you're in a hurry, here's the golden rule: Always define a format string explicitly when using printf
. Like this:
char *value = "string %d";
printf("%s", value);
Tip: Turn on the -Wformat=2 -Werror
flag during compilation to catch any slip-ups at runtime.
Understanding the Problem
printf
is your go-to function for sending formatted output to the console. It looks like this:
int printf(const char *format, ...);
Parameters of printf
format
: This string contains the text and format tags for output....
: Depending on the format string,printf
may expect additional arguments to replace each format tag.
The catch is that the C compiler usually doesn't warn you if you're using printf
unsafely. For example, this code compiles, but it's a ticking time bomb:
#include <stdio.h>
int main() {
char *a = "string";
printf(a);
}
Although it seems harmless, this code can lead to unpredictable results if a
includes format specifiers without corresponding arguments. Like so:
#include <stdio.h>
int main() {
char *a = "string %d";
printf(a); // Dangerous!
}
The Safe Solution
Here's how you should use printf
:
#include <stdio.h>
int main() {
char *a = "string %d";
printf("%s", a);
}
Compiling with -Wformat=2 -Werror
flags will help you avoid such pitfalls:
$ gcc printf_unsafe.c -Wformat=2 -Werror
printf_unsafe.c: In function ‘main’:
printf_unsafe.c:7:2: error: format not a string literal and no format arguments [-Werror=format-security]
printf(a);
^
cc1: all warnings being treated as errors
Conclusion
And that's it! You now know the safe way to use printf
in C. Remember, explicitly defining format strings and using compiler flags can save you from many headaches. Happy coding and stay safe!