2012-03-12 Баги KDevelop

Материал из YourcmcWiki
Перейти к: навигация, поиск
(Новая страница: «KDevelop всё-таки имеет баги, например я нашёл полтора: [https://bugs.kde.org/show_bug.cgi?id=283356 баг 283356] и [https...»)
 
м
Строка 17: Строка 17:
 
* Определение поля — в классе, но не внутри метода, соответственно, и сам «фикс» ошибки переопределения ни фига не работает. Вернее работает, но не всегда, а как повезёт, в зависимости от порядка добавления присваивания и определения. Если сначала написать присваивание внутри метода класса, а ''потом'', после него, определение — не работает.
 
* Определение поля — в классе, но не внутри метода, соответственно, и сам «фикс» ошибки переопределения ни фига не работает. Вернее работает, но не всегда, а как повезёт, в зависимости от порядка добавления присваивания и определения. Если сначала написать присваивание внутри метода класса, а ''потом'', после него, определение — не работает.
  
Хз, может и попробую зафиксить, но не факт, что это окажется легко.
+
Хз, может и попробую зафиксить, но не факт, что это окажется легко. То есть, в качестве быстрого хака, если хочется работать, можно просто выпилить весь блок кода, отвечающий за этот фикс, из DeclarationBuilder::declareClassMember (в kdev-php/duchain/builders/declarationbuilder.cpp), но хочется-то зафиксить как надо.
 
{{wl-publish: 2012-03-12 02:41:29 +0400 | VitaliyFilippov }}
 
{{wl-publish: 2012-03-12 02:41:29 +0400 | VitaliyFilippov }}

Версия 01:45, 12 марта 2012

KDevelop всё-таки имеет баги, например я нашёл полтора: баг 283356 и баг 295766.

Второй как бы не совсем баг, но если пытаться скормить в KDevelop что-то безумное типа битрикса, где пипец как много каталогов, он повисает в попытках сделать очередной inotify, на который ему говорит «хрен там» ядро, ибо по дефолту sysctl fs.inotify.max_user_watches = 8192… Я лично считаю, что он в этой ситуации не должен повисать намертво, а должен просить поднять лимит… Но в любом случае этот «полубаг» успешно обходится, собственно, поднятием лимита.

А вот первый — действительно баг — KDevelop время от времени валится на некоторых исходниках. Я поотлаживал и нашёл минимальный тест, простой PHP-код, который валит KDevelop :)

<?php
$a = new A();
$a->x = 1;
class A {
    var $x = 1;
}

Смысл в том, что оно пытается делать довольно приличный статический анализ PHP-кода, и запоминает поля, определённые присваиванием. А кроме того, оно пытается предупреждать о некорректных переопределениях (ну например дважды var $x в одном классе). Но из-за этого оно раньше ругалось на переопределение, если сначала видело присваивание, а только потом определение. Это типа зафиксили в баге баг 241750, но только криво зафиксили — код почему-то подразумевает, что видит определение именно внутри метода класса, и тупо использует currentContext()->parentContext() (то есть «тело функции» → «тело класса»). Но:

  • Присваивание бывает вообще снаружи класса, и тогда parentContext = NULL ⇒ SEGFAULT.
  • Определение поля — в классе, но не внутри метода, соответственно, и сам «фикс» ошибки переопределения ни фига не работает. Вернее работает, но не всегда, а как повезёт, в зависимости от порядка добавления присваивания и определения. Если сначала написать присваивание внутри метода класса, а потом, после него, определение — не работает.

Хз, может и попробую зафиксить, но не факт, что это окажется легко. То есть, в качестве быстрого хака, если хочется работать, можно просто выпилить весь блок кода, отвечающий за этот фикс, из DeclarationBuilder::declareClassMember (в kdev-php/duchain/builders/declarationbuilder.cpp), но хочется-то зафиксить как надо.