Почему не делает GCC, производят предупреждение при присвоении литерала со знаком неподписанному типу?

Несколько вопросов на этом веб-сайте показывают ловушки при смешивании подписанных и неподписанных типов, и большинство компиляторов, кажется, делает хорошее задание о генерации предупреждений этого типа. Однако GCC, кажется, не заботится при присвоении константы со знаком неподписанному типу! Рассмотрите следующую программу:

/* foo.c */
#include <stdio.h>
int main(void)
{
    unsigned int x=20, y=-30;
    if (x > y) {
        printf("%d > %d\n", x, y);
    } else {
        printf("%d <= %d\n", x, y);
    }
    return 0;
}

Компиляция с GCC 4.2.1 как ниже продуктов никакой вывод на консоли:

gcc -Werror -Wall -Wextra -pedantic foo.c -o foo

Получающийся исполняемый файл генерирует следующий вывод:

$ ./foo
20 <= -30

Есть ли некоторая причина, что GCC не генерирует предупреждающего сообщения или сообщения об ошибке при присвоении значения со знаком -30 к переменной беззнаковых целых чисел y?

14
задан maerics 5 May 2010 в 08:19
поделиться

2 ответа

Use -Wconversion:

~/src> gcc -Wconversion -Werror -Wall -Wextra -pedantic -o signwarn signwarn.c
cc1: warnings being treated as errors
signwarn.c: In function 'main':
signwarn.c:5: error: negative integer implicitly converted to unsigned type

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

21
ответ дан 1 December 2019 в 08:52
поделиться

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

Что касается того, что выводит ваша программа ... Использование спецификатора формата % d для printf со значением без знака, выходящим за пределы диапазона типа int , приводит к в неопределенном поведении, что вы действительно наблюдали в своем эксперименте.

8
ответ дан 1 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: