Code review, ¿de dónde es este código?

Code review, ¿de dónde es este código?
Sin comentarios Facebook Twitter Flipboard E-mail

Una de las mejores prácticas para aprender a escribir buen código es leer lo que han escrito otros. Y si son ejemplos de éxito, todavía mejor; aunque del mal código también se puede aprender por lo menos a reconocer los patrones a evitar.

Por eso, queremos proponeros una nueva sección donde revisar el código fuente de algunos de los proyectos más conocidos del software libre. Y para hacerlo más entretenido, lo vamos a organizar a modo de concurso, mostrándoos parte del código fuente para ver quién es capaz de reconocerlo.

Las pistas

Como reconocer un código por su aspecto puede ser un poco duro, vamos a daros unas pistas con las que debería resultaros mucho más fácil.

Este código, escrito principalmente en C y algo de ensamblador, supuso uno de los grandes hitos del software libre, a pesar de que en principio no tenía muchas pretensiones de ser algo profesional, sino un mero entretenimiento con afán de aprendizaje.

En su primera versión, a principios de la década de los 90, contaba con poco más de 10.000 líneas. A día de hoy, el proyecto sigue vivo y recientemente ha superado la "versión π", con más de 10 millones de líneas de código.

El código

Las siguientes líneas corresponden a aquella primera versión 0.01:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 *       contains the low-level code for most hardware faults.
 * page_exception is handled by the mm, so that isn't here. This
 * file also handles (hopefully) fpu-exceptions due to TS-bit, as
 * the fpu must be properly saved/resored. This hasn't been tested.
 */
 
.globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op
.globl _device_not_available,_double_fault,_coprocessor_segment_overrun
.globl _invalid_TSS,_segment_not_present,_stack_segment
.globl _general_protection,_coprocessor_error,_reserved
 
_divide_error:
    pushl $_do_divide_error
no_error_code:
    xchgl %eax,(%esp)
    pushl %ebx
    pushl %ecx
    pushl %edx
    pushl %edi
    pushl %esi
    pushl %ebp
    push %ds
    push %es
    push %fs
    pushl $0        # "error code"
    lea 44(%esp),%edx
    pushl %edx
    movl $0x10,%edx
    mov %dx,%ds
    mov %dx,%es
    mov %dx,%fs
    call *%eax
    addl $8,%esp
    pop %fs
    pop %es
    pop %ds
    popl %ebp
    popl %esi
    popl %edi
    popl %edx
    popl %ecx
    popl %ebx
    popl %eax
    iret
 
_debug:
    pushl $_do_int3       # _do_debug
    jmp no_error_code
 
_nmi:
    pushl $_do_nmi
    jmp no_error_code
 
_int3:
    pushl $_do_int3
    jmp no_error_code
 
_overflow:
    pushl $_do_overflow
    jmp no_error_code
 
_bounds:
    pushl $_do_bounds
    jmp no_error_code
 
_invalid_op:
    pushl $_do_invalid_op
    jmp no_error_code
 
math_emulate:
    popl %eax
    pushl $_do_device_not_available
    jmp no_error_code
_device_not_available:
    pushl %eax
    movl %cr0,%eax
    bt $2,%eax          # EM (math emulation bit)
    jc math_emulate
    clts                # clear TS so that we can use math
    movl _current,%eax
    cmpl _last_task_used_math,%eax
    je 1f               # shouldn't happen really ...
    pushl %ecx
    pushl %edx
    push %ds
    movl $0x10,%eax
    mov %ax,%ds
    call _math_state_restore
    pop %ds
    popl %edx
    popl %ecx
1:  popl %eax
    iret
 
_coprocessor_segment_overrun:
    pushl $_do_coprocessor_segment_overrun
    jmp no_error_code
 
_reserved:
    pushl $_do_reserved
    jmp no_error_code
 
_coprocessor_error:
    pushl $_do_coprocessor_error
    jmp no_error_code
 
_double_fault:
    pushl $_do_double_fault
error_code:
    xchgl %eax,4(%esp)      # error code <-> %eax
    xchgl %ebx,(%esp)       # &function <-> %ebx
    pushl %ecx
    pushl %edx
    pushl %edi
    pushl %esi
    pushl %ebp
    push %ds
    push %es
    push %fs
    pushl %eax          # error code
    lea 44(%esp),%eax       # offset
    pushl %eax
    movl $0x10,%eax
    mov %ax,%ds
    mov %ax,%es
    mov %ax,%fs
    call *%ebx
    addl $8,%esp
    pop %fs
    pop %es
    pop %ds
    popl %ebp
    popl %esi
    popl %edi
    popl %edx
    popl %ecx
    popl %ebx
    popl %eax
    iret
 
_invalid_TSS:
    pushl $_do_invalid_TSS
    jmp error_code
 
_segment_not_present:
    pushl $_do_segment_not_present
    jmp error_code
 
_stack_segment:
    pushl $_do_stack_segment
    jmp error_code
 
_general_protection:
    pushl $_do_general_protection
    jmp error_code

El reto

¿Lo habéis reconocido? Si es así, ¿seríais capaces de decirnos...

  • ...a qué fichero corresponde este fragmento de código?

  • ...qué comentario acompañó al commit o subida de este código?

  • ...quién es su autor?

Esperamos vuestras respuestas en los comentarios.

<!--

-->

Comentarios cerrados
Inicio
×

Utilizamos cookies de terceros para generar estadísticas de audiencia y mostrar publicidad personalizada analizando tu navegación. Si sigues navegando estarás aceptando su uso. Más información