我的项目中有一个C代码。在部分代码中,我直接使用了从int8_t到int32_t的转换,并进行了多空间分析。
在多空间分析中,它说这很容易出错,我需要先转换为char而不是int32_t,我不太明白为什么需要这样做。
此外,我在下面的链接中也看到了类似的表达:
在分配或转换为更大的有符号类型之前,必须将符号字符数据转换为无符号字符。此规则适用于实现中的有符号字符和(纯)字符,其中char定义为具有与签名char相同的范围、表示形式和行为。源网站
我已经在我的个人电脑上用开发-C进行了同样的转换。
我的代码是:
#include <stdio.h>
#include <stdint.h>
void main(void)
{
int8_t b = -3;
int32_t b_32 = (int32_t) b;
printf("%d \n",b);
printf("%d \n",b_32);
}产出似乎不存在任何问题:
-3
-3
进程在0.0807秒后退出,返回值为4,按任意键继续。。。
所以,我觉得这没问题。为什么需要转换成焦炭?
谢谢。
发布于 2021-03-03 13:08:18
当他们说“字符数据”时,他们指的是文本。文本字符不能是负的,所以他们给出了确保代码在0-255范围内的提示,例如ISO 8859格式的代码。
因为您处理的是实际的签名号码,所以不要理会这个建议,直接从int8_t转换到int32_t。
发布于 2021-03-03 13:52:18
如果您阅读了链接到的所引用的CERT规则,实际需要考虑的是在算术中或在存储原始值时使用char类型。他们也关注隐性类型的推广。有关这些问题的更多信息,请参见这些帖子:
在表达式int32_t b_32 = (int32_t) b;中,没有任何与char或隐式整数提升的签名性相关的问题。值得注意的是,b不是char类型的。没有必要转换为无签名-代码是好的。演员也不需要。你的工具是假阳性。
https://stackoverflow.com/questions/66457671
复制相似问题