undefined-behavior 相关问题

编译或执行打破语言规则的程序的不可预测的结果,编译器,解释器和运行时系统都不得强制执行。

如何安全地打破严格的别名规则?

已知以下示例违反了严格的别名规则,因此在经过优化和未经优化的情况下会产生不同的结果: int foo( 浮点数 *f, int *i ) { *我= 1; ...

回答 1 投票 0

与 C 相比,C++ 中无副作用的无限循环的好处是未定义行为?

在 C++ 循环中为 为了(;;) {} 是未定义的行为,但它们不在 C 中? 在 https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2809r0.html 中表示有充分的理由

回答 2 投票 0

这是定义的行为吗?

#包括 #包括 void Print(const char* s) { std::cout << s << std::endl; } std::string GetString() { std::str...

回答 1 投票 0

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

在 C++ 循环中为 为了(;;) {} 是UB,而不是C? https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2809r0.html 中表示这样做有充分的理由。是...

回答 1 投票 0

计算 Fenwick 树/二元索引树 (BIT) 中的索引

Fenwick树数据结构需要一个成员函数read。对于索引 idx,read 必须计算几个索引 idx[0]、idx[1]、idx[2]、...、idx[last]。每个 idx[i] 将是结果的值...

回答 1 投票 0

你能确保C++中有符号整数算术的溢出包装行为吗?

在 C++ 中,无符号整数类型在以换行形式执行算术时具有明确定义的溢出行为。有符号整数类型没有,并且溢出行为是明确未定义的并且......

回答 1 投票 0

左移和右移负整数定义行为吗?

我知道,右移负号类型取决于实现,但是如果我执行左移怎么办?例如: 整数 i = -1; 我<< 1; Is this well-defined? I think the standard...

回答 3 投票 0

Kubernetes 在重启 Pod 之前会发送信号吗?

Kubernetes 在终止 pod 之前向 pod 中的容器发送 SIGTERM 信号 重启 Pod 时是否会发送类似的信号?

回答 1 投票 0

当优化关闭时,任何流行的编译器都会利用未定义的行为吗?

此博客声称: 未定义的行为仅在高优化级别(例如 -O2 或 -O3)下“发生”。 如果我使用 -O0 之类的标志关闭优化,那么就没有 UB。 是...

回答 2 投票 0

是否定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

是否定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗? 或者几乎等价地,对象定义中的 , 是否引入了一个序列点,就像 expre 中的逗号运算符一样...

回答 1 投票 0

当循环变量在溢出时未定义时,可以进行哪些优化?

本文提供了一个 C 代码示例片段,由于循环计数器类型未定义溢出,编译器可以对其进行优化。 这是带有注释的片段...

回答 1 投票 0

尝试理解 C++ 中的 --x 与 x--

我正在尝试评估这一点,即使它很简单,我似乎无法理解它。我得到了 16,但提供的答案是 12。我不明白这怎么可能是 12。我首先做了 --x,所以先 y

回答 1 投票 0

按整数大小进行位移时,5 位和 6 位分别是多少?

我特指的是这篇文章的这一部分 过大的移位量:将 uint32_t 移位 32 位或更多位是未定义的。我的猜测是,这源于潜在的转变

回答 2 投票 0

`UnsafeCell` 在没有锁定的情况下跨线程共享 - 这可能会导致 UB,对吗?

考虑以下代码: 使用 std::{cell::UnsafeCell, io, net::TcpStream,sync::Arc}; 使用native_tls::TlsStream; #[导出(调试)] pub 结构 TcpStreamRecv(Arc 考虑以下代码: use std::{cell::UnsafeCell, io, net::TcpStream, sync::Arc}; use native_tls::TlsStream; #[derive(Debug)] pub struct TcpStreamRecv(Arc<UnsafeCell<TlsStream<TcpStream>>>); unsafe impl Send for TcpStreamRecv {} unsafe impl Sync for TcpStreamRecv {} impl io::Read for TcpStreamRecv { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { unsafe { &mut *self.0.get() }.read(buf) } } #[derive(Debug)] pub struct TcpStreamSend(Arc<UnsafeCell<TlsStream<TcpStream>>>); unsafe impl Send for TcpStreamSend {} unsafe impl Sync for TcpStreamSend {} impl io::Write for TcpStreamSend { fn write(&mut self, buf: &[u8]) -> io::Result<usize> { unsafe { &mut *self.0.get() }.write(buf) } fn flush(&mut self) -> io::Result<()> { unsafe { &mut *self.0.get() }.flush() } } pub fn tcp_split(stream: TlsStream<TcpStream>) -> (TcpStreamSend, TcpStreamRecv) { let inner = Arc::new(UnsafeCell::new(stream)); let send = TcpStreamSend(inner.clone()); let recv = TcpStreamRecv(inner); (send, recv) } 我的推理如下: 安全代码可以获得具有相同底层 TlsStream 的 TcpStreamSend 和 TcpStreamRecv。 如果每个都发送到单独的线程,则可以同时调用 TcpStreamSend::write 和 TcpStreamRecv::read。这些函数中的每一个都会获得对底层 TlsStream 的 &mut 引用。 因此,由于同时拥有 2 个可变引用是非法的,因此这段代码可能会导致 UB,应该被认为是不健全的。这是正确的吗? 我的同事向我保证“如果它有效,它就有效”,并且代码确实在大多数情况下都可以正常运行,除了一些随机的偶尔的恐慌之外。然而,根据我的理解,它可能会在我们的代码库中的任何地方导致不可预测的问题,应该立即重写。我错过了什么吗? 顺便说一句,我做了一些研究,代码似乎受到了这个SO答案的启发,它更复杂,但是,据我所知,同样糟糕。 绝对不健全。 在 Rust 中同时存在两个重叠的 &mut 引用是未定义的行为,如果两个线程同时调用 read 和 write,就会发生这种情况。即使对于非线程代码来说这也是一个问题 - Rust 假设没有 &mut 引用可以别名。 在没有锁的情况下分割TlsStream是不可能的。即使 TcpStream 中的读取和写入实现是独立的,TlsStream 也可能需要根据来自服务器的消息更改其写入方式(例如重新生成密钥),这将要求读取器更改写入器使用的状态。

回答 1 投票 0

太早输入会导致故障吗?

假设我的Python代码如下所示: 而(真): 变量=输入() 做一点事 我注意到,当我从 Windows 提示符运行此命令时,我可以在“执行某些操作”仍然存在时提供输入

回答 0 投票 0

使用声明并初始化但未定义的变量是否是未定义行为?

在 C++ 中,你可以在 c.h 中声明一个 C 类,其中包含 static const int var = 3; 的声明和初始化。 C类{ 民众: ... 静态常量 int var = 3 ... }; 除非你...

回答 2 投票 0

通过C函数调用抛出C++异常

我有三个免费功能:F0、F1和F2。 F0 调用 F1,F1 又调用 F2。 F0 和 F2 是 C++ 函数,而 F1 是 C 函数。 F2 通过以下方式暴露给 F1:extern "C" 每个的代码...

回答 2 投票 0

C++ 抗锯齿和 UB

我正在审查一些代码(无法发布全部代码),但是有一个这样的函数: 模板 内联无效transferDataAndUpdateSpan(MyArray 我正在审查一些代码(无法发布全部代码),但是有一个像这样的函数: template <typename DestType, typename SourceType> inline void transferDataAndUpdateSpan(MyArray<DestType>& to, MySpan<const SourceType>& source) { static_assert(sizeof(DestType) == sizeof(SourceType), "Data size mismatch!!"); to.resize(source.size()); memcpy(to.data(), source.data(), sizeof(SourceType) * source.size()); source = { (SourceType*)to.data(), to.size() }; } MySpan 基本上是 std::span 的 typedef,而 MyArray 是一个容器,它有一个构造函数,该构造函数接收指向数据的指针和数据大小。 问题:source = { (SourceType*)to.data(), to.size() }; 是否打破了严格的别名? 这是触发UB吗? 看这段代码: to.resize(source.size()); memcpy(to.data(), source.data(), sizeof(SourceType) * source.size()); 您分配了 source.size(),但您复制了 sizeof(SourceType) * source.size()。显然比您分配的多 sizeof(SourceType) 倍。我期望这里会出现未定义的行为。因此,您会溢出分配的内存,并且您可能会从未分配的源进行复制。 这是我看到的修复方法 to.resize(source.size()); memcpy(to.data(), source.data(), source.size()); 好吧,这只是问题的一半。您还可以从一种类型复制到另一种类型。我预计这里也会有很多问题。

回答 1 投票 0

T 类型的左值必须标识 T 类型的对象吗?如果 `p` 的类型为 `*T`,那么 `&*p` 是否需要 `p` 实际指向 `T` 类型的对象?

在 C++ 中,给定 ST *p,*p 产生一个左值 (expr.unary.op#1),如果静态类型 ST 是原始类型,将 *p 转换为右值实际上访问和读取 *p (conv.lval , basic.lval#11).但是假设...

回答 0 投票 0

类型 T 的左值必须标识类型 T 的对象吗?如果 `p` 的类型为 `*T`,那么 `&*p` 是否需要 `p` 实际指向 `T` 类型的对象?

在 C++ 中,给定 ST *p,*p 产生一个左值 (expr.unary.op#1),如果静态类型 ST 是原始类型,将 *p 转换为右值实际上访问和读取 *p (conv.lval , basic.lval#11).但是假设...

回答 0 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.