Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将此代码更改为不存在算术溢出漏洞?_C_Overflow_Integer Arithmetic_Defensive Programming - Fatal编程技术网

C 如何将此代码更改为不存在算术溢出漏洞?

C 如何将此代码更改为不存在算术溢出漏洞?,c,overflow,integer-arithmetic,defensive-programming,C,Overflow,Integer Arithmetic,Defensive Programming,计算机系统:程序员的观点是: 1/*代码漏洞说明,类似于 2*Sun的XDR库。 3 */ 4个void*copy_元素(void*ele_src[],int ele_cnt,size_t ele_size){ 5 /* 6*为ele_cnt对象分配缓冲区,每个ele_大小字节 7*并从ele_src指定的位置复制 8 */ 9 void*result=malloc(ele_cnt*ele_size); 10如果(结果==NULL) 11/*malloc失败*/ 12返回空值; 13 void*

计算机系统:程序员的观点是:

1/*代码漏洞说明,类似于
2*Sun的XDR库。
3 */
4个void*copy_元素(void*ele_src[],int ele_cnt,size_t ele_size){
5 /*
6*为ele_cnt对象分配缓冲区,每个ele_大小字节
7*并从ele_src指定的位置复制
8 */
9 void*result=malloc(ele_cnt*ele_size);
10如果(结果==NULL)
11/*malloc失败*/
12返回空值;
13 void*next=结果;
14 int i;
15表示(i=0;i
函数copy_elements用于复制元素数据 结构,每个结构由ele_uuu大小字节组成,放入分配的缓冲区 通过第9行上的函数。所需的字节数计算为 ele_cnt*ele_尺寸

然而,想象一下,一个恶意的程序员用 标高为1048577(2^20+1),标高尺寸为4096(2^12) 用32位编译的程序然后是在线乘法 9将溢出,导致仅分配4096字节,而不是 保存这么多数据所需的4294971392字节。环路 从第15行开始,将尝试复制所有这些字节, 溢出已分配缓冲区的结尾,从而导致损坏 其他数据结构。这可能会导致程序崩溃或崩溃 否则行为不端

我想知道如何更改代码,使其不会因算术溢出而出现漏洞


谢谢。

从数学的角度来看,您想检查
(size\u t)-1
。但是,由于溢出,您不能在代码中这样做。您可以应用一些代数来避免溢出。您还需要首先检查两个值是否均为正值:

if ((ele_size == 0) || (ele_cnt <= 0) || ((size_t)-1 / ele_size < ele_cnt)) {
    return NULL;
}

if((ele_size==0)|(ele_cnt从数学角度来看,您希望检查
(size_t)-1
。但是由于溢出,您无法在代码中执行此操作。您可以应用一些代数来避免溢出。您还希望首先检查这两个值是否为正值:

if ((ele_size == 0) || (ele_cnt <= 0) || ((size_t)-1 / ele_size < ele_cnt)) {
    return NULL;
}

if((ele_size==0)|(ele_cnt@EugeneSh.有符号整数和无符号整数之间的乘法是无符号乘法吗?@EugeneSh.有符号整数和无符号整数之间的乘法是无符号乘法吗?谢谢。
ele_cnt*ele_size
在第9行,有符号整数和无符号整数之间的乘法是无符号乘法吗是否有必要在函数的参数列表中将
元素
int
隐式转换为
无符号int
?是否有必要将
元素
更改为
大小元素
_t
匹配乘法运算符和关系运算符的另一个操作数。这是问题吗?是否需要在函数的参数列表中将int ele\u cnt更改为size\t ele\u cnt?@Tim您可以更清楚地了解它的用法,但这不是必需的。我提供的检查应该解决传入的任何问题。谢谢。是
ele_cnt*ele_size
在第9行中,有符号整数和无符号整数之间的乘法,无符号乘法?乘法前是否有
ele_cnt
int
无符号int
的隐式转换?是否需要将
int-ele_cnt
更改为
size_cnt
在函数的参数列表中?@Tim Yes,有一个
ele\u cnt
到type
size\u t
的隐式转换,以匹配乘法和关系运算符的其他操作数。这是一个问题吗?是否有必要在函数的参数列表中将int ele\u cnt更改为size\u ele\u cnt?@Tim您可以更精确地使用c李尔王关于它的用法,但这不是必需的。我提供的检查应该解决传入的任何问题。