( bzt | 2024. 03. 07., cs – 14:38 )

Ha véletlenül egy másik változót írsz felül, azt nem veszi észre.
És a Go meg a Rust meg a többi csodanyelv hogy is veszi ezt észre? Mutass egy konkrét példát, ahol van két azonos típusú változó, a program a rosszba ír, és ezt észreveszi bármilyen fordító! BÁRMILYEN. Ha meg arra gondolsz, hogy egy másik változó címzésekor íródik felül, akkor fuss neki mégegyszer, hogy mi is az az ASAN és mire való, gugli a barátod! De elárulom, ezt az esetet észreveszi a C fordító statikus ellenőrzése és a valgrind is!
Parttalan ez a vita
Valóban értelmetlen, mert jól látszik, hogy az alapfogalmakkal sem vagy tisztában. Csak dobálózol itt olyan dolgokkal, amiket valahonnan hallottál, de valójában lövésed sincs, mit jelentenek. Már meg ne sértődj, de olyan vagy, mint egy indiai copy'n'paste huszár. Az meg kifejezetten hazugság megint, hogy a fenti példádra ne működne a határellenőrzés (sőt, úgy működik, hogy a forráshoz hozzá se kellett nyúlni!):
$ gcc -g -ansi -pedantic -Wall -Wextra -fsanitize=address trukkos.c rendeles.c
$ ./a.out 
=================================================================
==1223976==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x709dfb90903e at pc 0x709dfe07eee9 bp 0x7ffc67576a60 sp 0x7ffc675761f0
WRITE of size 150 at 0x709dfb90903e thread T0
    #0 0x709dfe07eee8 in __interceptor_vsprintf /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:1765
    #1 0x709dfe07f0ff in __interceptor_sprintf /usr/src/debug/gcc/gcc/libsanitizer/sanitizer_common/sanitizer_common_interceptors.inc:1808
    #2 0x5645eacaf2d4 in rendeles /home/bzt/rendeles.c:5
    #3 0x5645eacaf1c2 in main /home/bzt/trukkos.c:5
    #4 0x709dfde43ccf  (/usr/lib/libc.so.6+0x25ccf) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #5 0x709dfde43d89 in __libc_start_main (/usr/lib/libc.so.6+0x25d89) (BuildId: c0caa0b7709d3369ee575fcd7d7d0b0fc48733af)
    #6 0x5645eacaf0c4 in _start (/home/bzt/a.out+0x10c4) (BuildId: f5db83cafa76395ea660b7011a77367a4f6bb509)
De természetesen a valgrind is megfogja, még akkor is, ha ASAN nélkül lett fordítva:
$ valgrind ./a.out 
==1222365== Memcheck, a memory error detector
==1222365== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==1222365== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
==1222365== Command: ./a.out
==1222365== 
*** stack smashing detected ***: terminated
==1222365== 
==1222365== Process terminating with default action of signal 6 (SIGABRT): dumping core
==1222365==    at 0x491032C: __pthread_kill_implementation (pthread_kill.c:44)
==1222365==    by 0x48BF6C7: raise (raise.c:26)
==1222365==    by 0x48A74B7: abort (abort.c:79)
==1222365==    by 0x48A8394: __libc_message_impl.cold (libc_fatal.c:132)
==1222365==    by 0x499773A: __fortify_fail (fortify_fail.c:24)
==1222365==    by 0x4998A55: __stack_chk_fail (stack_chk_fail.c:24)
==1222365==    by 0x1091CB: rendeles (rendeles.c:6)
==1222365==    by 0x206F746174756D6B: ???
==1222365==    by 0x762065746572656C: ???
==1222365==    by 0x62626F74202C6E60: ???
==1222365==    by 0x303320746E696D1F: ???
==1222365==    by 0x2C757A73736F681F: ???
==1222365== 
Tessék, itt az egyértelmű, tagadhatatlan bizonyíték, hogy nem kell szétbarmolni és túlbonyolítani egy nyelvet ahhoz, hogy legyen memóriaellenőrzésed! És felhívnám a figyelemed, hogy TE adtad a példát, én semmit sem változtattam a forráson, egyetlen betűt sem kellett hozzátennem azért, hogy ez működjön! A baj az, hogy fogalmad sincs, hogy működik valójában a határellenőrzés (és a Rust fordító sem csinál mást, mint hogy csont ugyanazt az ellenőrző kódot generálja, mint a "-fsantize=address" hatására a gcc), nem tudod, mi a különbség a szintaktikai és szemantikai ellenőrzés között, és mégis próbálod osztani itt az észt.