Skip to content

Commit 1401e3f

Browse files
committed
Fix cppcheck-opensource#810 (false positive: Division with signed and unsigned operators)
http://sourceforge.net/apps/trac/cppcheck/ticket/810
1 parent cbe9fca commit 1401e3f

2 files changed

Lines changed: 15 additions & 11 deletions

File tree

src/checkother.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -308,27 +308,25 @@ void CheckOther::checkUnsignedDivision()
308308
return;
309309

310310
// Check for "ivar / uvar" and "uvar / ivar"
311-
std::map<std::string, char> varsign;
311+
std::map<unsigned int, char> varsign;
312312
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
313313
{
314314
if (Token::Match(tok, "[{};(,] %type% %var% [;=,)]"))
315315
{
316316
const char *type = tok->strAt(1);
317317
if (strcmp(type, "char") == 0 || strcmp(type, "short") == 0 || strcmp(type, "int") == 0)
318-
varsign[tok->strAt(2)] = 's';
318+
varsign[tok->tokAt(2)->varId()] = 's';
319319
}
320320

321321
else if (Token::Match(tok, "[{};(,] unsigned %type% %var% [;=,)]"))
322-
varsign[tok->strAt(3)] = 'u';
322+
varsign[tok->tokAt(3)->varId()] = 'u';
323323

324324
else if (!Token::Match(tok, "[).]") && Token::Match(tok->next(), "%var% / %var%"))
325325
{
326326
if (ErrorLogger::udivWarning(*_settings))
327327
{
328-
const char *varname1 = tok->strAt(1);
329-
const char *varname2 = tok->strAt(3);
330-
char sign1 = varsign[varname1];
331-
char sign2 = varsign[varname2];
328+
char sign1 = varsign[tok->tokAt(1)->varId()];
329+
char sign2 = varsign[tok->tokAt(3)->varId()];
332330

333331
if (sign1 && sign2 && sign1 != sign2)
334332
{
@@ -342,8 +340,7 @@ void CheckOther::checkUnsignedDivision()
342340
{
343341
if (tok->strAt(3)[0] == '-' && ErrorLogger::udivError())
344342
{
345-
const char *varname1 = tok->strAt(1);
346-
char sign1 = varsign[varname1];
343+
char sign1 = varsign[tok->tokAt(1)->varId()];
347344
if (sign1 == 'u')
348345
{
349346
udivError(tok->next());
@@ -355,8 +352,7 @@ void CheckOther::checkUnsignedDivision()
355352
{
356353
if (tok->strAt(1)[0] == '-' && ErrorLogger::udivError())
357354
{
358-
const char *varname2 = tok->strAt(3);
359-
char sign2 = varsign[varname2];
355+
char sign2 = varsign[tok->tokAt(3)->varId()];
360356
if (sign2 == 'u')
361357
{
362358
udivError(tok->next());

test/testdivision.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,14 @@ class TestDivision : public TestFixture
179179
" }\n"
180180
"}\n", true, true);
181181
ASSERT_EQUALS("[test.cpp:6]: (possible style) Division with signed and unsigned operators\n", errout.str());
182+
183+
check("void a(int i) { }\n"
184+
"int foo( unsigned int sz )\n"
185+
"{\n"
186+
" register unsigned int i=1;\n"
187+
" return i/sz;\n"
188+
"}\n", true, true);
189+
ASSERT_EQUALS("", errout.str());
182190
}
183191
};
184192

0 commit comments

Comments
 (0)