【问题标题】:g++'s strict-aliasing warning accuracyg++ 的严格混叠警告准确性
【发布时间】:2018-05-17 16:13:21
【问题描述】:

GCC's documentation 表示-Wstrict-aliasing=3 是最准确的级别,较低的级别更有可能给出误报。

我认为以下示例都违反了严格的别名规则:

float violate1(float a_float)
{
    float * f_data(&a_float);
    int * i_data((int *)f_data);
    int value(*i_data);
    return value + a_float;
}

float violate2(float a_float)
{
    int * i_data((int *)&a_float);
    int value(*i_data);
    return value + a_float;
}

float violate3(float *f_data)
{
    int * i_data((int *)f_data);
    int value(*i_data);
    return value + *f_data;
}

然而,当使用-Wstrict-aliasing=1 时,g++ 只会对它们发出警告。 使用-Wstrict-aliasing=3 不会发出警告:https://godbolt.org/g/aox2S1

这些示例实际上不是违规行为,还是 GCC 的警告不是违规行为的可靠指示?

【问题讨论】:

  • fwiw 警告不能 100% 可靠,如果是,它们可能是错误
  • 那些是严格的别名违规。 3 更准确:误报更少,但漏掉了一些真阳性,1 得到更多真阳性,但也有更多误报。

标签: c++ gcc language-lawyer strict-aliasing


【解决方案1】:

严格别名规则在[basic.lval]中以非常明确的方式表述

如果程序尝试通过以下类型之一以外的左值访问对象的存储值,则行为未定义:

  • 对象的动态类型 [...]

这意味着violate1violate2 是同一件事,必然是违规行为。

一个对象指针can be casted 往返于另一个任意对象指针类型,结果是原始指针。在violate3 中,如果f_data 是先前转换为float*int*,则*i_data 不会违反,但*f_data 会违反

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2013-02-09
    • 2015-03-15
    相关资源
    最近更新 更多