从不使用 C/C++ 默认值/分配给变量的值
C/C++ default value/value assigned to variable is never used
我喜欢总是初始化局部变量,例如
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;
}
原问:对此,你怎么看?
新问题:
- 是否有良好的编码标准要求始终立即初始化声明的局部变量?
- 代码检查器是否太迂腐(一些编译器不会在这个地方抱怨,但会抱怨变量将完全保持未使用状态(?我做了好几年,但我不记得我在哪里见过它。
更新:在此期间(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 指南并不完美,但我们试图防止明显的......未初始化的变量很容易检测 - 只要您不试图捏造问题。
这有点像插入一个铸件,只是为了关闭静态分析工具......
[免责声明见个人资料]
- 何时在函数中声明堆栈分配变量?
- 取消引用指针并立即为其分配变量,导致分段错误
- 在C++中动态分配变量类型
- 在函数 (c++) 中分配变量类型和大小数组
- 无法在命名空间范围内分配变量
- 自我分配变量的定义
- 在 CUDA C++中分配变量 - 无法分配设备变量
- 在 CPP 中动态分配变量的数据类型
- 为什么无法在类主体中分配变量?
- const 类方法是否阻止在类外部分配变量?
- 从文件中分配变量,并使用定界符分配
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 读取外部文件并在类似xml的输入中分配变量
- 有没有办法在不分配变量的情况下将字符串连接到数字
- 如果使用alloca在内联函数中的堆栈上分配变量,那么在内联函数返回后,其引用是否有效
- 堆分配变量的结构成员对齐
- 包含溢出缓冲区的堆栈分配变量,也称为缓冲区
- 在 GetTransfer 之后,我在帐户 1 收到未分配变量错误。我无法弄清楚我搞砸了什么逻辑错误
- 对动态分配的变量的引用与指向相同动态分配变量的指针
- 在C++中为用户输入分配变量