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 にキャストされています。