LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Просто gcc весьма пермиссивен.

Нет, это не пермиссивность, это специально заложенная фича. Её совершенно невозможно было бы сделать, просто скипнув какую-нить проверку. Удивление вызвано тем, что обычно такие штуки только в -std=gnuXX включаются а не в -std=cXX и тем что flexible arrays вообще (даже не статические) появились весьма позже чем c89.

Как поведут себя всякие санитайзеры и оптимизаторы не понятно

Всмысле «как поведут»? gcc сделал бинарник, инструментов которые что-то в нём после компиляции уже оптимизируют (кроме strip) я не видел, по крайней мере в хоть сколько-то широком использовании. А те, что в ходе компиляции - они часть gcc и разумеется они знают про эту штуку и никак ей не повредят.

Ну а сторонний статический анализатор наверно будет ругаться на инициализацию данных за пределами размера массива.

Размер типа не соответствует размеру твоих данных.

Прямо как в x = malloc(sizeof(*x)+datalen); которое штатное для flexible arrays.

Исходная версия firkax, :

Просто gcc весьма пермиссивен.

Нет, это не пермиссивность, это специально заложенная фича. Её совершенно невозможно было бы сделать, просто скипнув какую-нить проверку. Удивление вызвано тем, что обычно такие штуки только в -std=gnuXX включаются а не в -std=cXX.

Как поведут себя всякие санитайзеры и оптимизаторы не понятно

Всмысле «как поведут»? gcc сделал бинарник, инструментов которые что-то в нём после компиляции уже оптимизируют (кроме strip) я не видел, по крайней мере в хоть сколько-то широком использовании. А те, что в ходе компиляции - они часть gcc и разумеется они знают про эту штуку и никак ей не повредят.

Ну а сторонний статический анализатор наверно будет ругаться на инициализацию данных за пределами размера массива.

Размер типа не соответствует размеру твоих данных.

Прямо как в x = malloc(sizeof(*x)+datalen); которое штатное для flexible arrays.