如何防止使用赋值表达式的返回值可能带来的安全隐患?

时间:2014-02-27 18:09:55

标签: c# .net security

在C#中,赋值表达式将LHS操作数的值作为值返回:

int i;
while ((i = foo()) > 5) { ... }

这在C风格的语言中通常很方便,也很惯用。但是,它也可能导致难以发现错误,例如:

if ((options == (__WCLONE|__WALL)) && (current.hasUid = true)) retval = -EINVAL;
// Also consider the case of a nullable bool

特别是在安全关键代码中,我想在编译使用此语言功能的代码时至少生成警告。

我应该怎么做?我是否必须为代码检查工具创建自定义规则?

编辑修复:之前,错误的示例错误地使用了int赋值而不是bool赋值。

更新:我同意x = true是多余的,并会引发上述错误。编写良好的代码不应表现出允许出现这种错误所必需的条件。

特别是我想通过检查(以自动方式)所涉及的问题来确保不会发生这些情况。这增加了在问题进入之前捕获问题的机会。

2 个答案:

答案 0 :(得分:5)

首先,编写if (aBoolVar == true)是多余的。只写if (aBoolVar)(而不是if (aBoolVar == false),请写if (!aBoolVar)。)

在C#中使用Yoda conditions会无缘无故地损害可读性。 if (val = 0)根本不会编译(好吧,除非valGunThatShootsBothForwardAndBackwardSimultaneously类型的变量,它具有从intbool的隐式转换运算符。 。),所以这不是问题。

答案 1 :(得分:3)

正如Mormegil指出的那样,至少C#的惯用方法是仅仅评估属性而不是将其与true进行比较(例如current.hasUid) - 尽管对于bool?比较你可能想做的事情nullableBool == true代替nullableBool ?? false

如果这仍然不够,您可以通过在项目属性的“构建”部分中启用“将警告视为错误”并输入以下错误代码来强制C#编译器使情况出错: {3}}: 0665