2015-09-04 9 views
1

У меня небольшая проблема, когда я пытался запустить свой простой код в Frama-c. Я пытаюсь создать действительный указатель на структуру массива и вернуть этот указатель из моей функции Stack_init. Я не понимаю, почему Frama-с возвращает эту ошибку и не доказать свою функцию:Образец Frama-c несовместим с типом

[kernel] preprocessing with "gcc -C -E -I. /home/federico/Desktop/simple_main_v2.c" 
[kernel] warning: Neither code nor specification for function malloc, generating default assigns from the prototype 
[wp] Collecting axiomatic usage 
[wp] warning: Missing RTE guards 
Desktop/simple_main_v2.c:28:[wp] warning: Cast with incompatible pointers types (source: sint8*) (target: sint32*) 
[wp] 0 goal scheduled 

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

Может кто-нибудь помочь мне понять, где моя ошибка?

/* 
    create_stack 

     Inputs: none 
     Outputs: S (a stack) 
     Preconditions: none 
     Postconditions: S is defined and empty 
*/ 

/*@ 
    ensures \valid(\result) && \result[0] == 0; 
*/ 
int *Stack_Init() 
{  
    int *stack = malloc (sizeof(int[100])); 
    stack[0] = 0;    
    return stack;    
} 
+1

Включите ? – billpcs

+0

спасибо за ваш ответ, к сожалению, да, я включил библиотеку (чуть выше раздела кода я отправляю – FedeXu

ответ

-1

Этот код в основном правильный. Вы, вероятно, следует добавить бросок к возвращению из таНос (обязательное в C++), но от того, что я помню о C это необязательно:

int * stack = (int*) malloc(sizeof(int[100]); 

и не забудьте заголовке stdlib.h

+0

На самом деле мы не должны отливать результат 'malloc'. – ameyCU

+0

Да, поскольку это указатель' void', приведение не является обязательным (в C, не знаю о C++). –

+0

Почему бы вам не захотеть вернуть кота из malloc. Если вы этого не сделаете, то complier сделает это за вас в любом случае. – resigned

2

У Вас нет ошибки.

предупреждение: Cast с несовместимыми указатели типов (источник: sint8 *) (цель: sint32 *)

Это нонсенс.

  • Прежде всего, в коде отсутствует листинг. Литые и конверсия это разные вещи. Вы надеетесь, что люди, которые пишут такие продвинутые вещи, как статические анализаторы, знают разницу ...
  • Здесь нет sint8*. malloc возвращает void*, который является уникальным типом.
  • Указатели Void гарантированно преобразуются в любой тип указателя без каких-либо явных приемов.
  • Вам необходимо включить stdlib.h. Инструмент должен сказать вам, что функция не объявлена ​​прототипом, если вы ее забыли. Казалось бы, первая строка, которую вы получаете, является таким предупреждением.

Единственное странное в этом коде состоит в том, что анализатор не жалуется на пустой список скобок в int * Stack_Init(). Это плохая практика, так как это может привести к возникновению всех типов связанных с типом ошибок ошибок в случае отсутствия прототипа. Хороший инструмент сказал бы вам объявить функцию как int * Stack_Init (void).

Я бы сообщил об этом как об ошибках в статическом анализаторе.


Постусловие является указателем является действительным.

Затем вам нужно проверить результат malloc и включить обработку ошибок в случае сбоя malloc.

+2

Frama-C - это несколько вещей, и здесь это n ot используется как «статический анализатор». Вы правы, что можно надеяться, что люди, которые напишут еще более продвинутые вещи, чем статические анализаторы, поймут это правильно, но в их защиту первое, что делает front-end Frama-C, это перевести программу ввода C с ее приведениями и неявными преобразованиями на промежуточный язык, в котором все преобразования явны и называются «Cast». Таким образом, один из способов взглянуть на эту ошибку состоит в том, что сообщение об ошибке раскрывает внутреннюю работу фреймворка. –

+1

В этом конкретном случае кто бы ни назначил кого-то для проверки кода C с динамическим распределением с помощью WP, лучше бы проверить, что это было подтверждено заранее, и лицо, которому поручено это делать, могло начаться с руководства по http: // frama- c.com/download/frama-c-wp-manual.pdf, в разделе 1 которого начинается предупреждение о «гетерогенном литье указателей» (читай «преобразование» - «люди ...» действительно не знают разницы) на странице 12. Вы должны рекомендовать, чтобы OP прочитал первые десять страниц документации, прежде чем рекомендовать сообщать об ошибках. –

+0

@PascalCuoq Мне еще предстоит встретить статический анализатор, который не полон ошибок, и я пробовал много. Этот конкретный инструмент, очевидно, дает путаные и вводящие в заблуждение сообщения об ошибках: если это из-за неправильной конфигурации или ошибок, я не знаю и не забочусь. – Lundin

6

Плагин WP не поддерживает void * указатели очень хорошо, так как его модель внутренней памяти основана на статических типах, с которыми объявлены элементы.Это основная часть ошибки, которую вы наблюдаете. Как вы можете видеть в issue 2078, в какой-то момент появится усовершенствованная модель памяти (версия Magna-C Magnesium) и поможет вам в этом.

Однако обратите внимание, что есть еще одна проблема с malloc за поддержку void *, а именно поддержка динамически распределяемой памяти (предиката fresh и его братьев и сестер в ACSL), для которого ничего не действительно запланированном на данный момент, насколько я знаю.

+0

спасибо за ваш ответ, хорошо, тогда frama-c не поддерживает очень хорошую динамическую память? Мне нужно реализовать стек int (как вы можете видеть из моей функции), могу ли я любезно предположить, как я могу реализовать в c массиве без использования функции malloc() и free()? – FedeXu

+1

На самом деле, вы можете уйти со спецификацией 'malloc', поскольку она стоит в собственной стандартной библиотеке Frama-C. Пока вы пытаетесь доказать функции из самой библиотеки, поэтому эффективно обрабатывать только один стек за раз, у вас могут не возникнуть проблемы. Все станет намного более проблематичным, если вы используете несколько стеков в целом приложении, потому что вам придется полагаться на разделение различных блоков, возвращаемых malloc (а также из остальной части памяти). – Virgile

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

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