问题标签 [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.
c++ - 可以在 constexpr 上下文中使用使用导致未指定(不是未定义!)行为的指针的表达式吗?
根据cppreference(强调我的):
核心常量表达式是在任何子表达式
(...) 中不包含以下任何一项的任何表达式
- 一个表达式,其评估会导致任何形式的核心语言未定义行为(包括有符号整数溢出、被零除、数组边界外的指针算术等)。未指定是否检测到标准库未定义行为。
另一方面,指针上有几个表达式,其结果不是未定义但未指定(参见[expr.rel]/3),例如:
该代码在gcc上编译时没有问题,但在clang中没有问题,这表明以下内容无疑是正确的:
不同基类的子对象的地址比较未指定
但是(据我了解)根据 cppreference 它不应该阻止编译器编译代码。
哪个编译器在这里 - gcc 或 clang?我是否过度解释了 cppreference?
c++ - C++ 混合器GetLineInfo 返回 MMSYSERR_ERROR (Windows 8)
我正在尝试运行此代码(VS2015、MFC、Windows 8):
MixerGetLineInfo 不起作用,它总是返回 MMSYSERR_NOERROR,这意味着未指定的错误。那是因为Win 8还是什么?如何运行它?
css - 如何根据 GTMatrix 解决此“未指定到期”问题?
我有一个网站WeeTech 解决方案。每当我在“<strong>GT Matrix”上查看我的网站时,都会向我显示问题的数量,例如... • https://www.weetechsolution.com/css/content_slider_style.css(未指定到期时间)
如何解决这个问题?
c - 结构变量上的这个 memset-memcmp 是有效的 C 吗?
memset
一个结构对某个值是否合法,然后将其与memcmp
?
上述代码行为是否已明确定义、未定义或实现指定?上述代码的有效性取决于struct S
?
使用 0xFF 填充结构,然后将其memcmp
与报告错误的方式(设备永远不会返回所有 0xFF 字节)。我有固定的平台和工具链,代码现在可以工作,但是如果我提高优化级别,我可以相信它不会中断吗?
结论:虽然如果我确保没有填充位、浮点字段等可能有问题,则可以使此代码正常工作,但我决定改为将一个特定的结构字段设置为特定的“不可能”值以指示错误。
c++ - C++14 是否在 unsigned int 的填充位上定义位运算符的行为?
C++ 标准
如果C++14
实现在 a 的底层字节中包含填充位,unsigned int
标准是否指定是否不得对填充位执行按位运算?
此外,C++14 标准是否指定相等和关系运算符是否必须忽略填充位?
指导方针
如果在这个问题上缺乏规范,是否对这些运算符在填充位上的预期行为达成某种共识?
我在 Stack Overflow 上发现了相互矛盾的答案。Orbit和ecatmur中的 Lightness Races说按位运算符不适用于算术,因为它们适用于所有位(包括填充位),而Christoph和Bartek Banachewicz说按位运算符处理整数的逻辑值并忽略填充。
参考
相关答案:关于填充位(1、 2、 3)的存在,关于缺乏明确的 C++ 规范(4)。
C++14中填充位的定义- § 3.9.1 - 基本类型:
对于窄字符类型,对象表示的所有位都参与值表示。对于无符号窄字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。
C++14 中对象表示和值表示的定义 - § 3.9 - 类型:
类型对象的对象表示是类型对象占用的N
T
个对象的序列,其中N等于。对象的值表示是保存 type 值的一组位。对于普通可复制类型,值表示是对象表示中确定值的一组位,该值是实现定义的一组值的一个离散元素。44unsigned char
T
sizeof(T)
T
脚注 44) 意图是 C++ 的内存模型与 ISO/IEC 9899 编程语言 C 的内存模型兼容。
C++14 中位与的定义 - § 5.11 - 位与运算符:
执行通常的算术转换;结果是操作数的按位与函数。该运算符仅适用于整数或无范围的枚举操作数。
C++14 中加法的定义 - § 5.7 - 加法运算符:
对算术或枚举类型的操作数执行通常的算术转换。此外,[...] 两个操作数都应具有算术或无范围枚举类型 [...]。二元
+
运算符的结果是操作数的和。
c++ - 在 C++ 中,访问未初始化的数组是未指定的行为还是未定义的行为?
例如,在以下代码中:
代码是否保证在恒定时间内成功执行,并x
具有一些整数值?或者编译器是否可以完全跳过为此发出代码/发出代码以启动 GNU Chess 并且仍然符合 C++ 标准?
这在类似于数组的数据结构中很有用,但可以在恒定时间内初始化。(抱歉,手边没有我的 Aho、Hopcroft 和 Ullman 的副本,所以找不到名字。)
c++ - 如何在函数参数初始化中捕获未定义的行为
以下代码在 clang++ 中工作,但在 g++ 中崩溃
罪魁祸首原来是这一行:
在 clang 中,*it
在之前进行评估++it
,在 g++ 中则相反,导致迭代器在被取消引用之前增加。事实证明,评估函数参数的顺序是实现定义的。
我的问题是:我如何捕捉到这种类型的错误?理想情况下,当我不小心依赖于实现特定的细节时,我希望有一个错误或至少一个警告。
即使使用 -Wall,clang 和 gcc 都不会产生任何警告。
c - 如何在 C 程序中鼓励未定义的行为/乱序执行?
我正在阅读以下关于 C 中序列点的文章:https ://www.geeksforgeeks.org/sequence-points-in-c-set-1/
其中有几个未定义行为的示例,例如调用两个修改单个全局变量的函数的表达式,或多次递增同一变量的单个表达式。
理论上,我理解这个概念。但是,无论我尝试运行这些示例多少次,行为都是一样的,而且永远不会“令人惊讶”。
为了亲身体验未定义的行为,让示例“令人惊讶”的最简单方法是什么?
(如果重要的话,我正在使用 MINGW64。)
c++ - 我可以获取标准库中定义的函数的地址吗?
考虑以下代码:
在这里,两个调用std::invoke
被标记以供将来参考。预期的输出是:
在 C++20 中是否保证了预期的输出?
(注意:有两个函数被调用tolower
——一个 in<cctype>
和另一个 in <locale>
。显式转换被引入来选择所需的重载。)