better message for strncpy zero-terminated check
This commit is contained in:
parent
a1aa66f370
commit
d643397a7e
|
@ -157,7 +157,13 @@ void CheckBufferOverrun::sizeArgumentAsCharError(const Token *tok)
|
||||||
|
|
||||||
void CheckBufferOverrun::terminateStrncpyError(const Token *tok, const std::string &varname)
|
void CheckBufferOverrun::terminateStrncpyError(const Token *tok, const std::string &varname)
|
||||||
{
|
{
|
||||||
reportError(tok, Severity::warning, "terminateStrncpy", "After a strncpy() the buffer '" + varname + "' should be zero-terminated");
|
reportError(tok, Severity::warning, "terminateStrncpy",
|
||||||
|
"The buffer '" + varname + "' may not be zero-terminated after the call to strncpy().\n"
|
||||||
|
"The use of strncpy() usually indicates that the programmer wants to ensure "
|
||||||
|
"the buffer is zero-terminated after the call. However if the (buffer) size given for "
|
||||||
|
"the strncpy() call matches the actual buffer size strncpy() does not add the "
|
||||||
|
"zero at the end of the buffer. This may cause bugs later in the code if "
|
||||||
|
"the code assumes buffer is zero-terminated.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckBufferOverrun::cmdLineArgsError(const Token *tok)
|
void CheckBufferOverrun::cmdLineArgsError(const Token *tok)
|
||||||
|
|
|
@ -2794,7 +2794,7 @@ private:
|
||||||
" strncpy(baz, bar, sizeof(baz));\n"
|
" strncpy(baz, bar, sizeof(baz));\n"
|
||||||
" bar[99] = 0;\n"
|
" bar[99] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (warning) After a strncpy() the buffer 'baz' should be zero-terminated\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (warning) The buffer 'baz' may not be zero-terminated after the call to strncpy().\n", errout.str());
|
||||||
|
|
||||||
// Test with invalid code that there is no segfault
|
// Test with invalid code that there is no segfault
|
||||||
check("char baz[100];\n"
|
check("char baz[100];\n"
|
||||||
|
@ -2809,7 +2809,7 @@ private:
|
||||||
" foo(baz);\n"
|
" foo(baz);\n"
|
||||||
" foo(baz);\n"
|
" foo(baz);\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (warning) After a strncpy() the buffer 'baz' should be zero-terminated\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (warning) The buffer 'baz' may not be zero-terminated after the call to strncpy().\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void terminateStrncpy2()
|
void terminateStrncpy2()
|
||||||
|
@ -2821,7 +2821,7 @@ private:
|
||||||
" bar[99] = 0;\n"
|
" bar[99] = 0;\n"
|
||||||
" return baz;\n"
|
" return baz;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (warning) After a strncpy() the buffer 'baz' should be zero-terminated\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (warning) The buffer 'baz' may not be zero-terminated after the call to strncpy().\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void terminateStrncpy3()
|
void terminateStrncpy3()
|
||||||
|
@ -2837,7 +2837,7 @@ private:
|
||||||
"void bar(char *p) {\n"
|
"void bar(char *p) {\n"
|
||||||
" strncpy(p, str, 100);\n"
|
" strncpy(p, str, 100);\n"
|
||||||
"}\n", false);
|
"}\n", false);
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (warning) After a strncpy() the buffer 'str' should be zero-terminated\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (warning) The buffer 'str' may not be zero-terminated after the call to strncpy().\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void recursive_long_time()
|
void recursive_long_time()
|
||||||
|
|
Loading…
Reference in New Issue