C++ Undefined Behavior 详细列表
Undefined Behavior,即未定义的行为,指程序不可预测的执行效果,一般由错误的代码实现引起。出于效率、兼容性等多方面原因,语言标准不便于定义错误程序的明确行为,而是将其统称为“未定义”的行为,可以是崩溃,也可以是非预期的任意表现,有些问题在编译器和执行环境的特殊处理下也可能不会造成实质性的危害,但不具备可移植性。
《安全规则集合》 是一个研究代码质量和安全措施的项目,本文是其中一个附录,梳理了 ISO/IEC 14882:2003 和 ISO/IEC 14882:2011 前 18 章可导致未定义行为的代码实现方式,后 12 章的主题为标准库实现,相关内容的主旨在前 18 章中已有体现。C 语言相关内容可参见《C 未定义行为成因列表》。
列表
- 代码行以反斜杠结尾,且与下一行连接后生成通用字符名称
- 非空源文件未以换行符结尾,或以换行符结尾但换行符之前是反斜杠
- 连接预处理符号时产生了通用字符名称
- 存在不符合词法的单引号或双引号
- 在 #include 指令中,'、"、\、//、/* 出现在定界符 < > 之间,或 '、\、//、/* 出现在定界符 " 之间
- 无后缀 10 进制整数字面常量超过 long int 取值范围
- 使用非标准转义字符
- 修改字符串字面常量
- 窄字符串与宽字符串连接
- 违反 One Definition Rule
- 具有静态或线程存储期的对象在析构函数中调用 std::exit 函数
- 函数内具有静态或线程存储期的对象已析构,之后该函数又被调用并引用到已析构的对象
- 在对象析构之后使用对象
- 指针指向长度为 0 的内存空间并被解引用
- 内存回收函数抛出异常
- 使用不匹配的方法分配回收资源
- 使用已被释放的指针
- 对象生命周期已结束,但未调用其有副作用的析构函数
- 在分配空间后,生命周期开始前,或在生命周期结束后,回收空间前,通过指针访问对象
- 在分配空间后,生命周期开始前,或在生命周期结束后,回收空间前,通过 glvalue 访问对象
- 具有静态、线程或自动存储期和 non-trivial 析构函数的对象,其空间被非兼容类型的对象占据
- 常量对象的空间或曾属于常量对象的空间被其他对象占据
- 通过 glvalue 访问对象,但 glvalue 的类型不符合要求
- 通过 glvalue 引用不相关类型的对象或未初始化的对象
- 浮点类型转换产生的结果无法在相应的空间中表示
- 浮点类型转为整数类型时,整数类型无法存储浮点类型的整数部分
- 整数类型转为浮点类型时,浮点类型无法存储整数的值
- 表达式求值依赖无确定顺序的副作用
- 表达式的结果在数学上没有定义
- 被调用函数的语言链接性与该函数定义的语言链接性不符
- 将非 POD 对象传入可变参数列表
- 用 static_cast 将基类引用转为派生类引用,基类为虚基类,或引用的实际对象并非派生类对象
- 用 static_cast 将基类指针转为派生类指针,基类为虚基类,或指向的实际对象并非派生类对象
- 用 static_cast 将成员指针转为基类成员指针时,基类中没有相关成员
- 函数指针被转为不兼容的类型并执行
- 类型转换时去掉对象 const 属性并修改对象
- 对不完整类型的对象取地址,但该对象的完整类型重载了 operator &
- new 运算符第一个数组维度的参数为负数
- 用 delete 释放数组漏写中括号,用 delete 释放对象多写中括号,用 delete 释放非 new 表达式的结果
- 被 delete 释放的对象或数组类型不符合要求
- 用 delete 释放不完整类型的对象,但在对象完整类型声明中有 non-trivial 析构函数
- 对象解引用成员指针时,对象的动态类型不包含成员指针引用的成员
- 对象解引用成员指针时,成员指针为空指针
- / 或 % 运算符第二个操作数的值为 0
- 指针加减整数,结果超出了指针所在数组的地址范围
- 不在同一数组中的指针相减
- 移位运算符右操作数为负数或超过相关类型比特位的数量
- 对有符号整数进行超出取值范围的左移运算
- 将对象赋值给具有重叠区域的对象
- 函数没有通过 return 语句返回明确的值,但函数返回值被使用
- 递归地定义和初始化静态对象
- 修改非 mutable 常量对象
- 使用没有 volatile 限定的 glvalue 访问有 volatile 限定的对象
- 具有 noreturn 属性的函数返回至调用方
- 空指针解引用
- 对象的实际类型与当前静态类型不相关,并调用其非静态成员函数
- 在构造函数或析构函数中调用纯虚函数
- 对象的实际类型与当前静态类型不相关,并调用其析构函数
- 在对象生命周期结束后调用其析构函数
- 基类对象构造完毕之前调用成员函数
- 对成员或基类对象的不合理引用
- 将对象指针转为其基类对象的指针时,基类对象尚未开始构造或已结束析构
- 正在构造或析构的对象通过 . 或 -> 调用虚函数,而且该对象与当前构造或析构函数不属于同一个类或基类
- typeid 作用于正在构造或析构的对象,而且该对象与当前构造或析构函数不属于同一个类或基类
- dynamic_cast 作用于正在构造或析构的对象,而且该对象与当前构造或析构函数不属于同一个类或基类
- 需要无限递归的模版实例化
- 构造或析构函数在 function-try-block 的 handler 中访问非静态成员
- 有返回值的函数在 function-try-block 的 handler 中没有正确返回
- 在 #if、 #elif 的条件中,由宏展开产生了 defined 表达式,或 defined 表达式格式不正确
- #include 指令经宏展开后不满足标准格式
- 宏的实参列表中出现预处理指令
- 预处理运算符 # 的结果不是有效的字符串
- 预处理运算符 ## 的结果不是有效的符号
- #line 指定的行号为 0 或大于规定值
- #line 指令不符合标准格式
- 用 #define 定义或用 #undef 取消定义具有保留意义的名称
- 供语言机制调用的函数不符合要求
- 程序实现了应由标准库提供的功能
- 未经许可,向 std 命名空间添加声明或定义
- 对标准库,特化模板类成员函数,特化模板类成员模板函数,特化、偏特化成员类模版
- 未经许可,向 posix 命名空间添加声明或定义
- 声明或定义标准库保留名称
- 编译器未提供标准头文件,但编译时引入了非标准同名头文件
- 为标准库函数提供不符合要求的参数
- 多线程调用标准库函数造成 data race
- 违反标准库函数要求的前置条件,除非标准库函数声明了这种情况会抛出异常
- offsetof 用于非 standard layout 类型,或用于计算静态成员以及成员函数的偏移量
- 可变参数列表省略号左侧的形式参数为函数、数组或引用
- longjmp 跳转使应被执行的析构函数未被执行
C++ Undefined Behavior 详细列表的更多相关文章
- 情景剧:C/C++中的未定义行为(undefined behavior)
写在前面 本文尝试以情景剧的方式,轻松.直观地解释C/C++中未定义行为(undefined behavior)的概念.设计动机.优缺点等内容1,希望读者能够通过阅读本文,对undefined beh ...
- UISearchController Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior
Attempting to load the view of a view controller while it is deallocating is not allowed and may res ...
- 【转载】C语言中的undefined behavior/unspecified behavior - 序
嗷嗷的话: 这都是一些细枝末节的东西,我想不做编译器的话,大部分都很难碰到.研究学习这些只是出于对C语言一种偏执狂. 写出来是为了找到和我一样的偏执狂. 在随后的的文章中,首先我写一写191种unde ...
- Response.ContentType 详细列表 <转>
Response.ContentType 详细列表 不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 text/html 也就是网页格式.代码如: <% ...
- WinXP系统服务详细列表
windows XP 系统服务“关闭”详细列表,释放N多内存,128也够用了! 在xp系统中,有近90个服务,默认开启了 30多个服务,而事实上我们只需要其中几个就够用了.禁止所有不必要的服务可以为您 ...
- Oracle_Database_11g_标准版_企业版__下载地址_详细列表
Oracle_Database_11g_标准版_企业版__下载地址_详细列表 Oracle Database 11g Release 2 Standard Edition and Enterprise ...
- SQL Server 2008 R2 性能计数器详细列表(五)
原文:SQL Server 2008 R2 性能计数器详细列表(五) SQL Server:SQL Statistics 对象: 监视编译和发送到 SQL Server 实例的请求类型 SQL Ser ...
- SQL Server 2008 R2 性能计数器详细列表(三)
原文:SQL Server 2008 R2 性能计数器详细列表(三) SQL Server,Deprecated Features 对象: 监视指定为不推荐使用的功能: SQL Server Depr ...
- SQL Server 2008 R2 性能计数器详细列表(四)
原文:SQL Server 2008 R2 性能计数器详细列表(四) SQL Server Latches 对象: 监视称为闩锁的内部 SQL Server 资源锁.通过监视闩锁来确定用户活动和资源使 ...
随机推荐
- FreeSql 将 Saas 租户方案精简到极致[.NET ORM SAAS]
什么是多租户 维基百科:"软件多租户是指一种软件架构,在这种软件架构中,软件的一个实例运行在服务器上并且为多个租户服务".一个租户是一组共享该软件实例特定权限的用户.有了多租户架构 ...
- [GYCTF2020]Ezsqli-1|SQL注入
1.打开界面之后在输入框进行输入测试,分别输入1.2.3.'等字符,结果如下: 2.看到bool(false)这里我想到了bool注入,因为之前做过这道题:https://www.cnblogs.co ...
- es6中的Proxy和vue中的数据代理的异同
1:概述 1-1:Proxy 用于修改某些操作的默认行为,Proxy可以说在对对象进行各种访问或者操作的时候在外层进行一层拦截,在操作之前都需要经过这种拦截.proxy返回的是一个新对象,可以通过操作 ...
- 什么是云计算?云计算三种模式Sass、Paas、Iaas
云计算 云计算的"云"指的是计算机网络(一般指的是 Internet),"计算"指的是多个计算机共同计算巨大的数据的过程.通过云计算平台把任务分解成一个个小的任 ...
- Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- 这次我设计了一款TPS百万级别的分布式、高性能、可扩展的RPC框架
作者:冰河 博客地址:https://binghe001.github.io 大家好,我是冰河~~ 没错,这次冰河又要搞事情了,这次准备下手的是RPC框架项目.为什么要对RPC框架项目下手呢,因为在如 ...
- React报错之Parameter 'props' implicitly has an 'any' type
正文从这开始~ 总览 当我们没有为函数组件或者类组件的props声明类型,或忘记为React安装类型声明文件时,会产生"Parameter 'props' implicitly has an ...
- 【manim】含有add_updater更新函数become的物体移动方法
在manim社区版本中, 一.对于一般的物体,移动的方法分为 (瞬移) 和 (带动画移动) 1.瞬移 #直接对物体操作即可 obj.shift(LEFT) #瞬间移 ...
- 第四十一篇:Vue生命周期(二)
好家伙,书接上回 上图:(Vue官网中Vue实例图片的下半张) 以下为解释: 5.1.1. mounted执行完后,表示整个Vue实例已经初始化完毕了; 此时,组件已经脱离了创建阶段;进入到运行阶段 ...
- docker注册中心相关操作
相关命令详解 (1)push推送 将镜像推送到由其名称或标签指定的仓库中.与pull命令相对. [root@docker ~]# docker push --help Usage: docker pu ...