【问题标题】:Berkley Sockets, breaking aliasing rules?Berkley Sockets,打破了别名规则?
【发布时间】:2013-08-01 08:11:57
【问题描述】:

我问自己,我可以使用带有严格别名的 BSD 套接字,而不会通过使用 gcc 编译得到未定义的行为吗?

bind(sdListen, (struct sockaddr*)&sockaddr_inIdentifier, sizeof(sockaddr_inIdentifier))

据我所知,这行代码打破了严格的别名规则(并且 gcc 给了我同样的警告)。 那么是否有一个计划 b,在 O3 模式下使用套接字而不进行严格混叠? 当然,在不违反规则的情况下? 还是我必须运行一个可以在所有系统/编译器上运行的自己的套接字系统?

【问题讨论】:

    标签: c sockets gcc strict-aliasing


    【解决方案1】:

    该行中的转换本身不会违反严格的别名规则。仅当 bind() 的实现取消引用该指针而不将其转换回正确的类型时,该规则才会被打破。

    任何严格的别名问题都是bind()的实现者的问题,而不是用户的问题。

    【讨论】:

    • 那么在遵守严格别名规则的同时,没有办法使用套接字吗?什么结果,我不能让编译器优化我的源代码,而没有未定义行为的风险?
    • @Zaibis:使用 BSD Sockets 不需要打破严格的别名规则。此外,您平台的套接字 API 的实现者可能已经费心确保实现也定义了行为。
    • 好吧,我现在在 freeBSD10.0 9.1 和 Debian 6 上尝试过。不知道...用 gcc 编译时结果是一样的。所以我说得对吗,Bind() 内部发生的事情决定演员是否会违反规则?并且从外部 gcc 只是告诉我它可能违反规则?所以我不能编译一个将警告视为错误的 BSD 套接字应用程序的代码,因为没有办法避免这个警告?
    • @Zaibis:是的,没错——警告告诉你一个潜在的问题。最新版本的 glibc 至少使用透明联合来定义避免警告的 struct sockaddr * 参数。
    • 但是我所做的所有研究都指出,从 &sockaddr_in 到 struct sockaddr* 的转换已经违反了规则,导致未定义的行为,所以即使 API我的平台只是将它转换回内存地址的类型,它不会改变这样一个事实,即理论上,地址内可能已经有其他任何东西,因为它没有定义会发生什么......或者我明白了在我最后几天所做的所有研究之后错了吗?:x
    猜你喜欢
    • 2011-03-03
    • 2012-04-04
    • 2015-02-15
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多