问题标签 [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++ - 此代码会产生未定义的行为还是仅仅是未指定的行为?
假设我们有两个编译单元,如下所示:
当我在 VC2010 上尝试它时,它首先初始化value1
并value2
归零。两者都不是动态初始化的value1
,value2
默认初始化不适用于它们吗?
谢谢,
c++ - 空基类是否会影响派生类的布局?
C++ 标准(引自草案 n3242)对子对象 [intro.object] 有以下说明:
除非对象是位域或大小为零的基类子对象,否则该对象的地址就是它占用的第一个字节的地址。既不是位字段也不是零大小的基类子对象的两个不同对象应具有不同的地址。
现在,给定以下代码段:
我相信 gcc 会打印出来2
,Visual C++ 2010 会打印出来1
。我怀疑 gcc 采用标准意味着如果类型的存储代表不同的对象,则不能为它们的存储设置别名。我敢打赌,MSVC 采用的标准意味着如果一个子对象的大小为零,你可以做任何你想做的事情。
这是未指定的行为吗?
c - CUDA:将字符数组从主机复制到设备后出现“堆栈溢出或断点命中”和未指定的启动失败错误
我的主程序中有一个大型 char 数组,我将其分块复制到设备内存中。我在我的程序中运行了大约 500,000 个线程,每个线程访问 2000 个字符。所以我使用代码一次传输 500,000 * 2000 = 1GB 字节
在我的内核中,我还定义了三个共享数组
并用
如果我用两行注释运行我的程序,我的内核返回奇怪的值,当我复制 char 数组的第二块时,我得到错误
CUDA 错误:未指定的启动失败
如果我取消注释上面代码中的行,一切正常。如果我复制较小的数组块,例如 100MB 而不是 1GB,它可以正常工作,直到我得到与上述相同的错误的第 6 个块。
这是非常奇怪的行为,我想了解为什么会这样。某处是否存在导致此问题的错误?很难确定它,因为如果我传输一小块(例如 100MB)而忽略其他块,程序可以正常工作。如果我取消注释与共享变量相关的行或将共享变量更改为常量,它也可以正常工作。任何帮助将不胜感激。谢谢!
编辑:这是我的内核。总而言之,我通过比较它们的第 i 个字符来计算两个字符串的相似度分数,这些字符在 0 和它们的长度之间。下面的代码将产生上述错误,除非您立即取消注释 if(threadIdx.x == 0) {
. 或者,如果您将下面的共享数组替换为常量数组,那么它也可以正常工作。
c - 调用 C 中的函数和未定义/未指定行为时的序列点
我试图确定我对 C 中序列点的理解——只是想检查一些东西。目前,我认为 (1) 是未定义的,而 (2) 只是未指定的,基于在 (2) 中,在评估g
and的参数后存在序列点h
(因此我们不会i
在序列点之间修改两次) ,但参数的评估顺序f
仍未指定。我的理解正确吗?
编辑:
似乎这里的关键点是编译器是否可以在调用g
或h
调用之前自由执行这两个增量 - 我从下面的答案中理解是,尽管我很感激确认是这种情况。
c++ - 为什么这个 const 说明符有未指定的行为?
我维护了一个开源程序,我的一个用户报告说它不会在clang
我以前从未使用过的 . 我得到的错误之一是*Warning: qualifier on function type 'junky_t' (aka 'void (const int &, const int &)') has unspecified behavior.*。我创建了一个演示该问题的小程序:
这是我尝试编译时发生的情况:
也就是说,类demo
有一个函数指针,指向一个函数,该函数的签名采用许多 const 引用。const
类中的demo
应该防止junk
被更改。但是显然它是模棱两可的,因为可能会考虑函数本身const
,但事实并非如此。我用gcc
or编译它没有问题,llvm
但它不会clang
在 Mac 上编译。我应该怎么办?
c++ - 如果复合表达式中的多个操作数修改同一个对象,它是未定义的行为吗?
我隐约记得在某处读过,如果复合表达式中的多个操作数修改同一个对象,则这是未定义的行为。
我相信下面的代码中显示了这个 UB 的一个示例,但是我已经在 g++、clang++ 和 Visual Studio 上编译,它们都打印出相同的值,并且似乎无法在不同的编译器中产生不可预测的值。
这种行为是未定义的,还是我以某种方式想出了一个实际上未定义的假定 UB 的描述?
如果有人可以发布此 UB 的示例,甚至可以指出我在 C++ 标准中说它是 UB 的位置,我将不胜感激。
c++ - 在返回对象的函数调用和对该对象的方法调用之间是否存在序列点?
如果我写,我可以在评估之前f(x)->g(args, ...)
依赖一个序列点吗?我可以看到两种方式的论点:f(x)
args, ...
- §1.9.17 “在调用函数时(无论该函数是否内联),在函数体中的任何表达式或语句执行之前发生的所有函数参数(如果有)的评估之后都有一个序列点。在复制返回值之后和函数外的任何表达式执行之前还有一个序列点。 ”
- 另一方面,对象指针隐含地是一个隐藏的参数
this
,就好像我写g(f(x), args, ...)
的那样,这表明它就像一个参数,因此未指定。
该->
运算符不是普通的二元运算符,因为显然g(...)
无法f(x)
像我写的那样进行评估f(x) + g(...)
。我很惊讶我找不到一些关于它的具体陈述。
c++ - 是索引一个新的地图元素并将读取它的东西分配给它未定义的行为,还是只是未指定?
在回答了这个问题之后,关于有问题的代码是否是未定义的行为进行了长时间的讨论。这是代码:
首先,这是公认的,这至少是未指定的。结果根据首先评估作业的哪一侧而有所不同。在我的回答中,我跟踪了四个结果案例中的每一个,其中首先评估了哪一方的因素以及该元素在此之前是否存在。
还出现了一个简短的表格:
我声称它更像这样:
最终,我找到了一个似乎对我有用的例子:
回到原来的,我把它分解成相关的函数调用,以便更容易理解:
如果word_count["a"]
不存在,则有人认为它将被分配两次,而两者之间没有排序。如果我认为是真的两件事实际上是:
When a side is picked to be evaluated, the whole side has to be evaluated before the other side can start.
诸如 word_count["a"] = 1 之类的结构表现出明确定义的行为,即使在插入元素然后分配给它的情况下也是如此。
这两个说法是真的吗?最终,这实际上是未定义的行为吗?如果是,为什么第二个语句起作用(假设它起作用)?如果第二个是假的,我相信myMap[i]++;
世界上所有的 s 都是不正确的。
有用的链接:未定义的行为和序列点
c++ - 在 C++ 中使用内联函数的未指定输出
我正在使用代码来理解 c++ 中的内部和外部链接。我想出了代码,其输出似乎根据链接的顺序而有所不同。
测试1.cpp
测试2.cpp
驱动程序.cpp
输出1:-
在上面的输出中,编译器正在考虑在 test1.cpp 中定义的 c()
输出 2:- 在链接时更改 test1.o 和 test2.o 的顺序。
在上面的输出中,编译器正在考虑在 test2.cpp 中定义的 c()
当我对代码进行细微更改时,我感到很困惑,如下所示:-
1)如果我不调用函数 a() [test1.cpp] 中的 c() 和函数 b()[test2.cpp] 中的 c()。 cp]
链接时出现以下错误:-
2)如果我在任何一个文件中调用 c() ,即在 test1.cpp 或 test2.cpp 中,那么我不会得到链接器错误。
谁能帮助我理解这种行为。
提前致谢。