DedSec Project

Γλωσσάρι: encoding, εξαιρέσεις και εκφράσεις — DedSec Project

Γλωσσάρι: encoding, εξαιρέσεις και εκφράσεις Encoding Σημασία και περιορισμοί Encoding είναι ο κανόνας μετατροπής χαρακτήρων σε bytes και αντίστροφα. Το UTF-8 χρησιμοποιεί μεταβλητό πλήθος…

Encoding

Σημασία και περιορισμοί

Encoding είναι ο κανόνας μετατροπής χαρακτήρων σε bytes και αντίστροφα. Το UTF-8 χρησιμοποιεί μεταβλητό πλήθος bytes ανά code point. Με λάθος decoding εμφανίζεται error ή αλλοιωμένο κείμενο· byte offset και character index δεν ταυτίζονται.

Πρακτικό παράδειγμα

text = 'Γεια'
data = text.encode('utf-8')
assert data.decode('utf-8') == text
assert len(data) > len(text)

Άσκηση και παγίδα

Γράψε bytes σε προσωρινό binary αρχείο, διάβασέ τα ως UTF-8 και μετά δοκίμασε το άκυρο byte b'\xff' με UnicodeDecodeError. Μην κρύβεις απώλεια δεδομένων με errors='ignore'.

Επιπλέον πηγή: https://docs.python.org/3/howto/unicode.html

Exception

Σημασία και περιορισμοί

Exception αναφέρει μη κανονική κατάσταση και μεταφέρει τον έλεγχο σε handler. Ένα συγκεκριμένο catch στο κατάλληλο boundary χειρίζεται αναμενόμενη αποτυχία χωρίς να κρύβει άλλα bugs. Γενικό catch που επιστρέφει success είναι επικίνδυνο.

Πρακτικό παράδειγμα

def port(text):
    try: number = int(text)
    except ValueError as exc: raise ValueError('port must be decimal') from exc
    if not 1 <= number <= 65535: raise ValueError('port out of range')
    return number
assert port('443') == 443

Άσκηση και παγίδα

Δοκίμασε 'abc', '0' και '65536' χωριστά. Σχεδίασε σε ποιο layer γίνεται raise και πού catch, χρησιμοποιώντας raise ... from ... για να διατηρηθεί η αρχική αιτία.

Επιπλέον πηγή: https://docs.python.org/3/tutorial/errors.html

Expression

Σημασία και περιορισμοί

Expression είναι στοιχείο του κώδικα που αξιολογείται σε τιμή· statement είναι εντολή της γραμματικής. Operators, precedence και side effects αλλάζουν το αποτέλεσμα. Οι παρενθέσεις βοηθούν στην πρόθεση ακόμη κι αν οι κανόνες precedence αρκούν.

Πρακτικό παράδειγμα

a, b, c = 2, 3, 4
assert a + b * c == 14
assert (a + b) * c == 20
square = lambda n: n * n
assert square(a + 1) == 9

Άσκηση και παγίδα

Σχεδίασε syntax trees των 2+3*4 και (2+3)*4. Ξεχώρισε n = 5 (ανάθεση) από n == 5 (σύγκριση) στην Python και πρόβλεψε την έξοδο πριν εκτελέσεις.

Επιπλέον πηγή: https://docs.python.org/3/reference/expressions.html

File descriptor

Σημασία και περιορισμοί

Σε POSIX συστήματα το file descriptor είναι ακέραιος handle για ανοικτό file, pipe ή socket. Συνήθως stdin=0, stdout=1, stderr=2. Το descriptor δείχνει ανοικτό resource, όχι απευθείας filename.

Πρακτικό παράδειγμα

import os
read_fd, write_fd = os.pipe()
try:
    os.write(write_fd, b'ok')
    assert os.read(read_fd, 2) == b'ok'
finally:
    os.close(read_fd); os.close(write_fd)

Άσκηση και παγίδα

Εξήγησε γιατί και τα δύο ends του pipe πρέπει να κλείνουν σε επιτυχία και αποτυχία. Ερεύνησε descriptor leaks. Τα POSIX APIs δεν είναι ίδια σε κάθε Windows setup.

Επιπλέον πηγή: https://docs.python.org/3/library/os.html#file-descriptor-operations

Finite state machine

Σημασία και περιορισμοί

Finite-state machine μοντελοποιεί ένα σύστημα με πεπερασμένες καταστάσεις και επιτρεπόμενες μεταβάσεις. Αντί για ανεξάρτητα booleans is_loading/is_done/is_error που μπορεί να αντιφάσκουν, ένα enum επιβάλλει αμοιβαία αποκλειόμενες καταστάσεις.

Πρακτικό παράδειγμα

from enum import Enum
class Status(Enum): IDLE=1; LOADING=2; DONE=3
allowed = {Status.IDLE:{Status.LOADING}, Status.LOADING:{Status.DONE}, Status.DONE:set()}
assert Status.DONE in allowed[Status.LOADING]

Άσκηση και παγίδα

Σχεδίασε μετάβαση DONE→LOADING μόνο αν το σύστημα επιτρέπει πραγματικά retry. Δοκίμασε άκυρο άλμα IDLE→DONE και περιέγραψε σε ποιο layer απορρίπτεται.

Επιπλέον πηγή: https://en.wikipedia.org/wiki/Finite-state_machine