C 缓冲区溢出的分段错误

C 缓冲区溢出的分段错误,c,return,buffer,warnings,C,Return,Buffer,Warnings,我无法运行此c代码。当我这样做时,我得到了分段错误和一个带有“return”return 0xdeadbeef的错误 有人有什么建议吗 #include <stdio.h> #include <string.h> #include <stdlib.h> int lame(unsigned int size, unsigned int value){ unsigned int array1[4]; unsigned int array2[6]; array2

我无法运行此c代码。当我这样做时,我得到了分段错误和一个带有“return”return 0xdeadbeef的错误

有人有什么建议吗

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int lame(unsigned int size, unsigned int value){

unsigned int array1[4];
unsigned int array2[6];
array2[5] = value;
memcpy(&array1, &array2, size * sizeof(unsigned int));

return 1;
}

void awesome(){
printf("awwwwwww yeaaahhhhh! All awesome, all the time!\n");
}

main(unsigned int argc, char ** argv){
unsigned int size, value;
size = strtoul(argv[1], 0, 10);
value = strtoul(argv[2], 0, 16);

if(!lame(size, value)){
    awesome();
}
else{
    printf("I am soooo lame :(\n");
}

return 0xdeadbeef;
}
#包括
#包括
#包括
int lame(无符号整数大小,无符号整数值){
无符号整数数组1[4];
无符号整数数组2[6];
array2[5]=值;
memcpy(&array1和&array2,size*sizeof(unsigned int));
返回1;
}
void awesome(){
printf(“啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊;
}
main(无符号整数argc,字符**argv){
无符号整数大小,值;
尺寸=strtoul(argv[1],0,10);
值=strtoul(argv[2],0,16);
如果(!lame(尺寸、值)){
真棒();
}
否则{
printf(“我是非常跛脚的:(\n”);
}
退回牛肉;
}
我说过“你的代码几乎每一行都有至少一个bug”,现在我将列出它们。如果我对一行没有任何评论,那行就没有bug,但你还需要阅读正确的代码格式和样式

int lame(unsigned int size, unsigned int value){
unsigned int array1[4];
unsigned int array2[6];
array2[5] = value;
memcpy(&array1, &array2, size * sizeof(unsigned int));
return 1;
}
如果
size
大于4,则
memcpy
行上的未定义行为。由于
size
来自用户输入,因此此程序包含缓冲区溢出漏洞,尽管该漏洞可能很难被利用。(您需要阅读“.”)

此函数没有外部可见的副作用。编译器可能会删除其所有代码,除了
返回1

始终返回相同常量值的函数应重构为返回
void
。未在当前文件外使用的函数应声明为
static

void awesome(){
printf("awwwwwww yeaaahhhhh! All awesome, all the time!\n");
}
main(unsigned int argc, char ** argv){
使用
printf
可替换为
put
。未在当前文件之外使用的函数应声明为
静态

void awesome(){
printf("awwwwwww yeaaahhhhh! All awesome, all the time!\n");
}
main(unsigned int argc, char ** argv){
main
的第一个参数必须具有类型
int
,而不是
unsigned int
。返回类型(必须是
int
,而不是
void
)缺失;许多编译器都会容忍这种情况(将其视为隐式返回
int
)与C89之前的代码向后兼容,但这仍然是错误的

unsigned int size, value;
size = strtoul(argv[1], 0, 10);
value = strtoul(argv[2], 0, 16);
size
value
都应该是
unsigned long
,以便与
strtoul
返回的内容保持一致

如果命令行参数少于两个,则为未定义的行为

需要检查对strtoul的两个调用是否都失败。这很重要;请阅读以了解如何正确执行

但是,使用
strtoul
而不是
atoi
(无法检查故障)或
sscanf
(在整数溢出时具有未定义的行为)的道具

编译器可以并将确定
lame
始终返回1,并优化对
awesome
的调用。(事实上,它有权优化除上述
printf
之外的所有内容,因为所有控制流路径要么触发未定义的行为,要么达到此
printf
,并且没有其他外部可见的效果。我手头的编译器不是很聪明,但它们确实删除了if-then和else内部的所有代码
lame

使用
printf
也可以用
put
代替

当你不再称自己跛脚的时候,你会自动地少跛脚23%

return 0xdeadbeef;
main
返回的值是有意义的。0表示整个程序成功,任何其他值表示某种失败。除非您打算指示失败,否则始终返回0。此外,父进程跨平台只能可靠地接收范围为[0,127]的值;
0xdeadbeef
为右键


在您的屏幕截图中,
main
返回了
void
,而不是缺少返回类型;这加上带有值的
return
语句应该会导致程序无法编译。不过,您的编译器可能会在
main
中容忍它。

不要发布指向代码的链接。尤其不要发布指向代码。在您的帖子中发布代表性代码首先,不要发布代码链接,链接可能会过时并使您的问题变得毫无价值。其次,更重要的是,不要发布文本图像!这使我们完全不可能复制并粘贴它来自己尝试。相反,您应该复制并粘贴文本并将其放入以文本形式进入问题正文。几乎每一行代码都至少有一个bug。你需要的是一个介绍性编程课程,而不是问答网站。此外,如果你遇到崩溃,那么你应该在调试器中运行以查找代码中的崩溃。此外,如果你有缓冲区溢出,那么你有未定义的行为,这是不好的,可能会导致错误使用任何类型的东西发生。我现在已经复制了代码。非常抱歉,谢谢,但我仍然很困惑!你能给我一个这个工作的返回1部分的例子吗?对不起,我不明白你想要一个例子。例如在如何修复memcpy行(lame函数)我无法告诉您
memcpy
行应该做什么,因为整个程序没有做任何有意义的事情,甚至没有任何有意义的事情。但是,每次调用
memcpy
时,必须确保其第三个参数不能大于其第一个参数的分配大小。在这种情况下,w你可以翻译为:
size
不能超过4。我想做的只是做一个简单的缓冲区溢出挑战,用户将不得不尝试并超越缓冲区边界。我认为我在这方面做得对吗?这个挑战执行时应该打印出来。我太跛了:(信息。挑战是让程序打印出awwwwwwyeaaahhh!太棒了,一直如此!取而代之。