2015-01-05 3 views
0

Я пытаюсь выполнить преобразование таблицы mnesia для обновления схемы. В моей новой схеме я удалил одно поле из моего предыдущего определения записи. Остальная часть схемы остается неизменной. Вот некоторые коды:Ошибка Dialyzer при удалении поля из записи

XformFun = fun(OldRecord) -> 
    NewRecord = #bdm_employee{id=element(2, OldRecord), name=element(3, OldRecord), 
           address=element(4, OldRecord), 
           job_type=element(6, OldRecord), 
           ... 
           description=element(34, OldRecord)}, 
    NewRecord 
end, 
mnesia:transform_table(bdm_employee, XformFun, record_info(fields, bdm_employee)) 

В моей первоначальной записи было 34 поля. После удаления 5-го поля диализер жалуется на попытку доступа к индексу вне диапазона записи для элемента № 34. Тем не менее, я нахожу это странным, так как «mnesia: transform_table» может выполняться на любой записи, размер которой может быть 34, 33 или что-то еще. Зачем жаловаться диализер? Цените некоторые рекомендации для фиксации этого ...

диализных error-

dialyzer: Analysis failed with error: 
{function_clause,[{lists,nth,2,[]}, 
        {dialyzer_typesig,find_element,2,[]}, 
        {dialyzer_typesig,get_bif_constr,4,[]}, 
        {dialyzer_typesig,handle_call,3,[]}, 
        {dialyzer_typesig,traverse,3,[]}, 
        {dialyzer_typesig,handle_clauses_1,7,...}, 
        {dialyzer_typesig,handle_clauses,...}, 
        {dialyzer_typesig,...}]} 
+1

У вас есть '-спец' для вашего преобразования? Я предполагаю, что диализер запутался в типе OldRecord. –

+0

У меня нет спецификации для преобразования, но я обнаружил пару утверждений в начале преобразования, которые обрабатывали OldRecord как тип записи bdm_employee. Это отбрасывает диализатор при попытке доступа к дополнительному элементу. – Yashesh

ответ

0

(Копирование с комментариями)

Ошибка из диализных находится от него пытаются получить тип 34-го элемента, когда не являются 34 элементами в записи. Это, в свою очередь, связано с тем, что Dialyzer получил неправильный тип для OldRecord.

Поиск того, где тип, полученный из того, что вы не ожидали, может быть сложным. Самое простое (хотя все еще не простое) решение - это аннотирование типов в большем количестве мест. Например, если вы зачислили fun (OldRecord) и дали ему -spec, Dialyzer предоставит вам более полезное сообщение об ошибке.