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

maf*_*afu 1 .net c# security

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

int i;
while ((i = foo()) > 5) { ... }
Run Code Online (Sandbox Code Playgroud)

这通常很方便,也适用于C风格的语言.但是,它也可能导致很难发现错误,例如:

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

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

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

编辑修复:早些时候,错误的例子是错误地使用int赋值而不是bool赋值.

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

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

Mor*_*gil 5

首先,写作if (aBoolVar == true)是多余的.只写if (aBoolVar)(而不是if (aBoolVar == false)写)if (!aBoolVar).

在C#中使用Yoda条件会无缘无故地损害可读性.if (val = 0)在不会编译所有的(当然,除非val是类型的变量GunThatShootsBothForwardAndBackwardSimultaneously具有隐式转换,从运营商intbool......),所以这不是一个问题.