jjzjj

strict-aliasing

全部标签

c++ - gcc:通过显式 memcpy 避免严格别名违规警告

我有一个占用64位内存的类。为了实现平等,我使用了reinterpret_cast,但它会在gcc7.2(但不是clang5.0)上导致此警告:$g++-O3-Wall-std=c++17-g-cexample.cppexample.cpp:Inmemberfunction‘boolX::eq_via_cast(X)’:example.cpp:27:85:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules[-Wstrict-aliasing]return*reinterpret_cast(this)=

c++ - G++:可以将 __attribute__((__may_alias__)) 用于指向类实例而不是类定义本身的指针吗?

我正在寻找以下问题的答案:may_alias是否适合作为指向某个类Foo对象的指针的属性?还是只能在类(class)级别使用?考虑以下代码(它基于更复杂的真实示例):#includeusingnamespacestd;#definealias_hack__attribute__((__may_alias__))templateclassFoo{private:/*alias_hack*/charData[sizeof(T)];public:/*alias_hack*/T&GetT(){return*((/*alias_hack*/T*)Data);}};structBar{intBaz

c++ - FlatBuffers 是否以某种方式避免了严格的别名?

我最近一直在研究FlatBuffers库。我正在寻找评估它以用于我的项目。看着flatbuffers.h,我想知道是否违反了strict-aliasingrule如果它确实考虑了严格的别名,有人可以解释它是如何做到的吗?在以前的项目中,我很难学到这个规则,优化会产生难以发现的细微错误。我一直在使用placementnewoperator避免使用编译器标志来解决这个问题。链接:flatbuffers.hstrict-aliasingruleplacementnewoperator 最佳答案 目前,读取FlatBuffer完全是只读的事

c++ - std::memcpy 或显式 char 值赋值 - 在 C++ 中相等且合法

在下面的示例中,uint32_t的值表示被复制到uint8_t数组。这是由std::memcpy完成的。据我了解C++标准,这是完全合法的:我们通过转换为unsignedchar*的T*访问类型为T的对象。没有别名问题,没有对齐问题。反之则不太明显。我们正在通过unsignedchar*访问T的对象表示,这是合法的。但是访问这个词包括改变吗?当然没有锯齿和对齐问题。然而,如果缓冲区s中的值来自外部来源,则会出现问题:我们必须确保正确的字节顺序并省略陷阱表示。可以检查正确的字节顺序,这样就可以解决。但是陷阱表示呢?我们怎样才能避免这种情况?或者uint类型没有陷阱表示而不是说double

c++ - 我试过 : valgrind, _GLIBCXX_DEBUG,-fno-strict-aliasing;我该如何调试这个错误?

我有一个非常奇怪的错误,我花了几天时间试图弄清楚,所以现在我想看看是否有人有任何意见可以帮助我理解发生了什么。一些背景。我正在从事一个软件项目,该项目涉及使用Boost1.45向Python2.7.1添加C++扩展,因此我的所有代码都通过Python解释器运行。最近,我对破坏了我们的回归测试之一的代码进行了更改。这个回归测试可能对数值波动过于敏感(例如不同的机器),所以我应该解决这个问题。但是,由于此回归在产生原始回归结果的同一台机器/编译器上发生故障,因此我将结果的差异追溯到这段数字代码(可证实与我更改的代码无关):c[3]=0.25*(-3*df[i-1]-23*df[i]-13*

c++ - 我什么时候可以打破别名规则?

我收到此警告。我想要定义的行为,但我想保持这段代码不变。我什么时候可以违反别名规则?warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules[-Wstrict-aliasing]String是我自己的字符串,它是一个POD。此代码是从C调用的。S可能是一个int。String几乎就是structString{RealString*s;}但模板化和辅助函数。我做了一个静态断言来确保String是一个pod,是4bytes和int是4bytes。我还写了一个断言,它检查所有指针是否>=NotAPtr。它在我的新

c++ - MSVC++ 限制关键字和局部变量

我已经阅读了很多关于restrict关键字的文章。但实际上,我能找到的每个示例似乎都只将输入参数引用到一个函数,也许还有一个值。我需要澄清我的理解。我发现一个函数看起来完全违反了带有输入参数和局部变量的关键字规则。此函数使用指向缓冲区的void*调用,指针声明为__restrict(这是MicrosoftVisualC++)。然而在函数的后面,声明了一个类型为UCHAR*的局部变量指针,并使其指向相同的受限输入参数缓冲区。这里是我正在谈论的函数的一个严重缩减版本:voidFoo(intnVersion,intnX,intnY,intnWidth,void*__restrictpBuff

c++ - 通过强制转换为 int 来访问原始内存是否违反了严格的别名?

假设我想为int动态分配空间,并将最大可表示值写入该内存。想到这段代码:autorawMem=std::malloc(sizeof(int));//rawMem'stypeisvoid**(reinterpret_cast(rawMem))=INT_MAX;//INT_MAXfrom此代码是否违反了C++关于strictaliasing的规则??g++和clang++都不会提示-Wall-pedantic。如果代码不违反严格的别名,为什么不呢?std::malloc返回void*,所以虽然我不知道std::malloc返回的内存的静态和动态类型是什么>是,没有理由认为两者都是int。而

c++ - 这符合严格的别名规则吗?

structTest{voiddoAction(){}};//Createandsaveintoavoid*void*ptr=newTest;//RealusethroughaTest*Test*t=static_cast(ptr);t->doAction();//Deletedeletestatic_cast(ptr);ptr只是用来保存对象的地址,地址只是解引用为对象的真实类型。所以除非它被取消引用到不相关的类型,否则它可以使用严格的别名规则吗? 最佳答案 严格别名仅适用于您尝试通过指针/引用访问对象时。您没有尝试通过void*

c++ - c++11 严格别名规则是否允许通过 char *、char(&)[N]、甚至 std::array<char, N>& 使用 -fstrict-aliasing -Wstrict-aliasing=2 访问 uint64_t?

根据this关于C++11/14严格别名规则的stackoverflow回答:Ifaprogramattemptstoaccessthestoredvalueofanobjectthroughaglvalueofotherthanoneofthefollowingtypesthebehaviorisundefined:thedynamictypeoftheobject,acv-qualifiedversionofthedynamictypeoftheobject,atypesimilar(asdefinedin4.4)tothedynamictypeoftheobject,atypet