CodeQL 文档

从位域隐式向下转换

ID: cpp/implicit-bitfield-downcast
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - reliability
   - correctness
   - types
Query suites:
   - cpp-security-and-quality.qls

单击查看 CodeQL 存储库中的查询

当位域隐式转换为存储较少位的整数类型时,可能会意外截断。当位域用于计算数据结构的元素数量时,这会导致不准确的迭代或分配,或者会导致存储在位域上部的信息丢失。

建议

使用更宽的整数类型来使用位域,或者如果截断是故意的,请使用显式强制转换。

示例

在以下示例中,位域通过截断它的方法和通过直接字段访问两种方式访问。这会导致 for 循环中的缓冲区溢出。

typedef struct {
	unsigned int x : 24;
} my_struct;

unsigned short getX(my_struct s ) {
	return s.x; //BAD: implicit truncation
}

unsigned int getXGood(my_struct s) {
	return s.x //GOOD: no truncation
}

int main (int argc, char **argv) {
	my_struct s;
	s.x = USHORT_MAX + 1;
	int* array = calloc(sizeof(int), getX(s)); //BAD: buffer allocated is smaller than intended
	for (int i = 0; i < s.x; i++) {
		array[i] = i;
	}

	int* array2 = calloc(sizeof(int), getXGood(s)); //GOOD
	for (int i = 0; i < s.x; i++) {
		array[i] = i;
	}
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私