C++在函数返回结果的时候发生cannot access memory 错误,求解!

sandaojushi 2015-07-18 12:34:30
大家好,最近在修改一个系统的加密算法的时候,替换了加密算法,加密算法对数据进行加密都可以正常使用,加密的结果也可以显示出来,但是在加密完成返回的过程中发生了cannot access memeory错误,不知为何!?希望能得到解答,谢谢!
代码如下:
Item *
DET_abstract_integer::encrypt(const Item &ptext, uint64_t IV) const
{
const ulonglong value = RiboldMYSQL::val_uint(ptext);
getCInteger_().checkValue(value);

const ulonglong res = static_cast<ulonglong>(getBlowfish_().encrypt(value));
LOG(encl) << "DET_int enc " << value << "--->" << res;
return new (current_thd->mem_root) Item_int(res);
}


uint64_t encrypt(uint64_t pt) {
uint64_t ct;
block_encrypt(&pt,&ct);
//在这里返回之前和blowfish算法的加密都是相同的,返回的数值也是正常的。但是返回后立即就出现了错误。
return ct;
}

void block_encrypt(void *ptext,void *ctext) {
sm4_crypt_ecb(&ctx,SM_ENCRYPT,16,(uint8_t*)ptext,(uint8_t*)ctext);
}


在上面的代码中我把 const ulonglong res = static_cast<ulonglong>(getBlowfish_().encrypt(value));这行代码改成:
uint64_t res = getBlowfish_().encrypt(value);也不行,还是会出现内存访问错误,在线等,急急急!!!
...全文
563 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandaojushi 2015-07-20
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
您好! 现在存在一个非常奇怪的现象就是,下面这段代码
 uint64_t encrypt(uint64_t pt) {
       uint64_t ct;
       block_encrypt(&pt,&ct);
       return ct;
    }
如果改成这样:
 uint64_t encrypt(uint64_t pt) {
       uint64_t ct;
       block_encrypt(&pt,&ct);
       uint64_t tc=ct
       return tc;
    }
就可以正确返回了,这是为什么呢???
赵4老师 2015-07-20
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
LinkSe7en 2015-07-20
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
《赵老师经典回复模板集》 应该是自定义的异常抛出,具体看技术文档的定义
赵4老师 2015-07-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
cobra_chen 2015-07-18
  • 打赏
  • 举报
回复
sm4加密算法,这个最好看看官方文档。 这种算法调用流程只能自己去查。 - 没用过sm4加密

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧