Заставить компилятор C выдавать предупреждение о сужении целых чисел - PullRequest
0 голосов
/ 18 января 2019

Давайте рассмотрим следующий пример:

#include <stdio.h>

void func(unsigned char c) {
   printf("0x%x\n", c);
}

int main() {
   int val = 0x11223344;
   func(val);
}

Насколько я знаю, нет возможности Я могу заставить gcc или clang показать предупреждение в утверждении func(val) о сужении int -> unsigned char это произойдет там. Даже не компилируя с -Wall -Wextra -pedantic. Вопрос касается, главным образом, C кода, но стоит также включить в обсуждение мир C++ (см. Примечание ниже).

C ++ Note

Мне хорошо известно, что в C++ существует своего рода обходной путь, использующий унифицированный синтаксис инициализации :

func({val});

Но это не решает мою проблему, потому что:

  • для ранее существовавшего кода, требуются изменения
  • для нового кода, потребуется {} везде

Вопрос 1

Есть ли какая-то загадочная опция для достижения этого при компиляции кода C или C++? Я в порядке и с нестандартным решением, если оно работает с gcc или clang, и оно не требует изменения кода. Примечание: Я не ищу хитрых C++ решений, использующих пользовательские целочисленные типы с макросами или без макросов, которые обертывают примитивные типы. Я ищу что-то вроде параметра командной строки или pragma. Опять же, вопрос в основном для кода C, но стоит также изучить любые решения C++.

Вопрос 2 (запасной вариант)

Если реальность окажется такой (как подозревается), такого решения не существует, мне было бы очень любопытно понять, почему. Я не могу поверить, что такой вариант просто никогда не рассматривался как реализованный. Должен быть список разумных аргументов против этого, о котором я просто не могу придумать. Но дело в том, что опция может быть просто нестандартной, как -fwrapv, и люди могут использовать ее только там, где она действительно нужна.

1 Ответ

0 голосов
/ 18 января 2019

Является ли -Wconversion тем, что вы ищете?

Вы можете увидеть поведение здесь , со множеством случаев.

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