相关疑难解决方法(0)

未初始化的局部变量是最快的随机数发生器吗?

我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有可能影响进一步操作的陷阱表示,但有时我想仅使用随机数进行可视化表示,并且不会在其他部分使用它们.例如,程序在视觉效果中设置具有随机颜色的东西,例如:

void updateEffect(){
    for(int i=0;i<1000;i++){
        int r;
        int g;
        int b;
        star[i].setColor(r%255,g%255,b%255);
        bool isVisible;
        star[i].setVisible(isVisible);
    }
}
Run Code Online (Sandbox Code Playgroud)

是不是比它快

void updateEffect(){
    for(int i=0;i<1000;i++){
        star[i].setColor(rand()%255,rand()%255,rand()%255);
        star[i].setVisible(rand()%2==0?true:false);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且还比其他随机数发生器更快?

c c++ undefined-behavior garbage

319
推荐指数
16
解决办法
2万
查看次数

使C++程序崩溃的最简单方法是什么?

我正在尝试制作一个与不同的崩溃过程接口的Python程序(这不在我的手中).不幸的是,我正在连接的程序甚至没有可靠的崩溃!所以我想制作一个快速崩溃的C++程序,但我实际上并不知道最好和最短的方法,有谁知道我的:

int main() {
    crashyCodeGoesHere();
}
Run Code Online (Sandbox Code Playgroud)

使我的C++程序可靠地崩溃

c++ crash

309
推荐指数
15
解决办法
6万
查看次数

"未定义的行为"真的允许*发生任何事情吗?

编辑:这个问题并不是一个讨论未定义行为的(de)优点的论坛,但这就是它的变化.在任何情况下,这个关于假设的C编译器没有未定义行为的线程可能对那些认为这是一个重要主题的人更感兴趣.


当然,"未定义行为"的经典伪装例子是"鼻子恶魔" - 物理上是不可能的,无论C和C++标准允许什么.

因为C和C++社区倾向于强调未定义行为的不可预测性以及允许编译器在遇到未定义行为时使程序完全做任何事情的想法,所以我假设标准没有任何限制关于行为,以及未定义的行为.

C++标准中相关引用似乎是:

[C++14: defns.undefined]: [..]允许的未定义行为包括完全忽略不可预测的结果,在转换或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式执行,终止转换或执行(发布诊断信息).[..]

这实际上指定了一小组可能的选项:

  • 忽略这种情况 - 是的,标准继续说这会产生"不可预测的结果",但这与编译器插入代码不同(我认为这是一个先决条件,你知道,鼻子恶魔).
  • 以文件化的方式表现环境 - 这实际上听起来相对温和.(我当然没有听说过任何有关鼻腔恶魔的记录.)
  • 终止翻译或执行 - 使用诊断,不能少.那个UB会表现得那么好吗?

我假设在大多数情况下,编译器选择忽略未定义的行为; 例如,当读取未初始化的内存时,可能是插入任何代码以确保一致行为的反优化.我认为陌生人类型的未定义行为(例如" 时间旅行 ")将属于第二类 - 但这需要记录这些行为并"环境特征"(所以我猜鼻腔恶魔只能由地狱计算机?).

我误解了这个定义吗?这些仅仅是可能构成未定义行为的例子,而不是一个全面的选项列表吗?"任何可能发生的事情"的说法仅仅意味着忽视这种情况的意外副作用吗?

编辑:两个小问题澄清:

  • 我认为从原始问题中可以清楚地看出,我认为对大多数人来说都是如此,但无论如何我都会拼出来:我确实意识到"鼻子恶魔"是诙谐的.
  • 请不要写的(其他)答案解释UB允许特定于平台的编译器优化,除非你解释它是如何允许的优化,实现定义的行为也不会允许.

c c++ undefined-behavior language-lawyer

93
推荐指数
6
解决办法
6796
查看次数

C++编译错误?

我有以下代码:

#include <iostream>
#include <complex>
using namespace std;

int main() {
    complex<int> delta;
    complex<int> mc[4] = {0};

    for(int di = 0; di < 4; di++, delta = mc[di]) {
        cout << di << endl;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它输出"0,1,2,3"并停止,但它会输出一系列无穷无尽的"0,1,2,3,4,5 ......"

看起来比较di<4效果不好并且总是返回true.

如果我只是评论出来,delta=mc[di],我会像往常一样得到"0,1,2,3".无辜任务有什么问题?

我正在使用带有-O2选项的Ideone.com g ++ C++ 14.

c++ gcc undefined-behavior

74
推荐指数
4
解决办法
5433
查看次数

分段错误的常见原因的确定列表

注意:我们有很多段错误问题,答案基本相同,所以我试图将它们折叠成一个规范的问题,就像我们对未定义的引用一样.

虽然我们有一个问题涉及分段错误是什么,但它涵盖了什么,但没有列出很多原因.最佳答案说"有很多原因",只列出一个,其他大多数答案都没有列出任何理由.

总而言之,我认为我们需要一个组织良好的社区wiki来讨论这个主题,它列出了所有常见原因(然后是一些)来获取段错误.目的是帮助调试,如答案的免责声明中所述.

我知道什么是分段错误,但是在不知道它们通常是什么样的情况下很难发现代码.虽然毫无疑问,有太多的内容无法详尽列出, C和C++ 中分段错误的最常见原因是什么?

c c++ segmentation-fault

56
推荐指数
1
解决办法
8623
查看次数

设置errexit选项时检测shell退出代码的正确方法

我更喜欢编写可靠的shell代码,因此总是设置errexit和nounset.

以下代码将在bad_command行停止

#!/bin/bash
set -o errexit ; set -o nounset
bad_command # stop here
good_command
Run Code Online (Sandbox Code Playgroud)

我想抓住它,这是我的方法

#!/bin/bash
set -o errexit ; set -o nounset
rc=1
bad_command && rc=0 # stop here
[ $rc -ne 0 ] && do_err_handle
good_command
Run Code Online (Sandbox Code Playgroud)

有没有更好或更清洁的方法

我的答案:

#!/bin/bash
set -o errexit ; set -o nounset
if ! bad_command ; then
  # error handle here
fi
good_command
Run Code Online (Sandbox Code Playgroud)

shell

42
推荐指数
5
解决办法
2万
查看次数

这个陈述的功能是什么*(长*)0 = 0;?

在下面的代码中,*(long*)0=0;if子句一起使用,但它的目的是什么?

if(r.wid*r.ht < tot)
    *(long*)0=0;
Run Code Online (Sandbox Code Playgroud)

c c++

35
推荐指数
3
解决办法
3412
查看次数

如何强制我的代码普遍地段错误?

我想知道对一段 C 代码进行可靠的分段错误的最佳方法是什么?

我完全意识到这是不好的行为,永远不应该用在一个软件中,但我想知道我如何能够持续地强制它发生。

编辑:我得到的答案不是我最初想要的,但对于理解为什么这个问题没有可靠答案很有价值。

c segmentation-fault

6
推荐指数
1
解决办法
3007
查看次数

什么是"*((char*) - 1)='x';" 代码意味着?

我在阅读redis源代码时遇到问题,有人能告诉我debug.c_redisAssert函数中最后一个语句的用法是什么:

*((char*)-1) = 'x';
Run Code Online (Sandbox Code Playgroud)

c undefined-behavior redis

4
推荐指数
1
解决办法
1130
查看次数

Valgrind:故意造成段错误

这是一个疯狂的黑客,但我试图故意在执行的特定点导致段错误,所以valgrind将给我一个堆栈跟踪.

如果有更好的方法,请告诉我,但我仍然很想知道如何故意导致段错误,以及为什么我的尝试不起作用.

这是我失败的尝试:

long* ptr = (long *)0xF0000000;
ptr = 10;
Run Code Online (Sandbox Code Playgroud)

我认为valgrind至少应该把它作为一个无效的写入,即使它不是一个分段违规.Valgrind对此一无所知.

有什么想法吗?

编辑

接受了答案,但我仍然有一些上升的选票,以获得一个更理智的方式来获得堆栈跟踪...

c valgrind segmentation-fault

2
推荐指数
3
解决办法
5065
查看次数

为什么在访问空std :: optional时没有throw或sigsegv?

这个例子:

#include <optional>
#include <iostream>

using namespace std;

int main()
{
    optional<int> t{}; // nullopt (empty) by default

    cout << *t << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

实际上这个程序打印一些int(未初始化的类型值int).此外,libcxx使用assert-check来访问非参与值.

为什么标准不要求扔或sigsegv在这里?

c++ segmentation-fault language-lawyer c++17 stdoptional

2
推荐指数
3
解决办法
183
查看次数

段错误的最小C/C++程序?

我正在尝试设置我的服务器处理核心转储的方式.为了测试它,我需要一个总是段错误的程序.

是否有一个简单的示例程序总是会出现段错误?

c c++ linux segmentation-fault

1
推荐指数
2
解决办法
1195
查看次数