绕过警告:"Control variable is not modified inside the loop"
Bypass the warning: "Control variable is not modified inside the loop"
我有一个创建时间延迟的非常简单的函数:
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
while (get_time() < t)
{
};
}
delay(750);
我收到警告说控制变量 t 在 while 循环内没有被修改。我不需要修改变量,我只需要在 while 循环内,只要满足条件即可。如何以 "nice" 方式绕过它?
该警告是由 MISRA 静态分析工具创建的。完整消息:
"The control variable in this loop construct is never modified"
MISRA C:2012 Rules applicable to message 2467:
静态分析工具似乎期待像这样的常见情况:
int i = 0;
while(i < get_size(var))
{
do_something(var[i]);
i++;
}
但是,在您的情况下,循环控制变量是 getTime()
的结果,而 t
是一个限制。
你可以使用真正的循环控制变量。编译器可能会优化它。
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
int current_time;
do
{
current_time = getTime();
} while(current_time < t);
}
或者您可以尝试发现是什么让您的静态分析工具认为 t
是循环控制变量。 const int t
声明可能会有所帮助。
每个编译器或代码审查工具或内存泄漏分析器工具都有自己的逻辑,并根据其逻辑向您发出警告或错误消息。在这种情况下,您 compiler/tool 将 t
视为控制变量,while loop
应以此为基础中断。由于 compiler/tool 在 while 循环块中没有找到任何代码来操作变量 t
,因此它向您发出了警告,因为它认为您的 while loop
可能是无限的 while loop
。您可以忽略它,因为您确定它永远不会是一个无限循环,或者您可以以不同的方式修改您的代码(见下文,但可能不会修复此警告)以避免此警告。
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
while ( t > get_time() );
}
delay(750);
在上面的更改中,我将 t
移到了左侧,这样您的工具就不会将 t
视为控制变量,并且不会发出任何警告。
虽然您可能对 getTime()
有一些了解,但静态分析器基本上假设 getTime()
的 return 值可能永远不会触发循环结束条件,因此循环可能会是无限的。
因此,您需要的是分析器接受的无限循环,以及循环体内的中断条件。据我快速搜索得知,只有 for(;;)
被 MISRA 接受为无限循环。
for ( ; ; )
{
if (t <= get_time()) break;
}
这不应触发警告。
我有一个创建时间延迟的非常简单的函数:
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
while (get_time() < t)
{
};
}
delay(750);
我收到警告说控制变量 t 在 while 循环内没有被修改。我不需要修改变量,我只需要在 while 循环内,只要满足条件即可。如何以 "nice" 方式绕过它?
该警告是由 MISRA 静态分析工具创建的。完整消息:
"The control variable in this loop construct is never modified"
MISRA C:2012 Rules applicable to message 2467:
静态分析工具似乎期待像这样的常见情况:
int i = 0;
while(i < get_size(var))
{
do_something(var[i]);
i++;
}
但是,在您的情况下,循环控制变量是 getTime()
的结果,而 t
是一个限制。
你可以使用真正的循环控制变量。编译器可能会优化它。
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
int current_time;
do
{
current_time = getTime();
} while(current_time < t);
}
或者您可以尝试发现是什么让您的静态分析工具认为 t
是循环控制变量。 const int t
声明可能会有所帮助。
每个编译器或代码审查工具或内存泄漏分析器工具都有自己的逻辑,并根据其逻辑向您发出警告或错误消息。在这种情况下,您 compiler/tool 将 t
视为控制变量,while loop
应以此为基础中断。由于 compiler/tool 在 while 循环块中没有找到任何代码来操作变量 t
,因此它向您发出了警告,因为它认为您的 while loop
可能是无限的 while loop
。您可以忽略它,因为您确定它永远不会是一个无限循环,或者您可以以不同的方式修改您的代码(见下文,但可能不会修复此警告)以避免此警告。
void delay(int time_in_ms)
{
int t = get_time() + time_in_ms;
while ( t > get_time() );
}
delay(750);
在上面的更改中,我将 t
移到了左侧,这样您的工具就不会将 t
视为控制变量,并且不会发出任何警告。
虽然您可能对 getTime()
有一些了解,但静态分析器基本上假设 getTime()
的 return 值可能永远不会触发循环结束条件,因此循环可能会是无限的。
因此,您需要的是分析器接受的无限循环,以及循环体内的中断条件。据我快速搜索得知,只有 for(;;)
被 MISRA 接受为无限循环。
for ( ; ; )
{
if (t <= get_time()) break;
}
这不应触发警告。