【发布时间】:2009-11-19 11:01:35
【问题描述】:
我一直在尝试使用我最近编写的 C 程序 Splint 并试图理解和删除它给出的警告。一个我理解但不明白如何删除它来自以下代码sn-p:
static MyType_t *findById(const int id)
{
int i;
for (i = 0; i < MY_ARR_SIZE; i++) {
if (my_arr[i].id == NOT_SET) {
/* Items are sorted so that items with
NOT_SET as ID are at the end of the array */
break;
}
if (my_arr[i].id == id) {
return &(my_arr[i]);
}
}
return NULL;
}
Splint 对函数可以返回 NULL 感到不高兴,但在这种情况下,它是完全合理的。
我尝试使用 /@nullwhenfalse@/ 但它似乎只有在函数返回 true/false 并且还尝试将代码更改为使用 retVal 并尝试 /@ null@/ 和 /@relnull@/ 在声明前面,但这些没有做任何事情。
(顺便说一句,这张桌子只有 20 个大 atm,所以没有必要使用聪明的搜索算法。)
【问题讨论】:
-
我认为你应该 a) 不要将传递值参数声明为“const”,但也许这就是你的风格,并且 b) 包括 Splint 给你的实际诊断输出,“不开心”有点模糊。
-
嗯,我为什么不把它声明为 const 呢?我喜欢 const 的部分原因是它清楚地表明该值不会被函数更改。
-
好的,好的。我实际上意识到为什么在我按下提交按钮的那一刻你不喜欢使用 const 。好点,我只是自动将 const 添加到所有输入参数,而不考虑它是按值传递还是按引用传递。
-
@unwind
const int id参数可以帮助编译器在您不小心修改id时发出警告,这是您认为可取的(不过我不会使用它)。 -
@Makis 的重点是,如果您在不考虑它是按值传递还是按引用传递的情况下添加它,那么您就不会在同一级别添加它。我认为自己在 C 中进行了实验,每次使用类型限定符时我都会停下来思考。我不建议“自动”使用它们。
标签: c static-analysis syntax-checking splint