SORU
4 EKİM 2014, CUMARTESİ


C iyimserlik saat çağrı sipariş için yasal (?)

The C Programming Language4. edition, sayfa 225 okur:Bir derleyici performansı sonucu infaz basit düzenin aynı olduğu sürece geliştirmek için kodu yeniden düzenlemek olabilir. Bazı derleyici, örneğin C serbest modunda Görsel, bu kodu yeniden:

#include <time.h>
...
auto t0 = clock();
auto r  = veryLongComputation();
auto t1 = clock();

std::cout << r << "  time: " << t1-t0 << endl;

bu forma:

auto t0 = clock();
auto t1 = clock();
auto r  = veryLongComputation();

std::cout << r << "  time: " << t1-t0 << endl;

orijinal kodu daha farklı sonuç (sıfır vs sıfırdan kez daha bildirdi) garanti eder. Ayrıntılı örnek için my other question bkz. Bu davranış, C standardı ile uyumlu mu?

CEVAP
4 EKİM 2014, CUMARTESİ


Peki, orada bir şey Birleşik Devletleri: Subclause 5.1.2.3 of the C Standard [ISO/IEC 9899:2011] denir

Soyut makine, tüm ifadeleri tarafından belirtilen olarak değerlendirilir semantik. Gerçek bir uygulama bir parçası olarak değerlendirmek lazım değil ifade değeri kullanılmadığını anlamak olmadığını ve hiçbir gerekli yan etkileri üretilmektedir (herhangi bir arama nedeniyle de dahil olmak üzere işlev veya değişken bir nesne erişim).

Bu nedenle ben gerçekten şüphelibu davranış- sen nitelendirdistandart ile uyumlu.

Ayrıca - yeniden yapılanma gerçekten var üzerinde bir etkisi hesaplamalar sonucu, ama bakarsanız bu derleyici bakış açısı - hayatımızda int main() dünya ve ne zaman yapıyor zaman ölçümleri - peeps, ister çekirdek hakkı geçerli saat ve tarihi çok eskilere dayanıyor içine ana dünya gerçek zaman dış dünya fark etmez çok.(Saat) program kendisini etkileyen olmayacak ve değişkenleri ve program davranış saati etkilemez() işlevi.

Saatler değerleri arasındaki farkı hesaplamak için kullanılır - bunu sen istedin. Eğer orada bir şey var, ikisinin arasında ölçme, değil, ilgili Derleyiciler perspektif beri ne istediysen oldu saat farkı ve kod arasında ölçüm etkilemez ölçme gibi bir süreç.

Bu ancak açıklanan davranışı hiç te hoş olmadığı gerçeğini değiştirmiyor.

Yanlış Ölçümler tatsız olsa da, çok daha kötü ve hatta tehlikeli olabilir.

Aşağıdaki kodu this site alınan göz önünde bulundurun:

void GetData(char *MFAddr) {
    char pwd[64];
    if (GetPasswordFromUser(pwd, sizeof(pwd))) {
        if (ConnectToMainframe(MFAddr, pwd)) {
              // Interaction with mainframe
        }
    }
    memset(pwd, 0, sizeof(pwd));
}

Normalde derlenmiş, her şey TAMAM, ama eğer iyileştirmeler uygulandığında, memset çağrı ciddi bir güvenlik kusur neden olabilir optimize edilmiş olacak. Neden optimize çıkmak mı? Çok basit; derleyici tekrar düşünüyor kendi main() dünya ve saydığı memset bir ölü saklamak değişken pwd değil kullanılan ve daha sonra etkilemez programın kendisi.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CodingMadeEasy

    CodingMadeEa

    25 EYLÜL 2010
  • stewmurray47

    stewmurray47

    1 Kasım 2006
  • The Pet Collective

    The Pet Coll

    5 Ocak 2012