memcpy函数_[PART][BUG][MSVCRT][C][CCF NOI1097] 关于memcpy的坑

[Incompleted]

CCF NOI1097 试题,本人的源码:

Ubuntu Pastebin​paste.ubuntu.com

Ubuntu Pastebin

Ubuntu Pastebin: SourceCodebyJulianDroid​paste.ubuntu.com

满分代码:

https://blog.csdn.net/tigerisland45/article/details/71038551​blog.csdn.net

在NOI官方OJ上,本人代码只得了50分(未优化,但是最后是WA)

而满分代码其实和本人的逻辑差不(hen)多。。。

本人枚举了1<n<300作为输入并将输出作为比较,发现从n=229开始出现分歧,本人的输出比标准输出少了第一位..

本人的输出:

ebedeea2180690f9cf74b28bd557cc87.png

标准输出:

0f648be8c722a43c3e24119e21fe96b3.png

可以发现,第二行开头的2没了。。

通过各种debug后发现在最后一次循环(n=228)时,Line 50后fin[]和q[]的值不一样。

而q[]中的正好是正确答案。

也就是说,memcpy少/错复制了一个item。

但是在其它例子中并没有发现异常。

1afa626110ac13afe2eb2d6f1bd09914.png

此代码没有输出(已清空缓冲区)。

本人将最后两次memcpy之前的数据print出来(倒输出):

4dd7e658939d75ea13346cc2c7947df6.png

第一行为输入,第二~三行为pre[],第三~四行为fin[]。

看着似乎没有任何毛病。

n<229的数据都是正常的。

究其原因,memcpy是关键(废话)。

[寻找BUG]

Cygwin通过ldd查看gcc生成的exe所需要的库:

(include目录下是没有源码的)

f5768f44cf3e2d57f921db3c1be75dca.png

前三个一看就知道是底层相关,直接pass

最后memcpy函数就在msvcrt.dll中。

将mscvrt.dll dump出来后用IDA读取,找到memcpy函数:

b3ef342ec523ef4b334a5fecad512137.png

[未完待续]

【面试题】实现memcpy函数 - 恋恋美食的个人空间 - OSCHINA​my.oschina.net
3c7d4de57fdc0ed7d2fcad059b7c92a2.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值