问题标签 [strict-aliasing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 严格别名是 c 还是 c++ 的东西?
在 ISO/IEC 9899:TC2 中,标准规定如下
6.3.2.3 指针
- 指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针。如果结果指针未正确对齐指向的类型,则行为未定义。否则,当再次转换回来时,结果将等于原始指针。当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。结果的连续增量,直到对象的大小,产生指向对象剩余字节的指针。
因此,从标准中不清楚可以将一种类型的指针转换为另一种类型的指针。
c++ - 我是否正确理解 C/C++ 严格别名?
我读过这篇关于 C/C++ 严格别名的文章。我认为这同样适用于 C++。
据我了解,严格别名用于重新排列代码以进行性能优化。这就是为什么两个不同类型的指针(在 C++ 情况下是不相关的)不能引用相同的内存位置。
这是否意味着只有修改内存才会出现问题?除了内存对齐可能存在的问题。
例如,处理网络协议或反序列化。我有一个字节数组,动态分配并且数据包结构正确对齐。我可以把reinterpret_cast
它放到我的数据包结构中吗?
c++ - c++ 严格的别名问题---快把我逼疯了
好的......我有点绝望地试图让这段代码在打开严格别名(和-O3)的情况下工作。
我无法缩短代码(对不起......)所以它相当长〜170行......
问题很容易描述:它可以在没有 -fstrict-aliasing 的情况下工作并打破它。
“休息”是指“崩溃”。请帮助我让它在两种情况下都能正常工作:P
谢谢!!!提前(我已经尝试了几个小时......)
编辑:
它崩溃了。
基本上我不知道可能出了什么问题,所以我试图通过取消代码路径并重试来缩小范围......但这并没有把我带到任何地方。
编辑:添加了一些评论
c++ - 这是删除别名警告UB的技巧吗?
我们刚刚将编译器升级到 gcc 4.6,现在我们收到了一些警告。目前我们的代码库还没有处于使用 c++0x 编译的状态,无论如何,我们不想在 prod 中运行它(至少现在还没有) - 所以我需要修复来删除这个警告。
警告通常是由于以下原因而发生的:
稍后,这是通过以下方式使用的
例如,要读取、更新和返回,曾经发生过以下转换
4.4 没问题;在 4.6 中,上述生成:
警告:类型双关指针会破坏严格的别名规则
现在消除此错误的一种干净方法是使用 a union
,但是就像我说的那样,我们不能使用 c++0x (因此不能使用不受限制的联合),所以我使用了下面可怕的 hack - 现在警告已经消失,但是我可能会调用鼻守护程序吗?
这似乎可以正常工作(请参见此处的简单示例:http ://www.ideone.com/9p3MS )并且不会产生任何警告,在 c++0x 之前使用它是否可以(不是在风格上)?
注意:我不想-fno-strict-aliasing
一般使用...
编辑:看来我弄错了,4.4 版也有同样的警告,我想我们最近才发现这个变化(它总是不太可能是编译器问题),但问题仍然存在。
编辑:进一步调查产生了一些有趣的信息,似乎在一行中进行强制转换和调用成员函数是导致警告的原因,如果代码分为如下两行
这实际上不会产生警告。结果,我在 ideone 上的简单示例存在缺陷,更重要的是,我上面的 hack 没有修复警告,修复它的唯一方法是将函数调用与强制转换分开 - 然后强制转换可以保留为reinterpret_cast
.
c - C 内存分配器和严格别名
即使在阅读了很多关于严格别名规则的内容之后,我仍然感到困惑。据我了解,不可能实现遵循这些规则的合理内存分配器,因为 malloc 永远不能重用释放的内存,因为内存可用于在每次分配时存储不同的类型。
显然这是不对的。我错过了什么?您如何实现遵循严格别名的分配器(或内存池)?
谢谢。
编辑:让我用一个愚蠢的简单例子来澄清我的问题:
gcc - gcc 4.4.4 优化错误仅适用于 O1 或 O2+no-strict-aliasing
Post-Answer-Acceptance 摘要:问题在于使用了指向超出范围的堆栈变量的指针。它与优化无关。可惜valgrind找不到堆栈错误……
我有一个仅在 gcc 4.4.4(CentOS 5.5)中启用 -O1 级别优化时出现的段错误。所有其他优化级别(0,2,3,s)都很好。我还没有设法为它创建一个简化的测试用例,但它似乎与导致堆栈被覆盖的数组偏移计算有关。
如果我启用 -O1 并禁用所有具有标志(http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)的优化,错误仍然会发生。
如果我使用 -O2 (或任何其他级别)没有问题。如果我使用 O2 并禁用严格混叠,-fno-strict-aliasing
则段错误会返回。
编辑:如果我添加-fstack-protector-all
到构建标志(O1
或者O2 -fno-strict-aliasing
),段错误就会消失。
因此,这似乎是由 O1 中默认发生的优化引起的,该优化被严格混叠禁用。
我怀疑这是一个编译器错误(但如果没有减少的测试用例,我无法证明它)。这是一个需要快速周转的生产服务器。正常的优化级别是 O1,我不愿意将其更改为 O2,因为看起来修复可能比原始问题更危险。
我真的很感激一些建议。目前我正在考虑尝试编译 gcc 4.4.6 并查看是否可以修复它。但是,不确定是什么导致了问题,这有点令人担忧。
编辑:服务器是用-Wall -Werror
(和其他一些)编译的。它在 valgrind 中运行没有错误(valgrind 检查堆访问,这似乎是与堆栈相关的错误)。
c++ - 奇怪的 C++ 严格别名警告
以下是我的代码的精简版本,用于类似unique_pointer
的类实现,但仍然存在问题:
使用用 编译的 g++ 4.4.3 -O2 -fstrict-aliasing -Wstrict-aliasing
,我得到:dereferencing pointer <anonymous> breaks strict-aliasing rules
在上面标记的行上。这恰好在 Ubuntu 64 位系统上。如果我在 Mac OS X Lion 上使用 g++ 4.6.1 编译相同的代码,我不会收到任何警告。
我一般理解严格的别名规则(或者我认为),但我不明白为什么它抱怨有问题的行。
g++ 4.4.3 错了吗?假设它是正确的,我该如何调整代码以消除警告,即不违反严格的别名规则?
c++ - Boost - 在构建时关于取消引用指针的警告
我正在关注 Boost 网站上的“入门”教程。我正在尝试使用以下命令构建单独编译的库:
进而
在构建过程中,我收到了很多(比如数百个)警告:
我想知道这是否是我这边的问题,我是否可以做些什么来摆脱这些警告?
谢谢。
(升压 1.48,Ubuntu 10.04.3 LTS)
c++ - 在 g++ 中启用严格的别名警告
在 g++ 中启用严格别名警告的正确方法是什么?VC++ 10 是否实现了这些规则?
c++ - 对 gcc 4.6.1 错误的严格别名警告
我正在尝试在 gcc 上编译以下内容-pedantic-errors -pedantic -Wall -O2
但我没有看到任何严格的别名警告。我也尝试过启用
但仍然没有警告。这是一个错误吗?