Güle güle robot, yaşasın delilik - sayfa 7

 
Renat :
...

Bu örneğin test edilmesi:

  • MQL4/MQL5 - olası bir hata hakkında uyarı verir

  • Kod Analizi dahil Visual Studio 2012 - hiçbir şey, potansiyel hatalar için analizin kalitesi genellikle sıfırdır. Uzun süredir rakipleri olmadığı için buhar banyosu yapmıyorlar.

  • PVS Studio doğru raporlar

  • Lint - benzer şekilde çıktılar, 'x' bildirimi gizle...

    ...

Pavlik :

Ayrıca mesajların tamamen yararsız olduğunu düşünüyorum. Ben profesyonel bir programcı değilim, ancak mikrolitrelerdeki bu tür saçmalıklar beni rahatsız ediyor. İlginç bir şekilde, a ve b'ye yapılan referanslar sabitse, PVS Studio bir uyarı verir (bunu kendiniz kontrol etmenin bir yolu yoktur)?

Yine de, önce uyarının özünü anlamak ve sonra onu bir argüman olarak alıntılamak fena değil. PVS Studio, global değişkenin gizlenmesinden değil, a ve b'nin sabit olmayan referans tarafından iletilmesinden, ancak değiştirilmemesinden şikayet eder. Bu durumda, onların görüşüne göre, a ve b, sürekli referans ile geçilmelidir. Örneğin, aşağıdaki örnekler bu ayrıştırıcıdan şikayete neden olmaz:

 int a= 1 ,b= 2 ;
int sum( const int & a, const int & b){
         return (a+b);
}

int main(){
         return sum(a,b);
}

//-------------------------------------------------
int a= 1 ,b= 2 ;
int sum( int & a, int & b){
        ++a; ++b;
         return (a+b);
}

int main(){
         return sum(a,b);
}
 

PVS'nin neye yemin ettiğini gayet iyi biliyorum.

Yine, milyarlarca satırlık eski C/C++ kodunu derleme yüküne sahip değiliz. Bu, uyarılar vererek işlerini bozmamaya çalışarak kendi derleyicileri tarafından ele alınmalıdır. Para ile çalışan uygulamalı dilimizin güvenlik ve hata kontrolünden sorumluyuz.

Tanrı korusun, MQL4/5 kod yazarlarının yüzde birkaçı profesyonel (gerçek anlamda) programcılardır. Diğer herkes sadece kendi kendini yetiştirmiştir ve ne kadar kötü kod yazdıkları hakkında hiçbir fikirleri yoktur.

Örneğin, güncellenmiş MQL4'e geçtikten sonra, kod tabanındaki binlerce kaynağı manuel olarak taramak ve eski kodlarındaki inanılmaz sayıda hatayı düzeltmek zorunda kaldık. Programları çalıştırmadan bile derleyici tarafından birçok hata bulundu ve gösterildi.

Bu nedenle, uyarı verme konusunda iddiada bulunmamalı, kodunuzu düzeltmelisiniz.

 
Renat :

PVS'nin neye yemin ettiğini gayet iyi biliyorum.

Yine, milyarlarca satırlık eski C/C++ kodunu derleme yüküne sahip değiliz. Bu, uyarılar vererek işlerini bozmamaya çalışarak kendi derleyicileri tarafından ele alınmalıdır. Para ile çalışan uygulamalı dilimizin güvenlik ve hata kontrolünden sorumluyuz.

Allah korusun, MQL4/5 kod yazarlarının birkaç yüzdesi profesyonel (gerçek anlamda) programcılardır. Diğer herkes sadece kendi kendini yetiştirmiştir ve ne kadar kötü kod yazdıkları hakkında hiçbir fikirleri yoktur.

Örneğin, güncellenmiş MQL4'e geçtikten sonra, kod tabanındaki binlerce kaynağı manuel olarak taramak ve eski kodlarındaki inanılmaz sayıda hatayı düzeltmek zorunda kaldık. Programları çalıştırmadan bile derleyici tarafından birçok hata bulundu ve gösterildi.

Bu nedenle, uyarı verme konusunda iddiada bulunmamalı, kodunuzu düzeltmelisiniz.


Bir dizinin aralığını kaçırmasına izin verilirse, bir gösterge yazarken, göstergenin kendisini yazmakla orantılı çaba sarf etmek, ancak yalnızca hesaplamanın başlangıcını hesaplamak çok aptalca olur.

Bu kodu kazmamak mümkün olurdu, yarısı sabit değil, bozuk. Eski mql4, yeni veya yeniyi strict ile ayırt etmek için basitçe ek bir özellik yapmak mümkündü. Eski derleyicinin boyutu nedir? Bilmiyorum, ama muhtemelen bir megabayttan daha az, gigabayt çağında yanınızda taşımak sorun değil. Ama işte böyle bir kahramanca iş yapıldı - kod tabanını yok etmek.

* * *

Bir uyarı

'a' bildirimi, X satırında genel bildirimi gizler

Bu aptalca bir uyarı. "Yüksek" dünyadan birinin bununla sorunları varsa, başkalarının da bu tür sorunları olabileceği anlamına gelmez. Değişkenlerin nasıl adlandırılacağı özel bir mesele olan bir değişkenler kapsamı vardır.

 
Integer :


Bir dizinin aralığını kaçırmasına izin verilirse, bir gösterge yazarken, göstergenin kendisini yazmakla orantılı çaba sarf etmek, ancak yalnızca hesaplamanın başlangıcını hesaplamak çok aptalca olur.

Bu kodu kazmamak mümkün olurdu, yarısı sabit değil, bozuk. Eski mql4, yeni veya yeniyi strict ile ayırt etmek için basitçe ek bir özellik yapmak mümkündü. Eski derleyicinin boyutu nedir? Bilmiyorum, ama muhtemelen bir megabayttan daha az, gigabayt çağında yanınızda taşımak sorun değil. Ama işte böyle bir kahramanca iş yapıldı - kod tabanını yok etmek.

Sabit, bozuk değil.

Düzenlemeden sonra bir hata gözden kaçtıysa, bu oldukça mümkündür - herhangi bir düzenleme kaçınılmaz olarak bu tür hatalara yol açar. Ancak bu, bayrağa tek hataların asılabileceği ve düzeltilenlerin dağına tırmanabileceği anlamına gelmez.


'a' bildirimi, X satırında genel bildirimi gizler

Bu aptalca bir uyarı. "Yüksek" dünyadan birinin bununla sorunları varsa, başkalarının da bu tür sorunları olabileceği anlamına gelmez. Değişkenlerin nasıl adlandırılacağının özel bir mesele olduğu bir değişken kapsamı vardır.

Arbalet hakkı için savaşan harika insanlar. Tüm ciddiyetle bir kişinin "eski derleyiciyi terk et" yazması özellikle sevindiricidir.
 
simpleton :

Potansiyel bir hata potansiyel bir hatadır, mutlaka bir hata değildir.

Peki xs xs. 4 veya 5 seviye uyarı ayarlamak ve uyarıları hata olarak kabul etmek için kutuyu işaretlemek için bir yayın kuralımız vardı.

Pragmalarla gerçekten aptalca uyarılardan kurtuldular, ama yine de onlardan kurtuldular.

 
Andrei01 :

Bu açıklama anlamsızdır ve prensipte programcıya herhangi bir yararlı bilgi taşımaz, çünkü burada belirtildiği gibi başlangıçta "a" değişkeninin gizlenmesi yoktur.

 1 .cpp( 3 ): remark # 3280 : declaration hides variable "a" (declared at line 1 )
   int sum( int & a, int & b){        

Programcı kasıtlı olarak gizleme kullanıyorsa, - evet, bu açıklama anlamsızdır ve faydalı bilgiler taşımaz. Gizleme yanlışlıkla, dikkatsizlik sonucu meydana geldiyse, bu açıklama bir hatayı erken bir aşamada tespit etmenizi sağlar.

Andrey01 :

Gizleme, yalnızca değişkenin yerel bir kopyası yapıldığında gerçekleşir ve bu da tamamen yasal bir şeydir. Bu gizleme nedeniyle aniden kodda bir hata ortaya çıksa bile, arama aynı isimleri hemen bulduğu için kesin olarak kolayca bulunur. Fonksiyon şablonundaki isimleri değiştirmeye ve karıştırmaya başlarsanız ve bu tam olarak bu açıklamanın derleyici mantığına göre "çözümüdür", o zaman hata bulma durumu çok daha zor olacak ve karışıklık ölçülemez şekilde artacaktır. kodu anlamak. Belli gibi görünüyor.

Yerel değişkenler ve parametreler aynı kapsamdadır, bu nedenle parametrenin böyle bir adı veya yerel bir değişkeni olup olmadığı önemli değildir, ancak her durumda bu ad, adı dış kapsamda gizler.

Gizlemenin değişken kopyalarla hiçbir ilgisi yoktur, varlık adlarıyla ilgisi vardır. Evet, yine de, türler gibi varlıkların adlarıyla:

 class A { };

void f( int a) {
        A x;
}

bu derler:

$ icpc -c 1 .cpp
$ 

Ve bu:

 class A { };

void f( int A) {
        A x;
}

artık değil:

$ icpc -c 1 .cpp
1 .cpp( 4 ): error: expected a ";"
        A x;
          ^

compilation aborted for 1 .cpp (code 2 )
$ 

Çünkü işlevin içindeki A adı artık türün adı değil, parametre değişkeninin adıdır. Dış kapsamda bildirilen türün adı artık parametre değişkeninin adıyla gizlenmiştir. Bu, şu kodu bularak dolaylı olarak doğrulanabilir:

 class A { };

void f( int A) {
        A++;
}

oldukça başarılı bir şekilde derler:

$ icpc -c 1 .cpp
$ 

MQL4++'da bu, değişken parametre adıyla, yani boş bir işlev gövdesiyle bile tür adını gizleme aşamasında derlenmez:

 #property strict

class A { };
void f( int A) { }
void OnStart () { }

sonuç:

 'A' - structure identifier cannot be used       3 .mq4   4        12
'A' - structure identifier cannot be used       3 .mq4   4        12

Neden bilmiyorum ama hiç şaşırmadım.

C++ için böyle bir kodla ilgili herhangi bir sorun yoktur:

 class A { };
void f( int A) { }

derleme girişimi sonucu:

$ icpc -c 1 .cpp
$ 

Bu örnek, gizlemenin başka bir şeyle değil varlık adlarıyla ilgili olduğunu gösterir.

Eğer açıklama devre dışı bırakılamıyorsa, evet, adları karıştırmak gibi her türlü yolu icat etmeniz gerekir. Ancak, Intel derleyicisinde olduğu gibi devre dışı bırakılırsa, böyle bir sorun yoktur.

MQL4++'da sorun, derleyicinin iç içe kapsamlarda ad gizlemeyi algılama işlevinde değil, bu işlevin ilke olarak devre dışı bırakılamaması gerçeğindedir.

 
Renat :

Bu nedenle, uyarı verme konusunda iddiada bulunmamalı, kodunuzu düzeltmelisiniz.

Bence tartışılan uyarılar/açıklamalar hakkında tek bir iddia olabilir - temelden kopuklukları hakkında.

Ve elbette, programcıya dil içinde ne yapacağını ve ne yapmayacağını söyleyemezsiniz.

 

Bu tür mesajlar ( genel değişkenleri gizleme) C++'da basitçe anlamsızdır (sonuçta mql, C++'a benzer şekilde bildirilmişti, değil mi?). Örneğin, işte nedeni:

 struct S1{
     int val;
};

struct S2{};

template<typename _T>
struct SS : _T{
     int f() { int val; return val;}
};

int main(){
    SS<S1> q1; q1.f();
    SS<S2> q2; q2.f();
}
 
Pavlick :

C++'da bu tür mesajlar (genel değişkenleri gizleme) basitçe anlamsızdır (mql, C++'a benzer olarak bildirilmişti, değil mi?). Örneğin, işte nedeni:

 struct S1{
     int val;
};

struct S2{};

template<typename _T>
struct SS : _T{
     int f() { int val; return val;}
};

int main(){
    SS<S1> q1; q1.f();
    SS<S2> q2; q2.f();
}

MQL4++'da yapı/sınıf şablonu olmadığı için C++ buraya alındı, sadece fonksiyon şablonları mı var?

Geliştiricilerin bunu bilip bilmediğinden emin değilim, ancak önemli sınırlamalara rağmen MQL4++'da sınıf şablonları da mümkündür. Özellikle, bu örnek aşağıdaki şekilde MQL4++'a çevrilebilir (yöntemde yerel bir değişken yerine bir parametre de kullanılır):

 #property strict

struct S1 { };
struct S2 { int val; };

template <typename T>
void f(T &t) {
   struct SS: public T {
     int f( int val) { return val; }
  } ss = { 0 }; // Переменная типа SS
}

void OnStart () {
  S1 s1; f(s1);
  S2 s2; f(s2);
}

derlerken, bir adın gizlenmesiyle ilgili tek bir uyarı belirir:

 '3.mq4' 3 .mq4   1        1
struct has no members, size assigned to 1 byte    3 .mq4   3        8
struct has no members, size assigned to 1 byte    3 .mq4   8        10
declaration of 'val' hides member declaration at line 4 3 .mq4   9        15
0 error(s), 3 warning(s)                 1        4

OnStart() içindeki son önemli satırı yorumlarsanız, adın gizlenmesiyle ilgili uyarı kaybolur.

 
simpleton :

MQL4++'da yapı/sınıf şablonu olmadığı için C++ buraya alındı, sadece fonksiyon şablonları mı var?

...

Genel olarak evet, ancak µl başına şunları da yapabilirsiniz:

 struct S1{
     int val;
};

struct S2{};

#define INSTANTIATE(_Name, _T)          \
     struct _Name : _T                   \
    {                                   \
         int f() { int val; return val;}; \
    }

INSTANTIATE(SS1, S1);
INSTANTIATE(SS2, S2);

void start(){
    SS1 q1; q1.f();
    SS2 q2; q2.f();
}