草庐IT

行为树

全部标签

c++ - 存储无效指针是否自动未定义的行为?

显然,取消引用无效指针会导致未定义的行为。但是在指针变量中简单地存储一个无效的内存地址呢?考虑以下代码:constchar*str="abcdef";constchar*begin=str;if(begin-1表达式begin-1计算为无效的内存地址。请注意,我们实际上并没有取消引用这个地址——我们只是在指针运算中使用它来测试它是否有效。尽管如此,我们仍然需要将无效的内存地址加载到寄存器中。那么,这是未定义的行为吗?我从没想过是这样,因为很多指针算术似乎都依赖于这种东西,而指针实际上只不过是一个整数。但是最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为如果您这样做,某

c++ - 存储无效指针是否自动未定义的行为?

显然,取消引用无效指针会导致未定义的行为。但是在指针变量中简单地存储一个无效的内存地址呢?考虑以下代码:constchar*str="abcdef";constchar*begin=str;if(begin-1表达式begin-1计算为无效的内存地址。请注意,我们实际上并没有取消引用这个地址——我们只是在指针运算中使用它来测试它是否有效。尽管如此,我们仍然需要将无效的内存地址加载到寄存器中。那么,这是未定义的行为吗?我从没想过是这样,因为很多指针算术似乎都依赖于这种东西,而指针实际上只不过是一个整数。但是最近我听说即使将无效指针加载到寄存器中的行为也是未定义的行为,因为如果您这样做,某

c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?

MSVC的实现示例:#defineoffsetof(s,m)\(size_t)&reinterpret_cast((((s*)0)->m))//^^^^^^^^^^^可以看出,它取消引用一个空指针,这通常会调用未定义的行为。这是规则的异常(exception)还是发生了什么? 最佳答案 如果语言标准说“未定义的行为”,任何给定的编译器都可以定义该行为。标准库中的实现代码通常依赖于此。所以有两个问题:(1)代码相对于C++标准是UB吗?这是一个非常困难的问题,因为这是一个众所周知的几乎缺陷,C++98/03标准从未在规范性文本中明确指

c++ - <stddef.h> 中的 'offsetof' 宏是否会调用未定义的行为?

MSVC的实现示例:#defineoffsetof(s,m)\(size_t)&reinterpret_cast((((s*)0)->m))//^^^^^^^^^^^可以看出,它取消引用一个空指针,这通常会调用未定义的行为。这是规则的异常(exception)还是发生了什么? 最佳答案 如果语言标准说“未定义的行为”,任何给定的编译器都可以定义该行为。标准库中的实现代码通常依赖于此。所以有两个问题:(1)代码相对于C++标准是UB吗?这是一个非常困难的问题,因为这是一个众所周知的几乎缺陷,C++98/03标准从未在规范性文本中明确指

c++ - g++ 和 clang++ 对流输入和无符号整数的不同行为

我遇到了gcc(4.9.2)和clang(3.5.0)之间的行为差​​异,这让我很惊讶。当我尝试喂一个unsignedint来自std::istringstream用负值初始化(在示例中为“-15”)我得到clang++出现错误(fail()位已引发)使用signed(-15)进行初始化使用gcc++我准备了以下简单的示例程序。#include#includeintmain(){std::istringstreamiss("-15");unsignedintui;iss>>ui;std::cout使用clang++,我得到以下输出ui[0]signed(ui)[0]flags[1001

c++ - g++ 和 clang++ 对流输入和无符号整数的不同行为

我遇到了gcc(4.9.2)和clang(3.5.0)之间的行为差​​异,这让我很惊讶。当我尝试喂一个unsignedint来自std::istringstream用负值初始化(在示例中为“-15”)我得到clang++出现错误(fail()位已引发)使用signed(-15)进行初始化使用gcc++我准备了以下简单的示例程序。#include#includeintmain(){std::istringstreamiss("-15");unsignedintui;iss>>ui;std::cout使用clang++,我得到以下输出ui[0]signed(ui)[0]flags[1001

c++ - 为什么 C++11 中的 `i = i++ + 1` 行为未定义?

我正在阅读C++11标准的n3290草案(尽可能接近实际的标准文本),我注意到i=i+++1;会产生未定义的行为。我以前见过类似的问题,但他们是根据旧标准(序列点)回答的。新标准引入了表达式和子表达式执行之间的排序之前/之后关系的概念。1.913Sequencedbeforeisanasymmetric,transitive,pair-wiserelationbetweenevaluationsexecutedbyasinglethread(1.10),whichinducesapartialorderamongthoseevaluations.Givenanytwoevaluatio

c++ - 为什么 C++11 中的 `i = i++ + 1` 行为未定义?

我正在阅读C++11标准的n3290草案(尽可能接近实际的标准文本),我注意到i=i+++1;会产生未定义的行为。我以前见过类似的问题,但他们是根据旧标准(序列点)回答的。新标准引入了表达式和子表达式执行之间的排序之前/之后关系的概念。1.913Sequencedbeforeisanasymmetric,transitive,pair-wiserelationbetweenevaluationsexecutedbyasinglethread(1.10),whichinducesapartialorderamongthoseevaluations.Givenanytwoevaluatio

c++ - 在 C++ 命名空间中包含 C header - 这是标准行为吗?

我一直认为C头文件必须包含在C++程序的顶层。无论如何,我偶然发现C++允许在子命名空间中包含Cheader。namespaceAAA{extern"C"{#include"sqlite3.h"//CAPI.}}然后,所有的C类型和函数都将放在命名空间中。更有趣的是,所有链接的C函数也正常工作!我还发现这可能会导致一些预处理器问题,但除此之外,它似乎工作得很好。这是标准行为吗?(我使用的是Clang3.x)如果是,这个特性的名称是什么,我在哪里可以找到标准中提到的这个特性? 最佳答案 你甚至可能会做一些奇怪的事情,比如//test.

c++ - 在 C++ 命名空间中包含 C header - 这是标准行为吗?

我一直认为C头文件必须包含在C++程序的顶层。无论如何,我偶然发现C++允许在子命名空间中包含Cheader。namespaceAAA{extern"C"{#include"sqlite3.h"//CAPI.}}然后,所有的C类型和函数都将放在命名空间中。更有趣的是,所有链接的C函数也正常工作!我还发现这可能会导致一些预处理器问题,但除此之外,它似乎工作得很好。这是标准行为吗?(我使用的是Clang3.x)如果是,这个特性的名称是什么,我在哪里可以找到标准中提到的这个特性? 最佳答案 你甚至可能会做一些奇怪的事情,比如//test.