c++ - 用其他语言编写的函数是否受关于 UB 的 C++ 规则的约束?

标签 c++ undefined-behavior language-lawyer

这个问题可能没有意义,但我还是会举个例子来问。此代码是否表现出未定义的行为?

int main() {
    int a, b; // uninitialised

    memcpy(&a, &b, sizeof(int));
}

我通常会说是,因为导致未初始化对象的左值到右值转换是 UB,必须将 b 的字节复制到 a.

但是,memcpy 可能会也可能不会在 C++ 中实现。例如,如果 memcpy 是用汇编编写的,则没有这样的规则。如果程序将违规操作外包给具有不同规则的其他语言,那么执行通常会导致未定义行为的程序是否仍然会导致未定义行为?

最佳答案

这有点像在问“在 C++ 中,过度烧焦牛排会导致未定义行为吗?”

所有未定义行为意味着 C++(或 C 等)标准不保证在翻译和/或执行程序时会发生什么。毫不奇怪,C++ 标准对其他语言的函数没有太多说明。

唯一有点相关的引用来自 7.4

The asm declaration is conditionally-supported; its meaning is implementation-defined.

从 7.5 开始

[In a linkage-specification syntax...] This International Standard specifies the semantics for the string-literals "C" and "C++". Use of a string-literal other than "C" or "C++" is conditionally-supported, with implementation-defined semantics.

所以基本上,可以将其他语言与 C++ 一起使用,但本文档不打算讨论这一点,除了将各个部分粘合在一起所必需的语法之外。

从 C++ 标准的角度来看,来自其他语言的函数对 C++ 程序具有实现定义的影响。实现定义的通常被认为比未定义的行为更好,尽管不可移植。但是,使用 C++ 和 C 以外的东西不一定可移植到每个 C++ 实现,这不足为奇。

关于c++ - 用其他语言编写的函数是否受关于 UB 的 C++ 规则的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739520/

相关文章:

c++ - 在分配器感知的 STL 类中,为什么分配器不是模板模板参数?

c++ - 如何使用不同类型的键搜索 std::map

c++ - 运行时错误-UndefinedBehaviourSanitizer

c++ - 在 push_back 被称为未定义行为后,正在将 std::span 用于 std::vector

c++ - 如何使用模板表达成员之间的约束?

python - 使用C++项目(Visual Studio)中的参数调用Python函数

c++ - 使用对 vector 的 vector ?

c - 以下哪些后自增和预自增运算符的组合在 C 语言中具有未定义的行为?

c++ - 标准引用 : Does an out of range call to `vector::operator[]` invoke Undefined Behavior?

c++ - 如何将字符串列表存储在 constexpr 上下文中?