问题标签 [unspecified-behavior]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
184 浏览

c++ - 可以在 constexpr 上下文中使用使用导致未指定(不是未定义!)行为的指针的表达式吗?

根据cppreference(强调我的):

核心常量表达式是在任何子表达式
(...) 中不包含以下任何一项的任何表达式

  1. 一个表达式,其评估会导致任何形式的核心语言未定义行为(包括有符号整数溢出、被零除、数组边界外的指针算术等)。未指定是否检测到标准库未定义行为。

另一方面,指针上有几个表达式,其结果不是未定义但未指定(参见[expr.rel]/3),例如:

该代码在gcc上编译时没有问题,但在clang中没有问题,这表明以下内容无疑是正确的:

不同基类的子对象的地址比较未指定

但是(据我了解)根据 cppreference 它不应该阻止编译器编译代码。

哪个编译器在这里 - gcc 或 clang?我是否过度解释了 cppreference?

0 投票
0 回答
462 浏览

c++ - C++ 混合器GetLineInfo 返回 MMSYSERR_ERROR (Windows 8)

我正在尝试运行此代码(VS2015、MFC、Windows 8):

MixerGetLineInfo 不起作用,它总是返回 MMSYSERR_NOERROR,这意味着未指定的错误。那是因为Win 8还是什么?如何运行它?

0 投票
2 回答
3023 浏览

css - 如何根据 GTMatrix 解决此“未指定到期”问题?

我有一个网站WeeTech 解决方案。每当我在“<strong>GT Matrix”上查看我的网站时,都会向我显示问题的数量,例如... • https://www.weetechsolution.com/css/content_slider_style.css(未指定到期时间)

如何解决这个问题?

0 投票
4 回答
3228 浏览

c - 是“-1>>5;” C中未指定的行为?

C11 §6.5.7 第 5 段:

结果E1 >> E2E1右移的E2位位置。如果 E1有无符号类型或E1有符号类型和非负值,则结果的值是 的商的整数部分E1 / 2*^E2如果E1具有带符号类型和负值,则结果值是实现定义的。

但是,viva64参考文档说:

我在GCC上运行了这段代码,它总是给出一个输出-1

因此,标准说“如果 E1 具有带符号类型和负值,则结果值是实现定义的”,但该文档说的-1>>5;未指定的行为

那么,-1>>5;C 中有未指定的行为吗?哪个是对的?

0 投票
2 回答
338 浏览

c - 结构变量上的这个 memset-memcmp 是有效的 C 吗?

memset一个结构对某个值是否合法,然后将其与memcmp?

上述代码行为是否已明确定义、未定义或实现指定?上述代码的有效性取决于struct S

使用 0xFF 填充结构,然后将其memcmp与报告错误的方式(设备永远不会返回所有 0xFF 字节)。我有固定的平台和工具链,代码现在可以工作,但是如果我提高优化级别,我可以相信它不会中断吗?


结论:虽然如果我确保没有填充位、浮点字段等可能有问题,则可以使此代码正常工作,但我决定改为将一个特定的结构字段设置为特定的“不可能”值以指示错误。

0 投票
2 回答
681 浏览

c++ - C++14 是否在 unsigned int 的填充位上定义位运算符的行为?

C++ 标准

如果C++14 实现在 a 的底层字节中包含填充位,unsigned int标准是否指定是否不得对填充位执行按位运算?

此外,C++14 标准是否指定相等和关系运算符是否必须忽略填充位?

指导方针

如果在这个问题上缺乏规范,是否对这些运算符在填充位上的预期行为达成某种共识?

我在 Stack Overflow 上发现了相互矛盾的答案。Orbitecatmur中的 Lightness Races说按位运算符不适用于算术,因为它们适用于所有位(包括填充位),而ChristophBartek Banachewicz说按位运算符处理整数的逻辑值并忽略填充。

参考

相关答案:关于填充位(123)的存在,关于缺乏明确的 C++ 规范(4)。

C++14中填充位的定义- § 3.9.1 - 基本类型:

对于窄字符类型,对象表示的所有位都参与值表示。对于无符号窄字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。

C++14 中对象表示和值表示的定义 - § 3.9 - 类型:

类型对象的对象表示是类型对象占用的NT个对象的序列,其中N等于。对象的值表示是保存 type 值的一组位。对于普通可复制类型,值表示是对象表示中确定的一组位,该值是实现定义的一组值的一个离散元素。44 unsigned charTsizeof(T)T

脚注 44) 意图是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。

C++14 中位与的定义 - § 5.11 - 位与运算符:

执行通常的算术转换;结果是操作数的按位与函数。该运算符仅适用于整数或无范围的枚举操作数。

C++14 中加法的定义 - § 5.7 - 加法运算符:

对算术或枚举类型的操作数执行通常的算术转换。此外,[...] 两个操作数都应具有算术或无范围枚举类型 [...]。二元+运算符的结果是操作数的和。

0 投票
2 回答
435 浏览

c++ - 在 C++ 中,访问未初始化的数组是未指定的行为还是未定义的行为?

例如,在以下代码中:

代码是否保证在恒定时间内成功执行,并x具有一些整数值?或者编译器是否可以完全跳过为此发出代码/发出代码以启动 GNU Chess 并且仍然符合 C++ 标准?

这在类似于数组的数据结构中很有用,但可以在恒定时间内初始化。(抱歉,手边没有我的 Aho、Hopcroft 和 Ullman 的副本,所以找不到名字。)

0 投票
3 回答
475 浏览

c++ - 如何在函数参数初始化中捕获未定义的行为

以下代码在 clang++ 中工作,但在 g++ 中崩溃

罪魁祸首原来是这一行:

在 clang 中,*it在之前进行评估++it,在 g++ 中则相反,导致迭代器在被取消引用之前增加。事实证明,评估函数参数的顺序是实现定义的。

我的问题是:我如何捕捉到这种类型的错误?理想情况下,当我不小心依赖于实现特定的细节时,我希望有一个错误或至少一个警告。

即使使用 -Wall,clang 和 gcc 都不会产生任何警告。

0 投票
2 回答
85 浏览

c - 如何在 C 程序中鼓励未定义的行为/乱序执行?

我正在阅读以下关于 C 中序列点的文章:https ://www.geeksforgeeks.org/sequence-points-in-c-set-1/

其中有几个未定义行为的示例,例如调用两个修改单个全局变量的函数的表达式,或多次递增同一变量的单个表达式。

理论上,我理解这个概念。但是,无论我尝试运行这些示例多少次,行为都是一样的,而且永远不会“令人惊讶”。

为了亲身体验未定义的行为,让示例“令人惊讶”的最简单方法是什么?

(如果重要的话,我正在使用 MINGW64。)

0 投票
1 回答
1903 浏览

c++ - 我可以获取标准库中定义的函数的地址吗?

考虑以下代码:

在这里,两个调用std::invoke被标记以供将来参考。预期的输出是:

在 C++20 中是否保证了预期的输出?

(注意:有两个函数被调用tolower——一个 in<cctype>和另一个 in <locale>。显式转换被引入来选择所需的重载。)