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.


comments powered by Disqus