Translated ['src/todo/rust-basics.md'] to el

This commit is contained in:
Translator 2025-07-22 21:50:19 +00:00
parent a0f8a7d607
commit d0e159d1d6

View File

@ -32,7 +32,7 @@ Some(T),
### Μακροεντολές
Οι μακροεντολές είναι πιο ισχυρές από τις συναρτήσεις επειδή επεκτείνονται για να παράγουν περισσότερο κώδικα από τον κώδικα που έχετε γράψει χειροκίνητα. Για παράδειγμα, μια υπογραφή συνάρτησης πρέπει να δηλώνει τον αριθμό και τον τύπο των παραμέτρων που έχει η συνάρτηση. Οι μακροεντολές, από την άλλη πλευρά, μπορούν να δέχονται μεταβλητό αριθμό παραμέτρων: μπορούμε να καλέσουμε `println!("hello")` με ένα επιχείρημα ή `println!("hello {}", name)` με δύο επιχειρήματα. Επίσης, οι μακροεντολές επεκτείνονται πριν ο μεταγλωττιστής ερμηνεύσει τη σημασία του κώδικα, έτσι μια μακροεντολή μπορεί, για παράδειγμα, να υλοποιήσει ένα trait σε έναν δεδομένο τύπο. Μια συνάρτηση δεν μπορεί, επειδή καλείται κατά την εκτέλεση και ένα trait πρέπει να υλοποιείται κατά τη διάρκεια της μεταγλώττισης.
Οι μακροεντολές είναι πιο ισχυρές από τις συναρτήσεις επειδή επεκτείνονται για να παράγουν περισσότερο κώδικα από τον κώδικα που έχετε γράψει χειροκίνητα. Για παράδειγμα, μια υπογραφή συνάρτησης πρέπει να δηλώνει τον αριθμό και τον τύπο των παραμέτρων που έχει η συνάρτηση. Οι μακροεντολές, από την άλλη πλευρά, μπορούν να δέχονται μεταβλητό αριθμό παραμέτρων: μπορούμε να καλέσουμε `println!("hello")` με ένα επιχείρημα ή `println!("hello {}", name)` με δύο επιχειρήματα. Επίσης, οι μακροεντολές επεκτείνονται πριν ο μεταγλωττιστής ερμηνεύσει τη σημασία του κώδικα, έτσι μια μακροεντολή μπορεί, για παράδειγμα, να υλοποιήσει ένα trait σε έναν δεδομένο τύπο. Μια συνάρτηση δεν μπορεί, επειδή καλείται κατά την εκτέλεση και ένα trait πρέπει να υλοποιηθεί κατά τη διάρκεια της μεταγλώττισης.
```rust
macro_rules! my_macro {
() => {
@ -57,7 +57,7 @@ println!("Check out my macro!");
}
}
```
### Επαναλάβετε
### Επανάληψη
```rust
// Iterate through a vector
let my_fav_fruits = vec!["banana", "raspberry"];
@ -205,7 +205,7 @@ println!("The word is: {}", word);
println!("The optional word doesn't contain anything");
}
```
#### ενώ ας
#### ενώ άφησε
```rust
let mut optional = Some(0);
// This reads: "while `let` destructures `optional` into
@ -269,7 +269,7 @@ println!("{:?}", apple);
```
#### Threads
Σε αυτή την περίπτωση θα περάσουμε το νήμα μια μεταβλητή που θα μπορεί να τροποποιήσει
Σε αυτή την περίπτωση θα περάσουμε στο νήμα μια μεταβλητή που θα μπορεί να τροποποιήσει
```rust
fn main() {
let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));
@ -287,4 +287,71 @@ thread::sleep(Duration::from_millis(500));
}
}
```
### Απαραίτητα για την Ασφάλεια
Το Rust παρέχει ισχυρές εγγυήσεις ασφάλειας μνήμης από προεπιλογή, αλλά μπορείτε να εισαγάγετε κρίσιμες ευπάθειες μέσω του `unsafe` κώδικα, προβλημάτων εξάρτησης ή λογικών λαθών. Το παρακάτω μίνι-φυλλάδιο συγκεντρώνει τις βασικές έννοιες που θα αγγίξετε πιο συχνά κατά τη διάρκεια επιθεωρήσεων ασφάλειας του Rust λογισμικού.
#### Unsafe κώδικας & ασφάλεια μνήμης
Τα `unsafe` μπλοκ αποποιούνται τους ελέγχους αναφοράς και ορίων του μεταγλωττιστή, οπότε **όλα τα παραδοσιακά σφάλματα διαφθοράς μνήμης (OOB, χρήση μετά την απελευθέρωση, διπλή απελευθέρωση, κ.λπ.) μπορούν να εμφανιστούν ξανά**. Μια γρήγορη λίστα ελέγχου:
* Αναζητήστε `unsafe` μπλοκ, `extern "C"` συναρτήσεις, κλήσεις σε `ptr::copy*`, `std::mem::transmute`, `MaybeUninit`, ακατέργαστους δείκτες ή `ffi` μονάδες.
* Επικυρώστε κάθε αριθμητική δείκτη και παράμετρο μήκους που περνάτε σε χαμηλού επιπέδου συναρτήσεις.
* Προτιμήστε το `#![forbid(unsafe_code)]` (σε όλο το crate) ή το `#[deny(unsafe_op_in_unsafe_fn)]` (1.68 +) για να αποτύχει η μεταγλώττιση όταν κάποιος επαναφέρει το `unsafe`.
Παράδειγμα υπερχείλισης που δημιουργήθηκε με ακατέργαστους δείκτες:
```rust
use std::ptr;
fn vuln_copy(src: &[u8]) -> Vec<u8> {
let mut dst = Vec::with_capacity(4);
unsafe {
// ❌ copies *src.len()* bytes, the destination only reserves 4.
ptr::copy_nonoverlapping(src.as_ptr(), dst.as_mut_ptr(), src.len());
dst.set_len(src.len());
}
dst
}
```
Η εκτέλεση του Miri είναι μια οικονομική μέθοδος για την ανίχνευση UB κατά τη διάρκεια των δοκιμών:
```bash
rustup component add miri
cargo miri test # hunts for OOB / UAF during unit tests
```
#### Auditing dependencies with RustSec / cargo-audit
Οι περισσότερες πραγματικές ευπάθειες Rust βρίσκονται σε τρίτες βιβλιοθήκες. Η βάση δεδομένων συμβουλών RustSec (με υποστήριξη της κοινότητας) μπορεί να ερωτηθεί τοπικά:
```bash
cargo install cargo-audit
cargo audit # flags vulnerable versions listed in Cargo.lock
```
Ενσωματώστε το στο CI και αποτύχετε με `--deny warnings`.
`cargo deny check advisories` προσφέρει παρόμοια λειτουργικότητα συν ελέγχους άδειας και λίστας απαγόρευσης.
#### Επαλήθευση αλυσίδας εφοδιασμού με cargo-vet (2024)
`cargo vet` καταγράφει ένα hash αναθεώρησης για κάθε crate που εισάγετε και αποτρέπει τις μη παρατηρημένες αναβαθμίσεις:
```bash
cargo install cargo-vet
cargo vet init # generates vet.toml
cargo vet --locked # verifies packages referenced in Cargo.lock
```
Το εργαλείο υιοθετείται από την υποδομή του έργου Rust και έναν αυξανόμενο αριθμό οργανισμών για να μετριάσει τις επιθέσεις με κακόβουλα πακέτα.
#### Fuzzing your API surface (cargo-fuzz)
Οι δοκιμές fuzz εύκολα ανιχνεύουν πανικούς, υπερχειλίσεις ακέραιων αριθμών και λογικά σφάλματα που μπορεί να γίνουν ζητήματα DoS ή side-channel:
```bash
cargo install cargo-fuzz
cargo fuzz init # creates fuzz_targets/
cargo fuzz run fuzz_target_1 # builds with libFuzzer & runs continuously
```
Προσθέστε τον στόχο fuzz στο αποθετήριο σας και εκτελέστε τον στην pipeline σας.
## Αναφορές
- RustSec Advisory Database <https://rustsec.org>
- Cargo-vet: "Auditing your Rust Dependencies" <https://mozilla.github.io/cargo-vet/>
{{#include ../banners/hacktricks-training.md}}