【发布时间】:2018-05-16 13:41:15
【问题描述】:
我喜欢总是初始化局部变量,例如
int32_t result = 0;
我认为这是一种很好的编程风格,因为“结果”永远不会未初始化,无论是否遵循 if-constructs 设置它。
但现在我正在尝试一个静态代码检查器工具(用于 IAR 嵌入式工作台的 C_STAT),这抱怨在下面的函数中,MISRA-C++ 规则 2008-01-06(“不应包含非易失性变量的实例被赋予以后从未使用过的值”)和 MISRA C:2012 规则 2.2c(“无死代码”)和 CWE 563(“未使用的变量”)被违反。
// gets signal1 - signal2 (checks range of value)
int16_t getSignalDifferenceFromFloat(float signal1, int16_t signal2)
{
int32_t result = 0; // <-- this assignment makes the violation
// ... but I feel better with it
if (signal1 > 65535.0)
{
// because result cannot be smaller than the max value of TSignal
result = 32767;
}
else if (signal1 < -65535.0) // <-- here an else was missing
{
// because result cannot be larger than the min value of TSignal
result = -32768;
}
else
{
result = (int32_t)signal1 - (int32_t)signal2;
if (result < -32768)
{
result = -32768;
}
else if (result > 32767)
{
result = 32767;
}
}
return (int16_t) result;
}
原始问题:您对此有何看法?
新问题:
- 是否存在要求始终立即初始化已声明的局部变量的良好编码标准?
- 代码检查器是否过于迂腐(一些编译器不会在这个地方抱怨,但会抱怨变量将完全未被使用)?我做了很多年,但我不记得我在哪里看到的。
更新:在此期间(2021 年 9 月),我将 pclint 与默认设置一起使用。它还检查 misra C++ 规则 0-1-6(随后未使用的变量)和其他规则,但不会抱怨此示例。如果我更改代码并且不返回此变量,则会按预期出现警告。我认为pclint在这里没有给出警告是正确的。
【问题讨论】:
-
你确定吗?你的第一个 if 毫无意义……第二个 if/else 总是会改变 result 的值。
-
第一次分析似乎不太相关。即使是最基本的优化编译器也可以消除不必要的初始化。
-
首先,请注意,C 和 C++ 是两种非常不同的语言,虽然部分看起来相似,但可能有细微的细节会在行为和语义。其次,将
int32_t用于要转换为int16_t的变量有什么用?最后,您确定您的if后跟if ... else吗?你不应该有if ... else if ... else吗? -
这些是您遇到的唯一静态分析问题吗?整数与双精度数或幻数的不必要比较怎么办?
-
你需要问一个不同于“你对此有何看法?”的问题,例如“我怎样才能编写代码使其符合本地标准和 MISRA 标准?”。在 SO 上征求意见是 OT。
标签: c++ c initialization default misra