GCC, функции и аргументы указателя, поведение предупреждений

Недавно я обновился до тестового дистрибутива, который теперь использует GCC 4.4.3. Теперь, когда я все настроил, я вернулся к кодированию и создал свой проект, и я получаю одно из этих ужасных сообщений:

*** glibc detected *** ./boxyseq: free(): invalid pointer: 0x0000000001d873e8 ***

Я абсолютно точно знаю, что здесь не так, но был несколько сбит с толку, когда увидел свой код C, где я вызываю функцию, которая освобождает динамически выделяемую структуру данных - я передал ей несовместимый тип указателя - указатель на совершенно другую структуру данных .

warning: passing argument 1 of 'data_A_free' from incompatible pointer type
note: expected 'struct data_A *' but argument is of type 'struct data_B *'

Я в замешательстве, потому что уверен, что раньше это было бы ошибкой, и компиляция никогда бы не завершилась. Не усложнит ли это жизнь программистам на C?

Могу ли я изменить его обратно на ошибку, не делая при этом целую кучу других ошибок предупреждений?

Или я теряю сюжет, и это всегда было предупреждением?


person James Morris    schedule 03.06.2010    source источник
comment
Я удалю этот вопрос, если он всегда был предупреждением!   -  person James Morris    schedule 03.06.2010
comment
если вы знаете, как сделать это, в частности, ошибку, пожалуйста, напишите. Это охвачено -педантическими-ошибками, но это шире.   -  person Matthew Flaschen    schedule 03.06.2010
comment
@ Мэтью, так это всегда было предупреждением? Если узнаю, напишу, но быстрый поиск через gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html ничего не обнаружил.   -  person James Morris    schedule 03.06.2010
comment
Нет, этого я тоже не знаю.   -  person Matthew Flaschen    schedule 03.06.2010


Ответы (2)


Это всегда было предупреждением. C позволяет вам неявно привести любой указатель к любому другому указателю, хотя любой приличный компилятор предупредит вас об этом.

Однако это ошибка в C++. Возможно, это то, о чем вы подумали?

В GCC вы можете превратить предупреждение в ошибку, используя -Werror=, но я не вижу возможности для этого конкретного предупреждения. Вы можете просто использовать -Werror, чтобы превратить все предупреждения в ошибки, но это может сделать больше, чем вы хотите.

person Daniel Stutzbach    schedule 03.06.2010

Это, безусловно, одна из вещей, которую обнаружит анализатор clang, поэтому вы можете сделать его ошибка сборки с clang.

person Andrew McGregor    schedule 03.06.2010
comment
Вы также можете сделать это ошибкой с gcc (-pedantic-errors). Вопрос в том, сможете ли вы избежать множества других ошибок предупреждений. - person Matthew Flaschen; 03.06.2010
comment
Eurrgghh, просто прочитайте страницу в Википедии об этом: его цель - предложить замену коллекции компиляторов GNU (GCC). Разработка спонсируется Apple... нет, спасибо. - person James Morris; 03.06.2010