Se lo studente cancella accidentalmente il file sorgente, come eseguire la correzione, avendo a disposizione solo il file eseguibile?
Correzione senza sorgenti
Il test di funzionamento
Prima di tutto si può effettuare un test di funzionamento del programma .exe per combinazioni opportune degli input.
(Potete trovare il testo della verifica e il template fornito agli studenti nella prima parte di questa serie.)
TEST standard
Inserire il numero di dipendenti :3
Quante ore ha lavorato il dipendente? 10
Le ore di lavoro straordinario sono: 2
Quante ore ha lavorato il dipendente? 8
Le ore di lavoro straordinario sono: 0
Quante ore ha lavorato il dipendente? 12
Le ore di lavoro straordinario sono: 4
Il totale di ore di straordinario sono: 6
La media delle ore lavorate sono: 10
RISULTATO: OK
TEST con media con la virgola
Inserire il numero di dipendenti :2
Quante ore ha lavorato il dipendente? 10
Le ore di lavoro straordinario sono: 2
Quante ore ha lavorato il dipendente? 7
Nessuna ora di straordinario!!
Il totale di ore di straordinario sono: 2
La media delle ore lavorate sono: 8
RISULTATO: la media perde i decimali
TEST con ore negative
Inserire il numero di dipendenti :2
Quante ore ha lavorato il dipendente? -5
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 10
Le ore di lavoro straordinario sono: 2
Il totale di ore di straordinario sono: 2
La media delle ore lavorate sono: 2
RISULTATO: calcolo totale e media errati
TEST con n zero
Inserire il numero di dipendenti :0
Il totale di ore di straordinario sono: 0
RISULTATO: il programma attende un cin
TEST n negativo
Inserire il numero di dipendenti :-1
Quante ore ha lavorato il dipendente? 5
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 2
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 2
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 5
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 5
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 1
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente? 5
Nessuna ora di straordinario!!
Quante ore ha lavorato il dipendente?
RISULTATO: ..... ciclo infinito
Purtroppo l’eseguibile non sembrava contenere gli esercizi 2 e 3, ma non tutto era perduto.
Ricostruire i sorgenti
Ho provato a ricostruire i sorgenti utilizzando il decompilatore online Decompiler Explorer. Quello che ho ottenuto non era compilabile, ma mi ha aiutato ad individuare i test di funzionamento più opportuni per trovare gli errori
1 /* Ricostruito con Hex-Rays */
2
3
4 //18-01-2025
5
6 __int64 __fastcall esercizio1(__int64 a1, __int64 a2)
7 {
8 __int64 v2; // rax
9 __int64 v3; // rax
10 __int64 v4; // rax
11 __int64 v5; // rax
12 __int64 v6; // rax
13 __int64 v7; // rax
14 int v9; // [rsp+20h] [rbp-20h] BYREF
15 int v10; // [rsp+24h] [rbp-1Ch] BYREF
16 unsigned int v11; // [rsp+28h] [rbp-18h]
17 unsigned int v12; // [rsp+2Ch] [rbp-14h]
18 int v13; // [rsp+30h] [rbp-10h]
19 int v14; // [rsp+34h] [rbp-Ch]
20 unsigned int v15; // [rsp+38h] [rbp-8h]
21 int v16; // [rsp+3Ch] [rbp-4h]
22
23 v16 = 0;
24 v15 = 0;
25 v14 = 8;
26 std::operator<<<std::char_traits<char>>(a1, a2, "Inserire il numero di dipendenti :", refptr__ZSt4cout);
27 std::istream::operator>>(a1, a2, &v10, refptr__ZSt3cin);
28 v13 = v10;
29 while ( v10 )
30 {
31 std::operator<<<std::char_traits<char>>(a1, a2, "Quante ore ha lavorato il dipendente? ", refptr__ZSt4cout);
32 std::istream::operator>>(a1, a2, &v9, refptr__ZSt3cin);
33 v16 += v9;
34 if ( v14 <= v9 )
35 {
36 v12 = v9 - v14;
37 v15 += v9 - v14;
38 v3 = std::operator<<<std::char_traits<char>>(a1, a2, "Le ore di lavoro straordinario sono: ", refptr__ZSt4cout);
39 v2 = std::ostream::operator<<(a1, a2, v12, v3);
40 }
41 else
42 {
43 v2 = std::operator<<<std::char_traits<char>>(a1, a2, "Nessuna ora di straordinario!!", refptr__ZSt4cout);
44 }
45 std::ostream::operator<<(a1, a2, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, v2);
46 --v10;
47 }
48 v4 = std::operator<<<std::char_traits<char>>(a1, a2, "Il totale di ore di straordinario sono: ", refptr__ZSt4cout);
49 v5 = std::ostream::operator<<(a1, a2, v15, v4);
50 std::ostream::operator<<(a1, a2, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, v5);
51 v11 = v16 / v13;
52 v6 = std::operator<<<std::char_traits<char>>(a1, a2, "La media delle ore lavorate sono: ", refptr__ZSt4cout);
53 v7 = std::ostream::operator<<(a1, a2, v11, v6);
54 std::ostream::operator<<(a1, a2, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, v7);
55 return 0LL;
56 }
57
58 //----- (000000000000016B) ----------------------------------------------------
59 __int64 esercizio2(void)
60 {
61 return 0LL;
62 }
63
64 //----- (0000000000000171) ----------------------------------------------------
65 __int64 __fastcall esercizio3(__int64 a1, __int64 a2, __int64 a3)
66 {
67 __int64 v3; // rdx
68 __int64 v4; // rax
69 __int64 v6; // [rsp+0h] [rbp-68h] BYREF
70 int v7; // [rsp+2Ch] [rbp-3Ch] BYREF
71 _BYTE v8[56]; // [rsp+30h] [rbp-38h] BYREF
72
73 std::string::basic_string(a1, a2, a3, &v6 + 6);
74 std::operator<<<std::char_traits<char>>(a1, a2, "Inserire una parola: ", refptr__ZSt4cout);
75 std::operator>><char>(a1, a2, v8, refptr__ZSt3cin);
76 std::operator<<<std::char_traits<char>>(
77 a1,
78 a2,
79 "Ora inserire il numero di volte che si vuole ripetere la parola: ",
80 refptr__ZSt4cout);
81 std::istream::operator>>(a1, a2, &v7, refptr__ZSt3cin);
82 while ( v7 > 0 )
83 {
84 v4 = std::operator<<<char>(a1, a2, v8, refptr__ZSt4cout);
85 std::ostream::operator<<(a1, a2, refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, v4);
86 --v7;
87 }
88 std::string::~string(a1, a2, v3, v8);
89 return 0LL;
90 }
Dalla ricostruzione dei sorgenti è possibile verificare agevolmente che, mentre l’esercizio 2 non è stato svolto, l’esercizio 3 è invece presente ed è corretto. Ciò nonostante, purtroppo, questo elaborato non raggiunge la sufficienza.
Proseguendo nella correzione, mi sono imbattuta in due compiti molto simili tra di loro.
Nella terza parte di questa serie ci occuperemo di effettuare un controllo anti plagio.