Ashim Kapoor: updated the counter (#694)
This commit is contained in:
parent
fcd269dbf7
commit
13e43b8710
|
@ -777,13 +777,14 @@ int CheckBufferOverrun::countSprintfLength(const std::string &input_string, cons
|
||||||
|
|
||||||
|
|
||||||
int flag = 1;
|
int flag = 1;
|
||||||
|
int second_flag = 0; // This is to check for %
|
||||||
int input_string_size = 0;
|
int input_string_size = 0;
|
||||||
int on_on_next = 0;
|
int on_on_next = 0;
|
||||||
std::string digits_string = "";
|
std::string digits_string = "";
|
||||||
int digits = 0;
|
int digits = 0;
|
||||||
int check_for_i_d_x_f = 0;
|
int check_for_i_d_x_f = 0;
|
||||||
|
|
||||||
for (std::string::size_type i = 0; i != input_string.size(); i++)
|
for (std::string::size_type i = 0; i != input_string.length(); i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (on_on_next == 1)
|
if (on_on_next == 1)
|
||||||
|
@ -793,7 +794,8 @@ int CheckBufferOverrun::countSprintfLength(const std::string &input_string, cons
|
||||||
}
|
}
|
||||||
switch (input_string[i])
|
switch (input_string[i])
|
||||||
{
|
{
|
||||||
|
case '\\':
|
||||||
|
if (input_string[i+1] == '0') break;
|
||||||
case 'f':
|
case 'f':
|
||||||
case 'x':
|
case 'x':
|
||||||
case 'X':
|
case 'X':
|
||||||
|
@ -813,10 +815,16 @@ int CheckBufferOverrun::countSprintfLength(const std::string &input_string, cons
|
||||||
break;
|
break;
|
||||||
case '%':
|
case '%':
|
||||||
if (flag == 1) flag = 0;
|
if (flag == 1) flag = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
flag = 1;
|
||||||
|
input_string_size++;
|
||||||
|
second_flag = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flag) input_string_size++;
|
if (flag && !second_flag) input_string_size++;
|
||||||
else
|
else
|
||||||
digits_string += input_string[i];
|
digits_string += input_string[i];
|
||||||
|
|
||||||
|
@ -825,13 +833,14 @@ int CheckBufferOverrun::countSprintfLength(const std::string &input_string, cons
|
||||||
//std::cout << digits_string;
|
//std::cout << digits_string;
|
||||||
|
|
||||||
digits_string = digits_string.substr(1, digits_string.size());
|
digits_string = digits_string.substr(1, digits_string.size());
|
||||||
if (check_for_i_d_x_f == 1) digits += std::max(std::abs(std::atoi(digits_string.c_str())), 1);
|
if (check_for_i_d_x_f == 1) digits += std::max(abs(atoi(digits_string.c_str())), 1);
|
||||||
else
|
else
|
||||||
digits += std::abs(std::atoi(digits_string.c_str()));
|
digits += abs(atoi(digits_string.c_str()));
|
||||||
|
|
||||||
digits_string = "";
|
digits_string = "";
|
||||||
check_for_i_d_x_f = 0;
|
check_for_i_d_x_f = 0;
|
||||||
}
|
}
|
||||||
|
second_flag = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -841,6 +850,12 @@ int CheckBufferOverrun::countSprintfLength(const std::string &input_string, cons
|
||||||
|
|
||||||
while (j < input_string.size())
|
while (j < input_string.size())
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (input_string[j] == '\\' && input_string[j+1] == '0')
|
||||||
|
{
|
||||||
|
input_string_size++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (input_string[j] == '\\')
|
if (input_string[j] == '\\')
|
||||||
{
|
{
|
||||||
input_string_size--;
|
input_string_size--;
|
||||||
|
@ -848,10 +863,12 @@ int CheckBufferOverrun::countSprintfLength(const std::string &input_string, cons
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return input_string_size + 1 + digits;
|
return input_string_size + 1 + digits;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1025,8 +1025,8 @@ private:
|
||||||
ASSERT_EQUALS(1, CheckBufferOverrun::countSprintfLength("%s", unknownParameter));
|
ASSERT_EQUALS(1, CheckBufferOverrun::countSprintfLength("%s", unknownParameter));
|
||||||
ASSERT_EQUALS(6, CheckBufferOverrun::countSprintfLength("%-5s", unknownParameter));
|
ASSERT_EQUALS(6, CheckBufferOverrun::countSprintfLength("%-5s", unknownParameter));
|
||||||
ASSERT_EQUALS(2, CheckBufferOverrun::countSprintfLength("\\\"", unknownParameter));
|
ASSERT_EQUALS(2, CheckBufferOverrun::countSprintfLength("\\\"", unknownParameter));
|
||||||
TODO_ASSERT_EQUALS(6, CheckBufferOverrun::countSprintfLength("Hello\\0Text", unknownParameter));
|
ASSERT_EQUALS(7, CheckBufferOverrun::countSprintfLength("Hello \0Text", unknownParameter));
|
||||||
TODO_ASSERT_EQUALS(2, CheckBufferOverrun::countSprintfLength("%%", unknownParameter));
|
ASSERT_EQUALS(2, CheckBufferOverrun::countSprintfLength("%%", unknownParameter));
|
||||||
|
|
||||||
std::list<const Token*> stringAsParameter;
|
std::list<const Token*> stringAsParameter;
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue