从不使用 C/C++ 默认值/分配给变量的值

C/C++ default value/value assigned to variable is never used

本文关键字:分配 变量 默认值 C++      更新时间:2023-10-16

我喜欢总是初始化局部变量,例如

int32_t result = 0;

我认为这是很好的编程风格,因为"结果"永远不会变得未初始化,无论是否遵循 if 构造设置它。

但是现在我正在尝试一个静态代码检查工具(C_STAT用于IAR嵌入式工作台(,这抱怨在下面的函数中,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;
}

原问:对此,你怎么看?

新问题:

  1. 是否有良好的编码标准要求始终立即初始化声明的局部变量?
  2. 代码检查器是否太迂腐(一些编译器不会在这个地方抱怨,但会抱怨变量将完全保持未使用状态(?我做了好几年,但我不记得我在哪里见过它。

更新:在此期间(2021 年 9 月(,我使用默认设置的 pclint。它还检查 misra C++规则 0-1-6(变量随后未使用(和其他规则,但不抱怨此示例。如果我更改代码并且不返回此变量,则警告会按预期出现。我认为 pclint 在这里没有给出警告是正确的。

我同意MISRA的观点。

不必要的变量初始化可能会允许草率的代码,因为它会破坏检查未初始化变量的工具。

在您的特定情况下,您可以将result本地化为最终else案例,并在其他情况下过早返回。但这也不是每个人的口味。

静态分析器应用您定义的规则 - 其中一些规则会冲突,因为您需要将它们设置为与本地编码标准匹配。 我想还有一个规则可能会启用,也可能不会启用,需要初始化所有变量;你不能两者兼而有之。

选择符合首选标准的非冲突规则集。你选择哪个是一个意见问题,所以不是一个有效的SO问题。

大多数好的静态分析器将为您提供数据流分析 - 它会警告您留下未初始化变量的可能路径。

以您的为例,假设您(不小心(错过了后面的作业之一,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 指南并不完美,但我们试图防止明显的......未初始化的变量很容易检测 - 只要您不试图捏造问题。

这有点像插入一个铸件,只是为了关闭静态分析工具......

[免责声明见个人资料]