Что означает это предупреждение о шине и что я могу делать неправильно?

Это строка кода:

bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[2]);

Запуск splint 3.1.2 генерирует это предупреждение:

cpfs.h:21:74: Function parameter times declared as manifest array (size
                 constant is meaningless)
  A formal parameter is declared as an array with size.  The size of the array
  is ignored in this context, since the array formal parameter is treated as a
  pointer. (Use -fixedformalarray to inhibit warning)

Название параметра не имеет значения.


person Matt Joiner    schedule 07.09.2010    source источник


Ответы (2)


Это означает, что когда вы объявляете параметр struct timespec const[2], 2 между [ и ] не требуется. Изменение кода на:

bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[]);

В C/C++ вы не можете запрашивать массив определенного размера в качестве параметра, потому что массив обрабатывается как указатель, а указатели не имеют размеров.

person Alexander Rafferty    schedule 07.09.2010
comment
Я не знаю, является ли придирка к апострофу сделанной вещью на SO, но вы, вероятно, имеете в виду указатели, как во множественном числе от указателя, а не указателя, как что-то, принадлежащее указателю. В любом случае сделайте апмод. - person Jack Kelly; 07.09.2010
comment
Это не кажется правильным. У меня всегда было впечатление, что массивы фиксированного размера на самом деле передаются по значению. Небольшой момент: это C, а не C++. - person Matt Joiner; 07.09.2010
comment
Если вы хотите передать значение, вы можете обернуть его в struct. - person Jack Kelly; 07.09.2010
comment
@Alexander Rafferty: Можете ли вы дать ссылку на документ, показывающий, что массивы фиксированного размера превращаются в указатели при использовании в качестве параметров? Я предполагаю, что это не относится к возвращаемым значениям (где это действительно важно). - person Matt Joiner; 07.09.2010
comment
@Matt: см., например. Часто задаваемые вопросы по C. Вы также не можете возвращать массивы по значению. - person Georg Fritzsche; 07.09.2010
comment
@Matt: Объявление функции с возвращаемым типом, который является типом массива, является незаконным, и даже если бы это было не так, вы никогда не смогли бы успешно передать массив в return, поскольку он всегда будет распадаться на указатель на его первый элемент. - person caf; 07.09.2010
comment
@Jack Kelly re apostrophe nit ... поскольку вы спрашиваете, подход SO к такого рода гнидам (заимствование фразы из известной вики) состоит в том, чтобы быть смелым и просто исправить это, если у вас достаточно представителей, чтобы отредактировать это. Если нет, терпение, как правило, приведет к тому, что пользователь с достаточной репутацией исправит это. Таким образом, большинство разбитых окон можно починить без особых хлопот. - person RBerteig; 07.09.2010
comment
@RBerteig: Спасибо. Теперь я знаю. - person Jack Kelly; 07.09.2010
comment
Я знаю, что это педантично, но если кто-то захочет связать этот ответ или связать в другом ответе часть спецификации C99, указывающую, что массивы деградируют до указателей в возвращении/параметрах, я был бы очень признателен. Беглое прочтение C FAQ/N1256 ничего убедительного не обнаружило. - person Matt Joiner; 07.09.2010
comment
Ссылка C99, о которой вы спрашивали, - это пункт 6.7.5.3/1 (тип возвращаемого значения, который является типом массива, запрещен) и 6.7.5.3/7 (параметр типа массива изменен на тип указателя) - person Bart van Ingen Schenau; 07.09.2010

В C99 (поскольку вы используете bool) у вас есть возможность потребовать минимальную длину массива параметров, добавив static вот так

bool cpfs_utimens(struct Cpfs *, char const *path, struct timespec const[static 2]);

подпись (если такая вещь есть в C) по-прежнему является сигнатурой параметра-указателя, подумал.

(Кроме того, я пока не знаю ни одного существующего компилятора, который делал бы что-то разумное из этой информации.)

person Jens Gustedt    schedule 07.09.2010
comment
@Matt Joiner: по крайней мере gcc реализует синтаксическую часть ;-) я думаю, настоящий тест для этого трудно реализовать. Вам придется либо обрабатывать какой-то инвариант (is larger than) для указателей, либо строго ограничивать объекты массива правильного размера. - person Jens Gustedt; 08.09.2010