c语言 未定义行为,C/C++未定义行为

2023-05-16

下面是一段代码,这段代码中有标准未定义的行为。代码如下:

#include

using namespace std;

int main()

{

int j = 0;

for (int i = 0; i < 10; i++)

{

j = (j++);

}

cout << j << endl;

return 0;

}

编译器版本:

86aa430cae74975d08614a662954072e.png

汇编代码:

.file"test.cpp"

.local_ZStL8__ioinit

.comm_ZStL8__ioinit,1,1

.text

.globlmain

.typemain, @function

main:

.LFB1021:

.cfi_startproc

pushq%rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq%rsp, %rbp

.cfi_def_cfa_register 6

subq$16, %rsp

movl$0, -8(%rbp)

movl$0, -4(%rbp)

.L3:

cmpl$9, -4(%rbp)

jg.L2

movl-8(%rbp), %eax

leal1(%rax), %edx

movl%edx, -8(%rbp)

movl%eax, -8(%rbp)

addl$1, -4(%rbp)

jmp.L3

.L2:

movl-8(%rbp), %eax

movl%eax, %esi

movl$_ZSt4cout, %edi

call_ZNSolsEi

movl$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi

movq%rax, %rdi

call_ZNSolsEPFRSoS_E

movl$0, %eax

leave

.cfi_def_cfa 7, 8

ret

.cfi_endproc

.LFE1021:

.sizemain, .-main

.type_Z41__static_initialization_and_destruction_0ii, @function

_Z41__static_initialization_and_destruction_0ii:

.LFB1027:

.cfi_startproc

pushq%rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq%rsp, %rbp

.cfi_def_cfa_register 6

subq$16, %rsp

movl%edi, -4(%rbp)

movl%esi, -8(%rbp)

cmpl$1, -4(%rbp)

jne.L7

cmpl$65535, -8(%rbp)

jne.L7

movl$_ZStL8__ioinit, %edi

call_ZNSt8ios_base4InitC1Ev

movl$__dso_handle, %edx

movl$_ZStL8__ioinit, %esi

movl$_ZNSt8ios_base4InitD1Ev, %edi

call__cxa_atexit

.L7:

nop

leave

.cfi_def_cfa 7, 8

ret

.cfi_endproc

.LFE1027:

.size_Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii

.type_GLOBAL__sub_I_main, @function

_GLOBAL__sub_I_main:

.LFB1028:

.cfi_startproc

pushq%rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq%rsp, %rbp

.cfi_def_cfa_register 6

movl$65535, %esi

movl$1, %edi

call_Z41__static_initialization_and_destruction_0ii

popq%rbp

.cfi_def_cfa 7, 8

ret

.cfi_endproc

.LFE1028:

.size_GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main

.section.init_array,"aw"

.align 8

.quad_GLOBAL__sub_I_main

.hidden__dso_handle

.ident"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609"

.section.note.GNU-stack,"",@progbits

下面是VS2019下面使用MSVC汇编以后的汇编代码:

#include

using namespace std;

int main()

{

003F18A1 mov ebp,esp

003F18A3 sub esp,0D8h

003F18A9 push ebx

003F18AA push esi

003F18AB push edi

003F18AC lea edi,[ebp-0D8h]

003F18B2 mov ecx,36h

003F18B7 mov eax,0CCCCCCCCh

003F18BC rep stos dword ptr es:[edi]

003F18BE mov ecx,offset _B1E6438A_源@cpp (03FC026h)

003F18C3 ?? ??

003F18C4 ?? ??

003F18C5 ?? ??

003F18C6 ?? ??

003F18C7 ?? ??

003F18C8 ?? ??

003F18C9 ?? ??

003F18CA ?? ??

003F18CB ?? ??

int j = 0;

003F18CC add byte ptr [eax],al

003F18CE ?? ??

003F18CF ?? ??

003F18D0 ?? ??

003F18D1 ?? ??

003F18D2 ?? ??

for (int i = 0; i < 10; i++)

003F18D3 add byte ptr [eax],al

003F18D5 add bl,ch

003F18D7 or dword ptr [ebx-3F7C13BBh],ecx

003F18DD add dword ptr [ecx+7D83EC45h],ecx

003F18E3 in al,dx

for (int i = 0; i < 10; i++)

003F18E4 or bh,byte ptr [ebp+11h]

{

j = (j++);

003F18E7 mov eax,dword ptr [j]

003F18EA mov dword ptr [j],eax

003F18ED mov ecx,dword ptr [j]

003F18F0 add ecx,1

003F18F3 mov dword ptr [j],ecx

}

003F18F6 jmp main+38h (03F18D8h)

cout << j << endl;

003F18F8 mov esi,esp

003F18FA push offset std::endl > (03F1253h)

003F18FF mov edi,esp

003F1901 mov eax,dword ptr [j]

003F1904 push eax

003F1905 mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (03FB0A8h)]

003F190B call dword ptr [__imp_std::basic_ostream >::operator<< (03FB09Ch)]

003F1911 cmp edi,esp

003F1913 call __RTC_CheckEsp (03F1230h)

003F1918 mov ecx,eax

003F191A call dword ptr [__imp_std::basic_ostream >::operator<< (03FB0A0h)]

003F1920 cmp esi,esp

003F1922 call __RTC_CheckEsp (03F1230h)

return 0;

003F1927 xor eax,eax

}

本文同步分享在 博客“zy010101”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言 未定义行为,C/C++未定义行为 的相关文章

  • 自定义ListView

    package com team3 baby widget import android annotation TargetApi import android content Context import android os Build
  • 实验三 栈的基本操作

    ZZU的学弟学妹们不要抄作业哦 一 实验目的 1 掌握栈的存储结构的表示和实现方法 2 掌握栈的入栈和出栈等基本操作算法实现 3 了解栈在解决实际问题中的简单应用 二 实验内容 1 建立顺序栈 并在顺序栈上实现入栈和出栈操作 2 建立链栈
  • android 任务进度,安排(进度条管理任务)

    安排用进度条的方式来为你进行进度条上面的管理 xff0c 你所做的每件事情都能够在这款软件上面展示出实时的进度 xff0c 从进度条的方式来提高你在工作和生活当中的效率 xff0c 让你能够知道你的某件事情在生活当中的完成程度 xff0c
  • c语言重定向printf函数,printf函数的重定向实现

    printf函数的重定向实现 2014 09 05 13 50 29 标签 xff1a 佛学 在嵌入式系统中 xff0c 串口常用来辅助调试输出一些调试信息 所以有必要实现串口的格式化输出功能 这可以由3种方法实现 就我目所知 1 使用系统
  • 虚拟机中那些可以作为root对象_当之无愧的黑科技神器,给你的手机安装一个虚拟机...

    我是一锅汤 精品软件推荐达人 让你普通的设备变得不普通 虚拟机的知识普及 在熬这锅汤的时候先给汤友们普及一下虚拟机的知识 xff0c 百度百科这样解释 xff1a 虚拟机指通过软件模拟的具有完整硬件系统功能的 运行在一个完全隔离环境中的完整
  • nextdate函数白盒测试问题 软件测试_nextdate白盒测试用例

    日期问题白盒测试用例的设计 日期问题白盒测试用例 题目 前一日函数PreDate是NextDate的逆函数 代码 请采用基路径方法对前一日函数进行测试用例设计 代码 NEXTDATE函数黑盒测试 IT 计算机 专业资料 黑盒测试用例分析 N
  • python中randrange函数_Python

    Python randrange 函数 描述 randrange 方法返回指定递增基数集合中的一个随机数 xff0c 基数默认值为1 语法 以下是 randrange 方法的语法 import random random randrange
  • word html 预览 打印出来,word打印预览显示全,但是打印出来不全

    打印Word文档的时候 xff0c 选择的是全部打印 xff0c 但是在打印的时候 xff0c 个别页面却出现了打印显示不全的情况 xff0c 这种问题应该如何解决呢 下面就跟着小编来看看吧 情况一 xff1a 打印机驱动可能有问题 xff
  • boa 上传文件到服务器,springMVC 上传文件到服务器

    public String uploading HttpServletRequest request 64 RequestParam 34 file1 34 MultipartFile file Model model throws Ill
  • css沿曲线进行动画,css3动画曲线运动

    Title box width 50px height 120px margin top 500px margin left 500px box2 width 50px height 120px background black box a
  • ios获取区域服务器信息,ios获取服务器数据

    ios获取服务器数据 内容精选 换一换 有以下几种方式 xff1a 应用服务器调用查询设备历史数据接口 xff0c 主动从物联网平台获取设备上报的数据 应用服务器调用订阅平台业务数据接口 xff0c 使物联网平台在设备上报数据时 xff0c
  • C++头文件的包含顺序研究

    作者 xff1a 朱金灿 来源 xff1a http blog csdn net clever101 一 xff0e Google C 43 43 编程风格指南 里的观点 公司在推行编码规范 xff0c 领导提议基本上使用 Google C
  • java捕获子线程异常_Java中主线程如何捕获子线程抛出的异常

    首先明确线程代码的边界 其实很简单 xff0c Runnable接口的run方法所界定的边界就可以看作是线程代码的边界 Runnable接口中run方法原型如下 xff1a br public void run br 而所有的具体线程都实现
  • 大疆4rtk_解密大疆精灵4rtk-后差分定位技术(PPK)

    RTK技术大家已经非常了解 xff0c 优势自不必说 xff0c 虽然作业距离远但总是有接收不到差分信号的时候 xff0c 或者有的时候在山区测量移动站作业距离近 xff0c 远了就没办法接收到差分信号 xff0c 这就是RTK的弊端 xf
  • vue跨域使用websocket_vue使用SockJS实现webSocket通信

    以前使用websocket都是使用 window webSocket 61 new WebSocket 39 ws 39 43 config webSocketUrl 43 39 webData websocket token 61 39
  • html进度条动画效果,CSS3创建时尚且具有动画效果的进度条

    我们看到各种各样的进度条 xff0c 这些进度条显示了流程的当前完成状态 xff0c 例如下载或文件传输 无论是在构建桌面应用程序还是在构建Web应用程序 xff0c 都可能需要使用此UI元素 在本文中 xff0c 将介绍如何使用CSS3创
  • 树莓派python gpio 模仿iic_GPIO实现I2C协议模拟(1)

    最近需要用GPIO模拟I2C协议 xff0c 如果是在Linux下面比较简单 xff0c 但在Windows下面 xff0c 是否有没Linux那么简单了 索性自己对I2C协议还有一些了解 xff0c 翻了SPEC并结合示波器量出的实际信号
  • Ubuntu/linux c开发(1) GB2312/UTF8相互转换

    由于工作原因最近开始搞linux开发 xff0c 写几个服务程序 编码格式的转换算是基础之一 网上也有现成的代码 xff0c 只是有一些小问题需要注意 xff0c 这里自己保存一下 xff1a 1 判断字符是否是utf8字符 判断字符串是否
  • stm32CubeMX的安装和点亮流水灯

    文章目录 一 JDK的下载 安装和配置1 JDK的下载2 JDK的安装3 JDK的配置4 测试 二 CubeMX的下载和安装1 CubeMX的下载2 CubeMX的安装 三 利用CubeMX新建工程点亮LED灯1 题目介绍2 CubeMX介

随机推荐