CXX.CAST.SIGNED_CHAR_TO_INTEGER
CXX.CAST.SIGNED_CHAR_TO_INTEGER チェッカーは、signed char が割り当てられているか、より大きな signed integer 型に変換されている場合にフラグを立てます。
脆弱性とリスク
負の値を含む予期しない結果になります。
軽減と防止
より大きな整数サイズに変換する前に、signed char を unsigned char に必ずキャストします。
脆弱コード例
コピー
void fun()
{
char *c_str="Welcome";
unsigned char u_ch='K';
int c;
char ch = 'A';
long var = ch;
c = *c_str++;
c = ch;
if (c == *c_str);
if (ch <= c);
}
この準拠していない例では、signed char が long integer 型に変換/割り当てられているため、Klocwork は 8、10、12、14、および 16 行目で CXX.CAST.SIGNED_CHAR_TO_INTEGER の欠陥を報告します。
修正コード例
コピー
void fun()
{
char *c_str="Welcome";
unsigned char u_ch='K';
int c;
char ch = 'A';
c = *c_str++;
c = (unsigned char)*c_str++;
c = u_ch;
}
この修正された例では、より大きな整数サイズに変換される前に、char は unsigned char にキャストされています。