Ashim Kapoor: Added function that returns minimum size of format strings (#694)
This commit is contained in:
parent
2594f9b63f
commit
fe3c8cab9f
|
@ -749,6 +749,70 @@ void CheckBufferOverrun::bufferOverrun()
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
int CheckBufferOverrun::count(const std::string &input_string)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int flag = 1;
|
||||||
|
int input_string_size = 0;
|
||||||
|
int on_on_next = 0;
|
||||||
|
std::string digits_string = "";
|
||||||
|
int digits = 0;
|
||||||
|
|
||||||
|
for (std::string::size_type i = 0; i != input_string.size(); i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (on_on_next == 1)
|
||||||
|
{
|
||||||
|
flag = 1;
|
||||||
|
on_on_next = 0;
|
||||||
|
}
|
||||||
|
switch (input_string[i])
|
||||||
|
{
|
||||||
|
case 'd':
|
||||||
|
case 'i':
|
||||||
|
case 'c':
|
||||||
|
case 'e':
|
||||||
|
case 'E':
|
||||||
|
case 'f':
|
||||||
|
case 'g':
|
||||||
|
case 'o':
|
||||||
|
case 's':
|
||||||
|
case 'u':
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
case 'p':
|
||||||
|
case 'n':
|
||||||
|
if (flag == 0) on_on_next = 1;
|
||||||
|
break;
|
||||||
|
case '%':
|
||||||
|
if (flag == 1) flag = 0;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
input_string_size--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flag) input_string_size++;
|
||||||
|
else
|
||||||
|
digits_string += input_string[i];
|
||||||
|
|
||||||
|
if (on_on_next == 1 && flag == 0)
|
||||||
|
{
|
||||||
|
digits_string = digits_string.substr(1, digits_string.size());
|
||||||
|
digits += abs(atoi(digits_string.c_str()));
|
||||||
|
digits_string = "";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return input_string_size + 1 + digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,8 @@ public:
|
||||||
|
|
||||||
/** Check for buffer overruns */
|
/** Check for buffer overruns */
|
||||||
void bufferOverrun();
|
void bufferOverrun();
|
||||||
|
static int count(const std::string &input_string);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** Check for buffer overruns - locate struct variables and check them with the .._CheckScope function */
|
/** Check for buffer overruns - locate struct variables and check them with the .._CheckScope function */
|
||||||
|
@ -100,3 +102,5 @@ private:
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,7 @@ private:
|
||||||
TEST_CASE(alloc); // Buffer allocated with new
|
TEST_CASE(alloc); // Buffer allocated with new
|
||||||
|
|
||||||
TEST_CASE(memset1);
|
TEST_CASE(memset1);
|
||||||
|
TEST_CASE(counter_test);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -781,8 +782,22 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (possible error) The size argument is given as a char constant\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (possible error) The size argument is given as a char constant\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void counter_test()
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string str1 = "Hello";
|
||||||
|
std::string str2 = "Hello %2.2d %1d";
|
||||||
|
std::string str3 = "Test \" ";
|
||||||
|
|
||||||
|
ASSERT_EQUALS(6, CheckBufferOverrun::count(str1));
|
||||||
|
ASSERT_EQUALS(11, CheckBufferOverrun::count(str2));
|
||||||
|
ASSERT_EQUALS(8, CheckBufferOverrun::count(str3));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestBufferOverrun)
|
REGISTER_TEST(TestBufferOverrun)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue