strict-aliasing

    4热度

    2回答

    同时解决上http://cppquiz.org一个测试,我发现这个有趣的一段代码: #include <iostream> int f(int& a, int& b) { a = 3; b = 4; return a + b; } int main() { int a = 1; int b = 2; int c = f(a, a

    0热度

    1回答

    下载并解压wireshark 1.7.1后,我做了禁用gtk的配置。 但后来,我无法做“制造” 它会引发以下错误。 cc1:警告被视为错误 packet-h248_annex_e.c:679:警告:取消引用类型双击指针将打破严格别名规则。 有人可以帮助建立和安装这wireshark版本?

    7热度

    1回答

    当用gcc 4.7(g ++ - mp-4.7(GCC)4.7.0用OS X上的MacPorts构建)编译下面的代码时,我看到了矛盾的结果。 当我尝试将std::array的一部分重新解释并取消引用为uint32_t时,编译器没有抱怨,但它在使用C风格的数组时发生。 示例代码: #include <array> #include <cstdint> int main() { st

    3热度

    2回答

    我正在期待以下问题的答案:是may_alias适合指向某个类的某个对象的指针Foo?或者只能在课堂上使用? 考虑下面的代码(它是基于现实世界的例子是更复杂): #include <iostream> using namespace std; #define alias_hack __attribute__((__may_alias__)) template <typename T>

    12热度

    1回答

    C语言中的以下代码是否具有已定义的行为? int main() { const int i = 0; return *(int*)(&i); } 我问,因为6.5/7列出为一个有效的别名“与有效对象的类型兼容的类型的合格版本”。但对象的有效类型是const int,我不认为int是const int的合格版本(尽管情况正好相反)。 int和const int兼容(6.7.

    2热度

    3回答

    我在C中遇到严格的别名问题。我正在使用GCC 4.7.1。 实施例1: 当编译该代码与-fstrict走样-Wstrict混叠= 3我得到 “警告:提领类型-punned指针将打破严格走样规则” #include <stdio.h> #include <stdint.h> int main(void) { uint8_t a[4] = {0x01, 0x23, 0x45, 0x6

    1热度

    2回答

    我知道对于下面的代码,下面的“Illegal”是未定义的(虽然有些编译器允许),因为联合成员“a”是活动的,然后我们从工会会员“b”读取。 问题是,“AmILegal”中的代码是否可以修复它,还是我在做一些可怕的事情,甚至更加模糊?我可以使用memcpy来达到相同的效果,还是有另一个未定义的行为,我在那里调用? 编辑:也许这个例子不够清楚。我想要做的就是激活其他成员。 所以我改变float为int

    2热度

    2回答

    union { Uint32 Integer; Float32 Real; } Field; 我必须使用该联合的一个小小的IEEE技巧,这是否打破严格的别名? GCC不抛出任何警告(与GCC 4.5,甚至与迂腐严格别名4.6,但据我所知,GCC不是很好捕严格别名规则infringiments(大量的误报/阴性)尝试。 Field A; A.Integer = (Va

    1热度

    1回答

    我需要在程序中创建多个FIFO队列,用于同一进程中线程之间的通信。 我想我可以用管道()用于此目的,因为这样,我可以使用select或poll从队列中获取节点的线程上。 int* fd_pipe = (int*)malloc(2*sizeof(int)); pipe(fd_pipe); 现在的问题是如何把指针到队列 因为每个节点是strucutre,我希望把指针到队列中,像 的t

    4热度

    4回答

    在this answer的评论中说,使用像下面这样的联合将一个整数拆分为它们的字节是未定义的行为。在那个地方给出的代码虽然与此不相同,但是如果我更改了代码的未定义行为相关方面,请给出说明。 union addr { uint8_t addr8[4]; uint32_t addr32; }; 到现在为止我认为这将是罚款的方式做事情喜欢addr = {127, 0, 0, 1};,作为回报,