【发布时间】:2020-08-05 07:23:09
【问题描述】:
LHS 和 RHS 变量都是 uint8_t 变量,但问题被报告为“从 int 转换为 unsigned char”。我不明白这怎么会是个问题?
同样适用于 8 位数字
两个问题中列出的所有变量都是 uint8_t
问题 1)
CID 147563 (#2 of 2): Coding standard violation (CERT INT31-C)3. cert_violation: Casting (uint8_t)apX_compY_bitmask from int to unsigned char without checking its value may result in lost or misinterpreted data.
/* AP_X_Flash_Component_Y_Authenticated */
static uint8_t AP_component_require_auth;
//Local variable:
uint8_t apX_compY_bitmask = 0u, port;
// other operations
AP_component_require_auth |= (uint8_t)apX_compY_bitmask;
问题 2)
CID 148170 (#1 of 1): Coding standard violation (CERT INT31-C)5. cert_violation: Casting major_revision >> 3 from int to unsigned char without checking its value may result in lost or misinterpreted data.
函数参数:
void sb_rollb_prot_AP_FW_in_use_update(uint8_t img_idx, uint8_t port, uint8_t major_revision, bool primary_image)
//Local Variable
uint8_t x_loc, y_loc;
y_loc = major_revision >> 3;
【问题讨论】:
-
您阅读过 CERT 规则吗?您不能让静态分析器检查是否违反了您不知道的编码标准,这很危险。 Read the Friendly CERT-C Manual 可在线免费获得。是的,签名
int和uint8_t之间的疯狂隐式转换是危险的,最终会成为细微错误的来源。 -
我什至尝试将 u 添加为 3 (3u) 问题仍然存在..
-
@Lundin 另外,我没有得到一分,你的意思是说我不能使用 Coverity 来检查 Cert C 规则...???
-
我是说:上面提到的规则到底是什么你不明白?或者如果你想让别人告诉你你的代码有什么问题,你需要发布代码,包括变量声明。
-
我想他们担心你的两个例子中出现的implicit type promotions。
AP_component_require_auth |= (uint8_t)apX_compY_bitmask;=AP_component_require_auth = AP_component_require_auth | (uint8_t)apX_compY_bitmask;其中|的两个操作数都被隐式提升为int。而在major_revision >> 3;中,操作数major_revision被隐式提升为int。
标签: embedded coding-style static-analysis coverity xc32