我喜欢始终初始化局部变量,例如
int32_t result = 0;
我认为这是一种很好的编程风格,因为"结果"永远不会变得没有初始化,不管是否遵循if-constructs设置它。
但是现在我正在尝试使用静态代码检查器工具(IAR嵌入式工作台的C_STAT),并抱怨在下面的函数中,MISRA-C ++规则2008-01-06("不应包含非实例) -volatile变量被赋予永远不会被使用的值")和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;
}
原始问题:您如何看待它?
新问题:
答案 0 :(得分:2)
我同意MISRA。
变量的不必要的初始化可以允许草率的代码,因为它会破坏检查未初始化变量的工具。
在您的特定情况下,您可以将result
本地化为最终else
案例,并在其他情况下提前返回。但这并不是每个人都喜欢的。
答案 1 :(得分:1)
静态分析器应用您定义的规则 - 其中一些规则会发生冲突,因为您需要将它们设置为与本地编码标准相匹配。我想也有一条规则可能会或可能不会启用要求初始化所有变量;你不能两者兼顾。
选择符合您首选标准的非冲突规则集。你选择的是一个意见问题,所以不是一个真正有效的问题。
答案 2 :(得分:1)
大多数优秀的静态分析器将为您提供数据流分析-会警告您可能存在未初始化变量的路径。
以您的示例为例,假设您(偶然)错过了以后的一项任务,那么SA不会检测到这一点:
/// 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)
{
// commented out this line
// No data-flow anomoly detected
// result = 32767;
}
// Snip rest of code
return (int16_t) result;
}
《 MISRA指南》在任何方面都不是完美的,但是我们尽力防止出现明显的问题……而且只要您不试图弄乱问题,未初始化的变量就很容易检测到。
有点像强制转换,只是要关闭“静态分析”工具……
[请参阅个人资料以了解免责声明]