GCC, функции и аргументы указателя, поведение предупреждения - PullRequest
1 голос
/ 03 июня 2010

Я недавно обновил тестовый дистрибутив, который теперь использует 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 *'

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

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

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

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

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

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

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

0 голосов
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...