- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
<分区>
在gcc-strict-aliasing-and-casting-through-a-union我问是否有人遇到过通过指针进行 union 双关的问题。到目前为止,答案似乎是否。
这个问题的范围更广:您有关于 gcc 和严格别名的任何恐怖故事吗?
背景:引自AndreyT's answer in c99-strict-aliasing-rules-in-c-gcc :
"Strict aliasing rules are rooted in parts of the standard that were present in C and C++ since the beginning of [standardized] times. The clause that prohibits accessing object of one type through a lvalue of another type is present in C89/90 (6.3) as well as in C++98 (3.10/15). ... It is just that not all compilers wanted (or dared) to enforce it or rely on it."
好吧,gcc 现在敢于这样做,它有 -fstrict-aliasing
开关。这导致了一些问题。例如,参见优秀文章 http://davmac.wordpress.com/2009/10/关于一个 Mysql 错误,以及 http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html 中同样出色的讨论.
其他一些不太相关的链接:
那么重复一遍,你有自己的恐怖故事吗? -Wstrict-aliasing
指示的问题不当然是首选。也欢迎其他 C 编译器。
6 月 2 日添加:Michael Burr's answer 中的第一个链接,确实可以算作恐怖故事,但可能有点过时(自 2003 年起)。我做了一个快速测试,但问题显然已经消失了。
来源:
#include <string.h>
struct iw_event { /* dummy! */
int len;
};
char *iwe_stream_add_event(
char *stream, /* Stream of events */
char *ends, /* End of stream */
struct iw_event *iwe, /* Payload */
int event_len) /* Real size of payload */
{
/* Check if it's possible */
if ((stream + event_len) < ends) {
iwe->len = event_len;
memcpy(stream, (char *) iwe, event_len);
stream += event_len;
}
return stream;
}
具体的投诉是:
Some users have complained that when the [above] code is compiled without the -fno-strict-aliasing, the order of the write and memcpy is inverted (which means a bogus len is mem-copied into the stream).
编译代码,在 CYGWIN wih -O3 上使用 gcc 4.3.4(如果我错了,请纠正我——我的汇编程序有点生疏了!):
_iwe_stream_add_event:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
movl 8(%ebp), %eax # stream --> %eax
movl 20(%ebp), %edx # event_len --> %edx
leal (%eax,%edx), %ebx # sum --> %ebx
cmpl 12(%ebp), %ebx # compare sum with ends
jae L2
movl 16(%ebp), %ecx # iwe --> %ecx
movl %edx, (%ecx) # event_len --> iwe->len (!!)
movl %edx, 8(%esp) # event_len --> stack
movl %ecx, 4(%esp) # iwe --> stack
movl %eax, (%esp) # stream --> stack
call _memcpy
movl %ebx, %eax # sum --> retval
L2:
addl $20, %esp
popl %ebx
leave
ret
对于迈克尔回答中的第二个链接,
*(unsigned short *)&a = 4;
gcc 通常(总是?)会发出警告。但我相信一个有效的解决方案(对于 gcc)是使用:
#define CAST(type, x) (((union {typeof(x) src; type dst;}*)&(x))->dst)
// ...
CAST(unsigned short, a) = 4;
我已经在 gcc-strict-aliasing-and-casting-through-a-union 中询问过这是否可以, 但到目前为止没有人不同意。
我编写了一个程序,它在已安装的 USB 设备上创建一个文件。这可以通过 RS232 连接使用基于文本的 UI 来完成。然而,似乎有些不对劲。 5 次中有 1 次,写入 USB 设备的整个过程失败,我得
我知道我在这里做错了,但我希望你能在这方面提供帮助 我有这个html代码 some text this is what I would like to grab some more text 所
我想使用 Google Places API,但我一直收到 Request_Denied。我进入了 Google API 控制台,打开了 google places API。我的代码是这样的:
我的css边距不符合我想要或期望的方式。我好像我的页眉页边距顶部影响周围的div标签。 这就是我想要和期望的: ...但这就是我的最终结果: 资源: Margin test body {
我的css边距不符合我想要或期望的方式。我好像我的页眉页边距顶部影响周围的div标签。 这就是我想要和期望的: ...但这就是我的最终结果: 资源: Margin test body {
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 2 年前。 我的 CSS 边距没有按照我想要或期望的方
我有一个按字母顺序返回列表的脚本,如下所示 Apple Banana Blackberry Blueberry
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 2 年前。 我的 CSS 边距没有按照我想要或期望的方
我还看到了其他一些解决这个主题的问题,但没有一个像我的。昨天我天真地在设备列表中添加了一个设备。 问题: 我的印象是,一旦您添加了设备,它就会链接到配置文件。但是,我相信它没有链接到我的分发配置文件之
我是一名优秀的程序员,十分优秀!