Ошибки, баги, вопросы - страница 2759

 
TraSer:

Мне кажется всё правильно. Программа игнорирует if(false) и срабатывает на ближайшем по коду месте.)

Совершенно не правильно. Если мне надо остановиться только при выполнении условия, а остановка будет на каждом тике, то я с ума свихнусь пока...

 
Sergey Dzyublik:

Еще вопросы?

с чего Вы решили, что компилятор не выбросил текст условия if(false) {....} при компиляции проекта ?

точка останова получилась на первом текстовом символе МЕ оставшегося кода, т.к. МЕ не умеет сдвигать строки, фолдинги пр. прелести VS

ME не умеет в режиме реального времени анализировать код, максимум, что доступно автоподстановки 

хотя если  баг, значит баг

 
Igor Makanu:

с чего Вы решили, что компилятор не выбросил текст условия if(false) {....} при компиляции проекта ?

точка останова получилась на первом текстовом символе МЕ оставшегося кода, т.к. МЕ не умеет сдвигать строки, фолдинги пр. прелести VS

ME не умеет в режиме реального времени анализировать код, максимум, что доступно автоподстановки 

хотя если  баг, значит баг

Это надо тестировать с нормальным условием. Я вот такое получил недавно: при пошаговом выполнении кода

  if(desiredProfit > 0 && summProfit > desiredProfit)
   {
    CloseAllPosition();
    DeleteAllPending();
    openSeries = Should_I_open;
    return;
   }

в отладчике, при явном невыполнении условия, вызовы функций не выполнялись, а вот return; выполняется. Я решил, что поскольку после кривой скобки нет больше кода, там только ещё одна кривая скобка завершающая void OnTick(), то компилятор перенёс return

 
Alexey Viktorov:

Это надо тестировать с нормальным условием.

да, я про это и пишу, не false нужно, а что нибудь как:

int i=1;
if(--i == 0)...

обычно компилятор не видит такого условия при компиляции

 
Спасибо за критику, вернулся к изначальному проекту и выделил возникшую проблему без переоптимизаций кода:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
Sergey Dzyublik:

Код демонстрирует БАГ, где в условие зайти нельзя, но все-равно срабатывает точка останова, при этом совсем в другом месте кода.
Еще вопросы?

Это оптимизатор кода все выкинул и функция осталась пустой.

Брекпоинт съехал в тот же самый конец функции и сработал.

 
MetaQuotes:

Это оптимизатор кода все выкинул и функция осталась пустой.
Брекпоинт съехал в тот же самый конец функции и сработал.

С первым примером погорячился, согласен.
Ну а что на счет второго? Ведь там точка останова остается внутри условия и никуда не съезжает.
Срабатывание точки останова вводит пользователя в заблуждение, будто бы условие входа было выполнено, когда в действительности это может быть совсем не так:

class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
MetaQuotes:

Брекпоинт съехал в тот же самый конец функции и сработал.

По-вашему это не баг?

 
МТ5 (build 2460) что-то поломалось при использовании наследования от шаблонных классов, в предыдущих версиях включая build 2450 все работало.
 
Баг МТ5 (build 2460) ошибка компиляции при наследовании от шаблонного класса из namespace.
C++ online: https://onlinegdb.com/S1E503pj8
namespace NameSpace{  
   struct A{};
   
   template<typename T>
   struct B : public A{};          // 'A' - declaration without type
};

struct D : public NameSpace::B<int>{
   int data;
};

void OnStart(){
   D d;
}