Geçersiz Erişim
Sınır dışı ve başlatılmamış erişimler
Geçersiz Erişim, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Sızıntıların Ötesi
Sızıntılar belleği israf eder; ancak geçersiz erişim hataları belleği bozar. memcheck çeşitli türleri yakalar:
- Bir tamponun sonunun ötesini okuma veya yazma
freesonrasında belleği kullanma- Başlatılmamış değerleri okuma
- Hatalı bir gösterici üzerinden okuma veya yazma
Bunlar en tehlikeli ve yeniden oluşturulması en zor çökmelere neden olur.
Sınır Dışı Yazma
Bu kod 5 int için yer ayırır; ancak 6. yuva olan 5. dizin değerine yazar.
5. dizin, son elemanın bir sonrasıdır. memcheck bu satırda Invalid write of size 4 bildirir.
#include <stdlib.h>
int main(void) {
int *a = malloc(5 * sizeof(int));
a[5] = 99; /* valid indices are 0..4 */
free(a);
return 0;
}Hatayı Okuma
Rapor işlemi, boyutu ve bellek bloğuyla ilişkisini belirtir:
Invalid write of size 4Address 0x... is 0 bytes after a block of size 20 alloc'd
'0 bytes after a block of size 20' ifadesi, erişimin 20 baytlık (5 int) bellek ayırma işleminin hemen sonrasına denk geldiğini gösterir.
Sınır Dışı Okuma
Okumalar da yakalanır. Burada döngü bir eleman fazla ilerler.
Program şans eseri 'çalışıyor' gibi görünse bile memcheck son yinelemede Invalid read of size 4 bildirir.
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *a = calloc(3, sizeof(int));
for (int i = 0; i <= 3; i++) /* should be i < 3 */
printf("%d\n", a[i]);
free(a);
return 0;
}Başlatılmamış Değerler
malloc belleği sıfırlamaz. Belleğe değer atamadan önce onu kullanmak öngörülemeyen bir değer üretir.
Böyle bir değer denetim akışını veya çıktıyı etkilediğinde memcheck Conditional jump or move depends on uninitialised value(s) bildirir.
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *p = malloc(sizeof(int));
if (*p == 0) /* *p was never set */
printf("zero\n");
free(p);
return 0;
}Başlatılmamış Değer Raporları Neden Gecikir
memcheck, başlatılmamış belleği okuduğunuz anda uyarı vermez. 'Tanımlılığı' izler ve yalnızca tanımsız bir değer bir dal, çıktı veya sistem çağrısı gibi gerçekten önem taşıdığında rapor verir.
Bu sayede başlatılmamış baytları zararsız biçimde kopyaladığınız durumlarda yanlış alarmlar önlenir.
Serbest Bıraktıktan Sonra Kullanım
Belleği serbest bıraktıktan sonra ona dokunmak tanımsız davranıştır. memcheck bunu kesin olarak tespit eder.
Invalid read of size 4 bildiriminin yanında Address ... is 0 bytes inside a block of size 4 free'd notunu verir ve free işleminin gerçekleştiği yeri de gösterir.
#include <stdlib.h>
#include <stdio.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 7;
free(p);
printf("%d\n", *p); /* read after free */
return 0;
}Çifte Serbest Bırakma
Aynı işaretçiyi iki kez serbest bırakmak, ayırıcıya ait muhasebe bilgilerini bozar.
memcheck Geçersiz free() bildirir ve hem geçerli serbest bırakma işlemini hem de özgün ayırmayı göstererek hatayı belirgin hâle getirir.
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
free(p);
free(p); /* freed twice */
return 0;
}Kökenleri İzleme
Başlatılmamış değer hataları için --track-origins=yes seçeneğini ekleyin.
memcheck böylece yalnızca hatalı değerin kullanıldığı yeri değil, oluşturulduğu yeri de bildirir; belirsiz bir uyarıyı kesin bir düzeltmeye dönüştürür.
valgrind --track-origins=yes ./progYığın ve Genel Değişkenler
memcheck, yığın hatalarını bulmada çok başarılıdır. Yığında veya genel dizilerde oluşan taşmalar için kapsamı daha zayıftır.
Bu durumda AddressSanitizer (gcc -fsanitize=address) genellikle daha iyi bir tercihtir. Bu iki araç birbirini tamamlar.
Bir Fazla veya Bir Eksik: Null Sonlandırıcı
Sık görülen bir yığın taşması, dize sonlandırıcısını unutmaktır. strlen, 'hello' için 5 döndürür; ancak sondaki '\0' karakterini depolamak için dizenin 6 bayta ihtiyacı vardır.
strcpy bu son baytı sonun ötesine yazdığında memcheck Geçersiz yazma bildirir.
#include <stdlib.h>
#include <string.h>
int main(void) {
char *s = malloc(strlen("hello")); /* needs +1 */
strcpy(s, "hello"); /* writes the '\0' past end */
free(s);
return 0;
}Hızlı Kontrol
Parçacık için memcheck'in ne bildirdiğini belirleyin.
Özet
Artık geçersiz erişim hatalarını fark edebilirsiniz:
- Sınır dışı okumalar/yazmalar, blok uzaklığıyla birlikte Geçersiz okuma/yazma olarak gösterilir
- Başlatılmamış değerler, bir kararı veya çıktıyı etkilediklerinde bildirilir
- Serbest bırakma sonrasında kullanım ve çifte serbest bırakma, her iki çağrı konumuyla birlikte algılanır
--track-origins=yestanımsız değerlerin kaynağını kesin olarak gösterir; yığın hataları için ASan ile birlikte kullanın
Sıradaki konu: tam raporu okumak.
Sıkça Sorulan Sorular
“Geçersiz Erişim” dersi ücretsiz mi?
Evet — “Geçersiz Erişim” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Geçersiz Erişim” dersinde ne öğreneceğim?
Sınır dışı ve başlatılmamış erişimler C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Geçersiz Erişim” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Valgrind Neden Kullanılır
- Sızıntıları Algılama
- Geçersiz Erişim
- Raporları Okuma