是否有任何语义非保留优化的例子(FP 优化除外)?
Are there any examples of semantics non-preserving optimizations (except FP optimizations)?
认为优化具有语义保留属性。但是,浮点 (FP) 优化可能不会保留语义。通常这些 FP 优化是选择非严格 FP 模型的结果(示例:ICC, MSVC, GCC, Clang/LLVM, KEIL 等)。
出于好奇,有没有其他语义非保留优化的例子?
有的,但是你得费点功夫才能找到。
尝试替换标准库函数。如果它不执行标准库函数执行的操作,您可能会发现您的代码未执行您期望的操作,因为编译器假定标准库函数执行文档中所说的操作。
此外,mmap()
地址为零的区域。编译器可能会忽略访问它的代码,因为它假设代码是不可访问的,因为它取消引用 NULL 指针,从而导致未定义的行为。但是,如果 mmap()
调用成功,取消引用零(NULL 在大多数平台上为零)的行为就被定义了。 gcc
有一个编译器选项来告诉它停止这样做。 Clang 最终屈服于添加它的压力,因为否则它会错误编译内核。 https://reviews.llvm.org/D47894#change-z5AkMbcq7h1h
回到 90 年代,当别名规则刚刚开始成为事物时,有更多的例子,因为别名规则改变了语言的定义。但现在是well-settled。
认为优化具有语义保留属性。但是,浮点 (FP) 优化可能不会保留语义。通常这些 FP 优化是选择非严格 FP 模型的结果(示例:ICC, MSVC, GCC, Clang/LLVM, KEIL 等)。
出于好奇,有没有其他语义非保留优化的例子?
有的,但是你得费点功夫才能找到。
尝试替换标准库函数。如果它不执行标准库函数执行的操作,您可能会发现您的代码未执行您期望的操作,因为编译器假定标准库函数执行文档中所说的操作。
此外,mmap()
地址为零的区域。编译器可能会忽略访问它的代码,因为它假设代码是不可访问的,因为它取消引用 NULL 指针,从而导致未定义的行为。但是,如果 mmap()
调用成功,取消引用零(NULL 在大多数平台上为零)的行为就被定义了。 gcc
有一个编译器选项来告诉它停止这样做。 Clang 最终屈服于添加它的压力,因为否则它会错误编译内核。 https://reviews.llvm.org/D47894#change-z5AkMbcq7h1h
回到 90 年代,当别名规则刚刚开始成为事物时,有更多的例子,因为别名规则改变了语言的定义。但现在是well-settled。