C++ sizeof() 函数可以用来防止整数溢出吗?

Can the C++ sizeof() function be used to prevent integer overflows?

我正在构建计划用于密码学的数学函数。

如果代码容易受到攻击,您的算法就毫无用处。 缓冲区很容易防止溢出;但是整数呢?

我不会分享我的 Galois 函数,但这是我的常规加法函数之一:

/**/
private:
    bool ERROR;
    signed int ret;

    void error(std::string msg){
            ERROR = true;
            std::cout<<"\n[-] "<<msg<<std::endl;
    }
/**/
public:
signed int add(signed int a, signed int b){
                if(sizeof(a) > sizeof(signed int) || sizeof(b) > sizeof(signed int) || sizeof(a+b) > sizeof(signed int)){
                        error("Integer overflow!");
                        ERROR = true;
                        ret = 0;
                        return ret;
                }else{
                        ERROR = false;
                        ret = a + b;
                        return ret;
                }
                error("context failure");
                ret = 0;
                ERROR = true;
                return ret;
        }

if 条件是否足以防止恶意输入?如果没有,我将如何修复此漏洞?

根据其他答案,不,sizeof 不会防止您尝试执行的操作。它关心类型的字节宽度,而不是其他任何东西。

你问的是整数溢出,但你的例子有双倍。双打是浮点数,AFAIK 有明确的 "overflow" 原因。如果值超过最大值,您将得到 +INF,正无穷大。但是在那之前你会失去很多精度。浮点值不会回绕。

AFAIK,在当前相关的 C/C++ 标准中,没有办法可移植地检测无符号整数 "overflow"(定义明确),但是 gcc 和 clang 有内置函数来检测一个.您可以尝试预测无符号溢出,但最佳和最可移植的方法仍在激烈争论中。

有符号整数溢出是未定义的行为,这意味着实现在遇到它时可以自由地做任何它想做的事情。

如果您执意要推出自己的密码学against best practices,您应该仔细检查其他实现所做的事情并确保您理解原因。

还值得注意的是,在安全方面,integer/float 溢出与缓冲区溢出不同。

所以我找到了答案。

我决定使用以下 if 逻辑来防止整数溢出:

if((a >= 2000000000 || a <= -2000000000) ||
  (b >= 2000000000 || b <= -2000000000) || 
  ((a+b) >= 2000000000 || (a+b) <= -2000000000)){

经过 运行 一些测试后,我能够确认整数循环回到负数。

由于我使用的是有限域,因此我预计程序的正常输入不会接近 200 万,同时还要确保处理溢出。

如果超出范围,退出。

~编辑:修复了逻辑错误