[英]C/C++ default value/value assigned to variable is never used
我喜歡總是初始化局部變量,例如
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;
}
原始問題:您如何看待?
新問題:
我同意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指南在任何方面都不是完美的,但是我們會盡力防止出現明顯的......並且未初始化的變量很容易檢測到-只要您不嘗試解決問題。
有點像強制轉換,只是要關閉“靜態分析”工具……
[查看免責聲明]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.