ASSERT_EQUALS("[test.cpp:5:5]: (portability) 'char' type used as array index. [unknownSignCharArrayIndex]\n", errout_str());
check("int buf[256];\n"
"void foo()\n"
"{\n"
" char ch = 0;\n"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("int buf[256];\n"
"void foo()\n"
"{\n"
" signed char ch = 0;\n"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("int buf[256];\n"
"void foo()\n"
"{\n"
" char ch = 0x80;\n"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("[test.cpp:5:5]: (portability) 'char' type used as array index. [unknownSignCharArrayIndex]\n", errout_str());
check("int buf[256];\n"
"void foo(signed char ch)\n"
"{\n"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("int buf[256];\n"
"void foo(char ch)\n"
"{\n"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("void foo(char* buf)\n"
"{\n"
" char ch = 0x80;"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("[test.cpp:3:24]: (portability) 'char' type used as array index. [unknownSignCharArrayIndex]\n", errout_str());
check("void foo(char* buf)\n"
"{\n"
" char ch = 0;"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("void foo(char* buf)\n"
"{\n"
" buf['A'] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("void foo(char* buf, char ch)\n"
"{\n"
" buf[ch] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("int flags[256];\n"
"void foo(const char* str)\n"
"{\n"
" flags[*str] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("int flags[256];\n"
"void foo(const char* str)\n"
"{\n"
" flags[(unsigned char)*str] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("void foo(const char str[])\n"
"{\n"
" map[str] = 0;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
}
voidarray_index_2() {
// #3282 - False positive
check("void foo(char i);\n"
"void bar(int i) {\n"
" const char *s = \"abcde\";\n"
" foo(s[i]);\n"
"}\n");
ASSERT_EQUALS("", errout_str());
}
voidbitop() {
check("void foo(int *result) {\n"
" signed char ch = -1;\n"
" *result = a | ch;\n"
"}\n");
ASSERT_EQUALS("[test.cpp:3:17]: (warning) When using 'char' variables in bit operations, sign extension can generate unexpected results. [charBitOp]\n", errout_str());
check("void foo(int *result) {\n"
" unsigned char ch = -1;\n"
" *result = a | ch;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
check("void foo(char *result) {\n"
" signed char ch = -1;\n"
" *result = a | ch;\n"
"}\n");
ASSERT_EQUALS("", errout_str());
// 0x03 & ..
check("void foo(int *result) {\n"
" signed char ch = -1;\n"
" *result = 0x03 | ch;\n"
"}\n");
ASSERT_EQUALS("[test.cpp:3:20]: (warning) When using 'char' variables in bit operations, sign extension can generate unexpected results. [charBitOp]\n", errout_str());