标签: range-checking

通过转换为uint而不是检查负值来执行范围检查是否更有效?

我在.NET的List源代码中偶然发现了这段代码:

// Following trick can reduce the range check by one
if ((uint) index >= (uint)_size) {
  ThrowHelper.ThrowArgumentOutOfRangeException();
}
Run Code Online (Sandbox Code Playgroud)

显然这比(?)更有效 if (index < 0 || index >= _size)

我很好奇这个技巧背后的理由.单个分支指令真的比两个转换要贵uint吗?或者是否还有一些其他优化会使这个代码比另外的数字比较更快?

为了解决房间里的大象:是的,这是微优化,不,我不打算在我的代码中到处使用它 - 我只是好奇;)

c# performance micro-optimization numeric-conversion range-checking

77
推荐指数
5
解决办法
4439
查看次数

为什么Python允许序列的超出范围切片索引?

所以我只是遇到了一些奇怪的Python特性,并想要对它进行一些澄清.

以下数组操作有点有意义:

p = [1,2,3]
p[3:] = [4] 
p = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

我想它实际上只是将这个值附加到最后,对吗?
但是,我为什么要这样做呢?

p[20:22] = [5,6]
p = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

更是如此:

p[20:100] = [7,8]
p = [1,2,3,4,5,6,7,8]
Run Code Online (Sandbox Code Playgroud)

这似乎是错误的逻辑.这似乎应该抛出错误!

任何解释?
- 这只是Python的奇怪之处吗?
- 有目的吗?
- 我是否以错误的方式思考这个问题?

python sequence slice python-3.x range-checking

72
推荐指数
2
解决办法
2874
查看次数

为什么不"i:= i + 1"给出整数和更大类型的范围检查错误?

考虑:

{$R+}
i:= 1;
While i > 0 do
  i:= i + 1;
ShowMessage(IntToStr(i));
Run Code Online (Sandbox Code Playgroud)

如果我声明i为Byte,Word,Shortint或TinyInt,我会得到范围检查错误,如预期的那样.如果我声明i为LongWord,Cardinal,Integer,LongInt或Int64,它只是通过while循环并显示负值或0值,i当你通过上限时得到.

Delphi 7不支持32位和64位数字的范围检查吗?

delphi range-checking

15
推荐指数
1
解决办法
1202
查看次数

仅关闭一小部分代码的Delphi范围检查

如何关闭文件的一部分范围检查.关闭很简单,但如何在以后恢复到项目设置?下面的伪代码应该解释它:

Unit1;

//here's range checking on or off as per the project setting

code here...

{$R-}

//range checking is off here because the code causes range check errors

code here...

//now I want to revert to the project setting. How do I do that?

code here...

end.
Run Code Online (Sandbox Code Playgroud)

delphi project-settings range-checking

13
推荐指数
2
解决办法
4163
查看次数

为什么在清楚地写入数组边界时没有运行时错误?

我有一个程序,它指定一个超出它界限的数组,我期待抛出运行时错误.然而,根本没有出现错误,程序继续写入未声明的内存.是否有一些编译器选项来防范这种情况?通过显示内存转储,很明显这种边界的超越是真实的.有没有办法声明变量或参数规范来捕获它?显然这是一个明显的案例,但是当负责维护数千行F77派生代码时,(对我来说)是否可能发生这种情况并不总是很清楚.

PROGRAM TEST_CODE
IMPLICIT NONE

INTEGER*4 :: R(5)           ! Array of 5

    CALL R_TEST(R, 10)

END PROGRAM

SUBROUTINE R_TEST(R, J)
IMPLICIT NONE

INTEGER*4, INTENT(INOUT) :: R(1)    ! Dummy is array of 1
INTEGER*4, INTENT(IN) :: J
INTEGER*4 :: K

DO K=J-5,J+5            ! K=5..15
    R(K) = K            ! No Runtime Error
END DO

END SUBROUTINE
Run Code Online (Sandbox Code Playgroud)

编译器是英特尔Fortran 2011 XE,是的我使用字节规范,INTEGER*4因为我知道我得到它.

以下是运行时检查的编译器选项. 编译器选项

记忆<code> R </ code>变量

fortran runtime-error range-checking

6
推荐指数
1
解决办法
3281
查看次数

是否可以使用异常来检查数组边界?

我想检查给定的坐标是否与数组有关.

public boolean checkBounds(int x, int y) {
    try {
        Object val = array[x][y];
        return true;
    } catch (ArrayIndexOutOfBoundsException e) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我能这样做吗?这是一种有效的方法吗?

java exception indexoutofboundsexception range-checking

5
推荐指数
1
解决办法
999
查看次数

在 Alexandria 64 位中调用 OpenSCManager 进行范围检查

我们最近从 Delphi Berlin 更新到 Alexandria 11.2,并遇到了问题。我们的应用程序之一针对 64 位平台。当它连接查询 Windows 服务时,它会抛出范围检查错误。当以 32 位为目标时,它不会执行此操作;柏林/64 位也没有发生这种情况。我比较了两种环境之间的 64 位编译选项,没有发现任何差异。

function TForm1.ConnectToServices(const AServiceName: String; const AMachineName: String): Integer;
begin
  Result := -1;
  try
    if AMachineName = EmptyStr then
      // Error happens here
      Result := OpenSCManager(nil, nil, SC_MANAGER_CONNECT)
    else
      // and here.
      Result := OpenSCManager(PChar(AMachineName), nil, SC_MANAGER_CONNECT);
  except
    // Get last error return 0, but ignoring the above error causes problems downstream
    ShowMessage(SysErrorMessage(GetLastError));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我真的不知道是什么原因造成的以及如何解决它。

设置 64 位编译器选项以匹配 Berlin 的编译器选项,其中 dll 调用成功且没有问题。

delphi 64-bit winapi range-checking delphi-11-alexandria

3
推荐指数
1
解决办法
126
查看次数