C语言 是否有任何方法在eg中获得警告?GCC或Clang关于这个严格的混叠违反?



这是一个严格的混叠违反的理由是缓冲区已声明类型为char数组,并由指向struct

的指针
#include<string.h>
#include<stdalign.h>
#include<stdio.h>
struct thing {
int a;
char x;
};
int main() {
char alignas(struct thing) buffer[128];

struct thing s = {10,'a'};
struct thing *ptr = memcpy(buffer,&s,sizeof(struct thing));

// violation at ptr->a
printf("%dn",ptr->a);
return 0;
}

如果编译器对所有违反N1570 6.5p7约束的构造发出警告,则会对所有高质量实现都毫不费力地支持的构造发出大量警告。标准的这些部分有意义的唯一方式是,如果作者期望高质量的实现扩展语言的语义来支持用例,即使标准没有强制要求,他们也没有理由不支持这些用例。下面代码中的用例就是这样的一个例子。

尽管标准不会禁止实现使用N1570 6.5p7作为在对象只被用作单一类型存储的情况下进行无意义行为的借口,但规则的声明目的是描述实现是否需要允许指针混叠的可能性的情况。即使在存储仅用作单一类型的情况下,禁止存在问题的特定结构也无助于实现这一目标。如果代码在buffer上使用下标操作符,除了通过struct thing*访问存储之外,编译器可能无法识别使用后一个左值的访问可能与使用前一个左值的访问交互的可能性。然而,在本文的代码中,存储仅作为struct thing类型或通过memcpy使用,这是没有理由禁止的使用情况。以这样一种方式编写规则,只禁止在下标的情况下使用char[]来保存其他类型的数据,这肯定会增加复杂性,但不会期望编译器支持任何它们本来就不支持的结构。

如果标准打算将程序划分为正确的和不正确的,那么编写更详细的规则是值得的。因为它没有试图区分错误的构念和正确但"不可移植"的构念;(从某种意义上说,可能存在一些没有有意义地处理它们的实现),然而,没有必要尝试显式地识别和提供编译器没有理由不有意义地处理的所有构造。

相关内容

最新更新