相关疑难解决方法(0)

如何解释未知行为以了解所有新手?

有一些情况,C++标准将其定义为未定义的行为.例如,如果我分配new[],然后尝试释放delete(不delete[])那是未定义的行为 - 任何事情都可能发生 - 它可能会起作用,它可能会崩溃,它可能会默默地破坏某些东西并设置一个定时问题.

解释这一点很有问题,新手可能会发生任何事情.他们开始"证明""这是有效的"(因为它确实适用于他们使用的C++实现),并询问"这可能是什么问题"?我能给出什么简洁的解释会激励他们不写这样的代码?

c++ undefined-behavior

35
推荐指数
5
解决办法
1639
查看次数

是否有一些有意义的统计数据来证明保持未定义的有符号整数算术溢出是合理的?

C标准明确规定有符号整数溢出具有未定义的行为。然而,大多数CPU都使用定义的语义为溢出实现签名算法(可能除法除法溢出为:x / 0INT_MIN / -1)。

编译器的作家一直在走的优势undefinedness这种溢出的补充,往往会打破传统的代码非常微妙的方式更积极的优化。例如,此代码可能在较旧的编译器上有效,但在gccand的当前版本上不再有效clang

/* Tncrement a by a value in 0..255, clamp a to positive integers.
   The code relies on 32-bit wrap-around, but the C Standard makes
   signed integer overflow undefined behavior, so sum_max can now 
   return values less than a. There are Standard compliant ways to
   implement this, but legacy code is what it is... */
int sum_max(int a, unsigned char b) {
    int …
Run Code Online (Sandbox Code Playgroud)

c c++ signed integer-overflow language-lawyer

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

为什么我不应该在"删除"之后尝试使用"this"值?

C++的这一段中,delete this讨论了构造的使用.列出了4个限制.

限制1到3看起来很合理.但是为什么限制4在那里我"必须不检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情"?

我的意思this是又一个指针.为什么我不能把reinterpret_castint或者叫它printf()输出它的值?

c++ undefined-behavior

27
推荐指数
3
解决办法
1927
查看次数

Python类型安全吗?

根据维基百科

如果计算机科学家不允许操作或转换违反类型系统的规则,则认为该语言是"类型安全的".

由于Python运行时检查确保满足类型系统规则,因此我们应该将Python视为一种类型安全的语言.

Jason Orendorff和Jim Blandy在编程Rust中也提出了同样的观点:

请注意,类型安全与语言是否在编译时或运行时检查类型无关:C在编译时检查,并且不是类型安全的; Python在运行时检查,并且类型安全.

既有静态类型检查和类型安全的单独概念.

那是对的吗?

python types dynamic-typing type-safety memory-safety

25
推荐指数
5
解决办法
9896
查看次数

为什么存在"未定义的行为"?

某些常见的编程语言,尤其是C和C++,具有未定义行为的强烈概念:当您尝试执行某些操作之外的某些操作时,这会导致未定义的行为.

如果发生未定义的行为,则允许编译器执行任何操作(包括任何内容,'时间旅行'等).

我的问题是:为什么存在这种未定义行为的概念?据我所知,如果不是导致未定义的行为,使用超出其预期用途的操作会导致大量的错误,使用一个版本的编译器停止工作的程序,等等将被阻止一个编译错误.

为什么这不是事情的方式?

c c++ compiler-errors compilation undefined-behavior

9
推荐指数
2
解决办法
642
查看次数

当函数有警告 [-Wreturn-type] 时,为什么优化会忽略 if 语句?

操作系统:ubuntu2204

编译器:gcc 11.2 x86_64

这是一个简单的代码:


#include <cstdlib>

int func(int val) {
    if (val == 1) {
    } else {
        abort();
    }
}

int main(int argc, char* argv[]) {
    func(argc);
}

Run Code Online (Sandbox Code Playgroud)

当我在没有任何优化的情况下编译它并运行它时,它工作正常。

但是当我用 编译它时g++ tmp.cpp -O3,结果func会忽略输入值,而只调用abort.

当然,我可以通过在 的末尾添加 return 语句来修复它func,但是,为什么呢?

这是objdump -d a.out优化函数的一些输出func


0000000000001060 <_Z4funci>:
    1060:   f3 0f 1e fa             endbr64 
    1064:   50                      push   %rax
    1065:   58                      pop    %rax
    1066:   50                      push   %rax
    1067:   e8 e4 ff ff ff …
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly compiler-optimization undefined-behavior

4
推荐指数
2
解决办法
228
查看次数