2016-10-05 8 views
3

Во время проверки переполнения для short и char типа данных для операции добавления, утверждения вставленных Фрама-C являются, кажется, неправильно:Invalid утверждения для перелива проверки FRAMA-C

enter image description here

Для полукокса и короткие данные, максимальные положительные и отрицательные значения имеют тип целочисленных данных.

В чем причина этого?

ответ

1

Интегральные типов ранга меньше, чем int преобразуются в любом int или unsigned при использовании в арифметической операции (см C11 6.3.1.8 обычных арифметических преобразований). Вот почему вы видите отливку до (int) для x и y. Обратите внимание, что по умолчанию -rte не будет выдавать предупреждение для downcasts, так как они не являются неопределенным поведением (6.3.1.3§3 указывает, что подписанные downcasts определены реализацией и что реализация может поднять сигнал). Если добавить опцию -warn-signed-downcast, вы увидите утверждения вы, вероятно, искали, которые из-за актерскую в (char) результате:

/*@ assert rte: signed_downcast: (int)x+(int)y ≤ 127; */ 
/*@ assert rte: signed_downcast: -128 ≤ (int)x+(int)y; */ 

Обратите внимание, что если вы сохраните результат в междунар, как в

void main(void) { 
    char x; 
    char y; 
    int z; 
    x = 1; 
    y = 127; 
    z = x + y; 
    return; 
} 

Не будет предупреждающего предупреждения (но будут присутствовать предупреждающие предупреждения о переполнении).

 Смежные вопросы

  • Нет связанных вопросов^_^