ICS:缓冲区溢出、变长栈帧

ICS要期中考了…
ICS要期中考了…
ICS要期中考了…
还是先复盘一下昨天晚上崩溃的作业吧🙂


3.71

在这里插入图片描述
本来以为只要读入指定的长度就好了,然而发现是需要全部读入的
那么既然不可能有无限大的缓冲区,就只能分次读入啦

void good_echo(){
char buf[16]; 
while(fgets(buf,16,stdin)!=NULL) {
char *p=buf; while(*p)
putchar(*p++); if(strlen(buf)<15) break;
} return; }

emmm要记住fgets无输入或出错时的返回值是NULL
一开始用了puts(buf)输出,然而它一次读完会换行,这是强迫症不能允许的
如果不加if(strlen(buf)<15) break;程序就会进入死循环(难道不能返回NULL??我也不是很懂……)
重要在思路:对超出缓冲区长度的处理方式


3.72在这里插入图片描述

这题真是有趣的不知道说什么,建议先看下3.10.5的习题3.49,几乎是一样的
是酱紫的,先把%rbp压入,把那时候的%rsp储存起来(便于返回),然后求8n+30向下舍入的最接近的16的倍数(为了对齐),然后开放这么大的栈帧,再求开放后%rsp+15的向下舍入的最接近的16的倍数(为了对齐)
在这里插入图片描述
大概就是上面这样~
先看一下第一次舍入的结果,当n=2k,x=8k+16
当n=2k+1,x=8k+24

好了我们要求e1的最值
由于p的长度对每个n是固定的,所以要e1最小,必须e2最大,先看看e2=15有没有可能
e2=15,相当于s2+15 %16==0,当n=2k,有s1-8n-16+15 %16==0,s1-8n %16==1,这个1就是e1,代入n,此时s1%16==1
当n=2k+1,e1=9

再求e1最大值,同样先看e2=0有没有可能
e2=0,相当于s2%16==0,当n=2k+1,有s1-8k-24%16==0,这个24就是e2最大值,代入此时s1%16==0
当n=2k,e1=16


昨天才通知要考期中了……
要加油复习呀!!!!冲冲冲!!😗😗😗😗

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值