TL;DR
The memset() function in C++ can cause memory overflows if you’re not careful about the size of the buffer you’re trying to fill. This guide shows how to avoid this common problem by always checking your buffer sizes and using safer alternatives when appropriate.
Understanding the Problem
memset() sets a block of memory to a specific value. It takes three arguments:
- The pointer to the start of the memory block.
- The value to set (usually 0 for initialization).
- The number of bytes to set.
If you provide a size that’s larger than the allocated buffer, you’ll write beyond the bounds of your memory, leading to crashes or unpredictable behaviour. This is called a buffer overflow.
How to Prevent memset() Overflows
- Always Know Your Buffer Size: Before using
memset(), make sure you know exactly how much memory your buffer can hold. - Use the Correct Size Argument: Double-check that the size argument passed to
memset()is less than or equal to the actual buffer size. - Consider Safer Alternatives: For some tasks, other functions might be safer and more appropriate.
Step-by-Step Fixes
Let’s look at examples of how to fix potential overflows.
1. Using sizeof()
If you have an array declared on the stack, use sizeof() to determine its size:
char buffer[10];
memset(buffer, 0, sizeof(buffer)); // Correct: fills all 10 bytes
Important: Don’t rely on sizeof() for dynamically allocated memory (e.g., using new or malloc). You need to keep track of the size yourself.
2. Checking Buffer Size Before memset()
If you are working with a pointer and don’t know the buffer size, explicitly check it before calling memset():
char *buffer = (char *)malloc(50);
if (buffer != NULL) {
size_t bufferSize = 50; // Keep track of the allocated size
if (bufferSize > 0) {
memset(buffer, 0, bufferSize); // Safe: fills up to bufferSize bytes
}
free(buffer);
}
3. Using Standard Library Algorithms
For filling vectors, use the vector’s built-in methods:
#include
std::vector myVector(10);
myVector.assign(10, 0); // Safer: fills all elements of the vector
4. Avoiding memset() with Strings
When dealing with strings (char* or std::string), use string-specific functions:
#include
char str[20];
strcpy(str, ""); // Clear the string. Be careful about buffer size!
Or, for std::string:
#include
std::string myString = "some text";
myString = ""; // Safer: clears the std::string content
Debugging memset() Overflows
- Valgrind (Linux): Use Valgrind to detect memory errors, including buffer overflows.
- AddressSanitizer (ASan) (Clang/GCC): ASan is a fast memory error detector that can identify overflows during runtime. Compile with the
-fsanitize=addressflag. - Debuggers: Step through your code and inspect the memory to see if you’re writing beyond the allocated bounds.

