С точки зрения адвоката выражение &(((struct name *)NULL)->b);
должно привести к UB, поскольку вы не смогли найти путь, в котором не было бы UB. ИМХО, первопричиной является то, что на мгновение вы применяете оператор ->
к выражению, которое не указывает на объект.
С точки зрения компилятора, предполагая, что компилятор не был сложным, он ясно, что выражение возвращает то же значение, что и offsetof(name, b)
, и я уверен, что при условии, что он скомпилирован без ошибки , любой существующий компилятор даст этот результат.
Как написано, мы не могли обвинить компилятор, который отметил бы, что во внутренней части вы используете оператор ->
для выражения, чем не можете указать на объект (поскольку он является нулевым) и выдавать предупреждение или ошибку.
Мое заключение заключается в том, что до тех пор, пока не будет специальный абзац, в котором говорится, что при условии, что он должен только принять свой адрес, это законно разыменовать нулевой указатель, это выражение не является законным C.