включение "разных уровней косвенности" предупреждение / ошибка в gcc - PullRequest
0 голосов
/ 19 сентября 2018

У нас есть тип дескриптора, объявленный как:

typedef void *config_h;

У нас есть функция, объявленная как:

void func(config_h hConfig);

Я назвал ее так:

config_h hConfig;
func(&hConfig);

Даже не предупреждение.Вещи, которые я не могу изменить в этом проекте: это C++11 и скомпилировано с -fpermissive.config_h typedef делается в файле, который также компилируется компиляторами C, кстати ..

Я посмотрел здесь: https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Похоже, -Wstrict-aliasing может быть билетом,но это не былоЯ получаю множество предупреждений о различных преобразованиях указателей, но не об этом.

Вопрос: «Какое самое узкое предупреждение (или предпочтительно ошибку), которое я могу включить, чтобы предотвратить эту проблему?»

Бонусный вопрос: Если подобные вещи сводят меня с ума, переключается ли на clang вероятность выплаты дивидендов?

1 Ответ

0 голосов
/ 20 сентября 2018

Как отметили несколько человек в комментариях (спасибо всем), даже различные уровни косвенности не учитываются, когда речь идет о void*.Я проверял это в других компиляторах.Итак, ответ на мой настоящий вопрос, лучше всего я могу сказать, что нет предупреждения или ошибки, которые могут быть включены, независимо от компилятора .

Тем не менее, если void*фактически указывает на конкретный тип, это относительно безболезненно, даже в очень больших решениях, чтобы очистить это.Я пошел с предварительным объявлением типов:

struct config_o;
typedef config_o* config_h;
//removed typedef void* config_h;

Я смог очистить около 40 типов дескрипторов в 200 000 строк кода значительно менее чем за 8 часов.Находил (и исправлял) несколько серьезных ошибок, пока я находился на нем, которые потребляли большую часть времени.

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