これが私のコードです:
#include <string.h>
#include <stdio.h>
typedef char BUF[8];
typedef struct
{
BUF b[23];
} S;
S s;
int main()
{
int n;
memcpy(&s, "1234567812345678", 17);
n = strlen((char *)&s.b) / sizeof(BUF);
printf("%d\n", n);
n = strlen((char *)&s) / sizeof(BUF);
printf("%d\n", n);
}
gcc 8.3.0または8.2.1を最適化レベル以外で使用すると-O0
、0 2
期待していたとおりに出力されます2 2
。コンパイラは、strlen
がに制限されb[0]
ているため、除算される値と同じかそれ以上になることはないと判断しました。
これは私のコードのバグですか、コンパイラのバグですか?
これは明確に規格に明記されていませんが、ポインターの来歴の主流の解釈は、どのオブジェクトX
でも、コード(char *)&X
は全体を反復できるポインターを生成するべきだと思いましたX
-この概念はX
たまたま持っていても成り立つはずです内部構造としてのサブ配列。
(ボーナス質問、この特定の最適化をオフにするgccフラグはありますか?)
2 2
さまざまなオプションでレポートします。
s.b
に限定されるb[0]
ヌル文字はここで、ある場合には(1)アウトオブバウンドアクセス8非ヌル文字がある、UBである、(2)それは8つの文字に限定されず、従って二つのオプションていますlenは8未満なので、8で割るとゼロになります。したがって、(1)+(2)コンパイラを