Yerleşik C kodu güvenilirliğini artırmak için hangi araçlar veya standartlar kullanılabilir?


9

Genellikle anahtarlamalı mod dönüştürücüler için PIC'leri genellikle C olarak programlarım. Kodun güvenilirliğini artırmak için kullanılabilecek MISRA C gibi çeşitli statik analiz araçlarını ve standartlarını duydum . Daha fazlasını bilmek istiyorum. Bağlamım için hangi standartlar veya araçlar uygun olabilir?


1
C dilinde nasıl ayarlandınız?
Brian Drummond

1
Yapılması gereken çok iyi bir durum olsaydı başka bir şeye geçmeye ikna edilebilirdim. Ama bu çok iyi bir durum olmalı.
Stephen Collings

C'den geçiş için "çok iyi bir durum" hızlı bir şekilde yapılamaz ve PIC için, muhtemelen henüz değil. AVR, ARM veya MSP430 için Ada ciddi bir görünüme değer olacaktır (gördüğünüz gibi çektiği olumsuzluğa rağmen!) Ve yüksek rel için SPARK bir göz atmaya değer.
Brian Drummond

Bunları arka plan bilgisi olarak bulabilirsiniz: SPARK vs MISRA -C spark-2014.org/entries/detail/… ve bu devam eden vaka çalışması: spark-2014.org/uploads/Nosegearpaper_1.pdf
Brian Drummond

PIC'den modern bir şeye geçiş yapmak için daha iyi zaman harcanabilir ... Özellikle de MISRA ve SPARK'ın başlangıçta amaçladığı tür kritik görev sistemleri tasarlıyorsanız.
Lundin

Yanıtlar:


11

Gömülü kod doğrulaması, özellikle PIC'ler gibi sınırlı kaynak bölümleriyle uğraşırken karmaşıktır. Parçanın memnry kısıtlamaları ve bu tür cihazlarda sıklıkla "gerçek zamanlı" programlama nedeniyle test durumlarında genellikle kodlama lüksüne sahip değilsiniz.

İşte yönergelerimden bazıları:

  1. Bir spesifikasyon yoksa, bir spesifikasyon yazın: Bir spesifikasyona göre kod yazmıyorsanız, kodunuzun ne olması gerektiğini, geçerli girdilerin ne olduğunu, beklenen çıktıların ne olduğunu, her rutinin ne kadar sürmesi gerektiğini, ne elde edip edemeyeceğini belgeleyin clobbered, vb. - bir operasyon teorisi, akış şemaları, hiçbir şey yoktan iyidir.

  2. Kodunuzu yorumlayın : Bir şeyin sizin için aşikar olması, başkası için aşikar (veya doğru) olduğu anlamına gelmez. Hem inceleme hem de kod bakımı için düz dilde yorumlar gereklidir.

  3. Defansif kodlama : Yalnızca normal girdiler için kod eklemeyin. Eksik girişleri, aralık dışındaki girişleri, matematiksel taşmaları vb. Yönetin - kod tasarımınızla ne kadar çok köşe kaplarsanız, kodun konuşlandırıldığında o kadar az serbestlik derecesi olur.

  4. Statik analiz araçlarını kullanın: PC-lint gibi hata araçlarının kodunuzda bulabileceği kaçınılmaz olabilir. Ciddi testler için temiz bir statik analiz çalışmasını iyi bir başlangıç ​​noktası olarak düşünün.

  5. Akran değerlendirmeleri önemlidir: Kodunuz, bağımsız bir tarafça verimli bir şekilde incelenebilecek kadar temiz ve yeterince iyi belgelenmiş olmalıdır. Egonuzu kapıda kontrol edin ve yapılan herhangi bir eleştiri veya öneriyi ciddiye alın.

  6. Test önemlidir: Kodun bağımsız doğrulamasının yanı sıra kendi onayınızı da yapmalısınız. Diğerleri kodunuzu hayal bile edemeyeceğiniz şekilde kırabilir. Geçerli her koşulu ve aklınıza gelebilecek her geçersiz koşulu test edin. PRNG'leri kullanın ve çöp verilerini içeri aktarın. Bir şeyleri kırmak için elinizden geleni yapın, sonra onarın ve tekrar deneyin. Şanslıysanız, kodunuzu hata ayıklama modunda çalıştırabilir ve kayıtlara ve değişkenlere göz atabilirsiniz - eğer değilse, durumunuz hakkında fikir edinmek için kurnaz olmanız ve LED'leri / dijital sinyalleri açmanız gerekir. cihaz. İhtiyacınız olan geribildirimi almak için ne gerekiyorsa yapın.

  7. Kaputun altına bakın: C derleyiciniz tarafından üretilen makine koduna bakmaktan çekinmeyin. Güzel C kodunuzun yüzlerce işlem olmasa bile onlarca havaya uçtuğu yerleri (bulacaksınız?), Güvenli olması gereken bir şeyin (sadece bir kod satırı olduğu için, değil mi?) koşulları kovdu ve geçersiz kıldı. Bir şey korkunç derecede verimsiz hale gelirse, yeniden düzenleyin ve tekrar deneyin.


+1 Tüm ses önerileri. Bunu okurken herhangi bir profesyonel yazılım geliştiricisinin sadece gülümsemesini ve başını sallamasını beklerim.
Lundin

2
Akran değerlendirmelerinin önemli bir yönü, incelemenin programcı hakkında değil kodla ilgili olmasıdır. Kodunuzu "önce bunu yaparım, sonra yaparım" gibi terimlerle analiz ederseniz, muhtemelen başınız belada demektir. "Önce kod bunu yapar, sonra bunu yapar" düşünmenin doğru yoludur. Aynı şey hakemler için de geçerlidir: "bunu neden yaptın?" Değil, "kod neden bunu yapıyor?".
Pete Becker

Ayrıca şunları da ekleyebilirsiniz: 1. Siklomatik Karmaşıklık denetimini kullanma 2. Sürüm kontrol yazılımı
AlphaGoku

4

Bir bilgisayarda güvenilir yazılım oluşturmak için kullanılan aynı tekniklerin çoğu gömülü geliştirme için de geçerlidir. Algoritmalarınızı donanıma özgü koddan ayırmak ve bunları birim testleri, simülasyonlar, statik analiz ve Valgrind gibi araçlarla ayrı ayrı test etmek yararlıdır. Bu şekilde, yalnızca donanımda test edilen çok daha az kod olur.

C'yi terk etmem. Ada gibi diller bazı küçük garantiler sunsa da, dilin gerçekte olduğundan daha fazla vaat ettiğini düşünme tuzağına düşmek kolaydır.


Valgrid, PC için 8 bit MCU'dan biraz daha alakalı olabilir :)
Lundin

Ne yazık ki, PC düzeyinde iyi bir yazılım oluşturmak için bazı teknikler küçük mikrolar için çok uygun değildir ve PC topraklarında Kötü ve Yanlış olarak kabul edilen bazı uygulamalar gömülü bir ortamda mükemmel bir şekilde kabul edilebilir.
John U

3

MISRA-C, genel kod kalitesini artırmak ve hataları en aza indirmek için gerçekten çok kullanışlıdır. Her kuralı okuduğunuzdan ve anladığınızdan emin olun, çoğu iyi, ancak birkaçı mantıklı değil.

Burada bir uyarı. MISRA belgesi okuyucunun C dili konusunda geniş bilgiye sahip biri olduğunu varsayar. Ekibinizde bu kadar sert bir C gazisi yoksa, ancak statik bir analizör almaya karar verdikten sonra verilen her uyarıyı körü körüne takip ederseniz, okunabilirliği azaltabileceğiniz ve yanlışlıkla hatalar ekleyebileceğiniz için büyük olasılıkla daha düşük kalitede kodla sonuçlanacaktır. Bunun birçok kez olduğunu gördüm, kodu MISRA uyumluluğuna dönüştürmek önemsiz bir görev değil.

MISRA-C belgesinin uygulanabilecek iki sürümü vardır. Halen mevcut gömülü endüstri fiili standardı olan MISRA-C: 2004. Veya C99 standardını destekleyen yeni MISRA-C: 2012. Daha önce hiç MISRA-C kullanmadıysanız, ikincisini uygulamanızı tavsiye ederim.

Bununla birlikte, alet satıcılarının genellikle MISRA kontrolüne sahip olduklarını söylediklerinde MISRA-C: 2004'e başvurduklarını unutmayın (bazen eski MISRA-C: 1998 versiyonuna atıfta bulunurlar). Bildiğim kadarıyla, MISRA-C: 2012 için araç desteği hala sınırlı. Bence sadece bazı statik analizörler bunu uyguladı: Klocwork, LDRA, PRQA ve Polyspace. Daha fazla olabilir, ancak kesinlikle hangi MISRA sürümünü desteklediğini kontrol etmeniz gerekir.

Karar vermeden önce, elbette MISRA belgesini okuyarak ve nelerin gerektirdiğini görebilirsiniz. ISO standartlarına kıyasla oldukça uygun fiyatlı , misra.org'dan 10 £ karşılığında satın alınabilir .


1

Mathworks (MATLAB çalışanları) Polyspace adlı statik bir kod analiz aracına sahiptir .

Statik kod analizi, tiftik ve benzeri gibi, arayüzlerin (resmi bir inceleme süreci ile) ve kod kapsama analizinin dikkatli bir şekilde tanımlanmasını ve tasarlanmasını öneririm.

Ayrıca MISRA'nın yanı sıra UL1998 ve IEC 61508 standartları da dahil olmak üzere güvenlik açısından kritik kod tasarımı yönergelerine de bakmak isteyebilirsiniz.


Zorunlu olmadıkça IEC 61508'in yanına gitmenizi tavsiye etmiyorum. Yazılımdan bahsediyor, ancak iddiaları için modern, bilimsel kaynaklardan yoksun. Bu standart 30 yıl çok geç geldi - 70'lerde "kaynaklarının" çoğu gibi yayınlanmış olsaydı, yararlı olabilirdi.
Lundin

1

Bu soruya tam bir cevap için, "kod güvenilirliği" hakkındaki düşünceyi bastırır ve bunun yerine "tasarım güvenilirliği" ni düşünürüm, çünkü kod tasarımın sadece son ifadesidir.

Yani, gereksinimlerle başlayın ve bunları yazın ve inceleyin. Bir gereksinim belgeniz yoksa, rastgele bir kod satırına işaret edin ve kendinize "neden bu satıra neden ihtiyaç var?" Herhangi bir kod satırı gereksinimi, "giriş 12-36VDC arasındaysa güç kaynağı 5VDC vermelidir." Bunu düşünmenin bir yolu, bu kod satırı bir gereksinime göre izlenemiyorsa, bunun doğru kod olduğunu veya gerekli olduğunu nasıl bilebilirsiniz?

Ardından, tasarımınızı doğrulayın. Tamamen kodda (örneğin, yorumlarda) varsa sorun değil, ancak kodun gerçekten ne anlama geldiğini bilmek zorlaşır. Örneğin, okuyan bir çizgi olabilir kod output = 3 * setpoint / (4 - (current * 5));current == 4/5çökmesine neden olabilir, geçerli bir girdi? Bu durumda sıfıra bölünmeyi önlemek için ne yapılmalı? İşlemden tamamen kaçınıyor musunuz yoksa çıktıyı düşürüyor musunuz? Tasarım belgenizde bu tür kenar kasaların nasıl ele alınacağına dair genel bir not olması, tasarımı daha yüksek bir seviyede doğrulamayı çok daha kolay hale getirir. Bu nedenle, kod denetimi artık daha kolay çünkü kodun bu tasarımı doğru şekilde uygulayıp uygulamadığını kontrol etmek meselesi.

Bununla birlikte, kod denetimi, IDE'nizin yakalamadığı (= ID 'demek istediğinizde = = gibi) sık rastlanan hataları kontrol etmelidir. ifadeleri, olmaması gereken noktalı virgüller vb.

Bunu yazarken, yıllarca süren yazılım kalitesi eğitimini / deneyimini tek bir gönderide özetlemek gerçekten zor. Tıbbi cihazlar için kod yazıyorum ve yukarıda nasıl yaklaştığımızın son derece basitleştirilmiş bir özeti var.


Anladığım kadarıyla, tıbbi bir cihazdaki kod kısmı neredeyse ayrı bir cihaz gibi test ediliyor. Bu doğru mu?
Scott Seidman

@ScottSeidman Büyük olasılıkla, bu cevapta belirtildiği gibi gereksinim temelinde test edilir. Her gereksinim için bir kod modülünüz olmalı ve bu kod modüllerinin her biri için bir test yapmanız gerekir. Bu nedenle, esas olarak, her gereksinimin karşılık gelen bir testi vardır ve kod, gereksinimi yerine getirmenin ortalamasıdır. Bu tür bir gereksinim izleme, "TDD" teriminin ortaya çıkmasından çok önce, kritik öneme sahip sistemlerde yaygın bir uygulamadır.
Lundin

Özellikle fda.gov/downloads/RegulatoryInformation/Guidances/ucm126955.pdf gibi FDA rehberliğine atıfta bulunuyordum. Yazılım, aslında bir tıbbi cihazın parçası olup olmadığını planlama aşamasından ve tasarım kontrollerinden başlayarak düşündüğünüzden daha fazlasını gerektiriyor.
Scott Seidman

Scott, bunu hiç böyle düşünmemiştim, ama haklısın. Yazılım Kalite Güvencesi çalışanlarımız, Sistem Doğrulama ve Doğrulama'dan sorumlu farklı bir gruba teslim etmeden önce yazılımı sistemin geri kalanından ayrı olarak (mümkün olduğunca) doğrular.
lyndon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.