gpt4 book ai didi

ada - 处理表达式时如何检查 Ada 中的潜在溢出?

转载 作者:行者123 更新时间:2023-12-04 18:01:02 25 4
gpt4 key购买 nike

我对 Ada 比较陌生,一直在使用 Ada 2005。但是,我觉得这个问题与所有语言都相关。

我目前正在使用 Codepeer 等静态分析工具来解决我的代码中的潜在漏洞。

我正在讨论的一个问题是如何在分配可能导致变量溢出的表达式之前处理检查。

这可以用一个例子更好地解释。假设我有一个无符号 32 位整数类型的变量。我正在为此变量 CheckMeForOverflow 分配一个表达式:

CheckMeForOverflow := (Val1 + Val2) * Val3;

我的困境是如何在这种情况下有效地检查溢出 - 这似乎经常出现在代码中。是的,我可以这样做:
if ((Val1 + Val2) * Val3) < Unsigned_Int'Size then
CheckMeForOverflow := (Val1 + Val2) * Val3;
end if;

我的问题是,如果没有潜在的溢出,检查表达式然后立即分配相同的表达式似乎效率低下。

但是,当我在网上查看时,这似乎很常见。谁能解释更好的选择或解释为什么这是一个不错的选择?我不希望这分散在我的代码中。

我也意识到我可以创建另一个更大类型的变量来保存表达式,对新变量进行评估,然后将该变量的值分配给 CheckMeForOverflow,但话又说回来,这意味着创建一个新变量并将其用于执行一次检查,然后再也不使用它。这似乎很浪费。

有人可以提供一些见解吗?

非常感谢!

最佳答案

我个人会做这样的事情

begin
CheckMeForOverflow := (Val1 + Val2) * Val3;
exception
when constraint_error =>
null; -- or log that it overflowed
end;

但是请注意您的变量不能有可用的值。

它比 if 结构更清晰,而且我们不会执行两次计算。

关于ada - 处理表达式时如何检查 Ada 中的潜在溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52152433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com