Prezentacja z barcampu firmy semihalf. Spotkanie miało formę interaktywnego quizu. Zaprezentowaliśmy kilkanaście nietypowych bugów, z którymi mieliśmy do czynienia. Uczestnicy wskazywali właściwe rozwiązania.
4. Stan:
- Urządzenie wyposażone jest w moduł WiFi, lutowany
bezpośrednio do płyty głównej, który poprzez I2C steruje
przekaźnikami.
Problem:
- Po przeniesieniu do serwerowni, urządzenie niepoprawnie
obsługuje protokół I2C (złe napięcia na linii).
Pytanie:
- Jaka jest przyczyna awarii?
a) zakłócenia EM od pobliskich serwerów upośledzają pracę układu
b) złośliwy sąsiad wysyła pakiety WiFi-killer z piwnicy
c) dostarczone przez producenta modułu SDK ma niską jakość
d) wilgoć zakłócająca działanie układu
www.pollev.com/buglegends405
5. Stan:
- Urządzenie wyposażone jest w moduł WiFi, lutowany
bezpośrednio do płyty głównej, który poprzez I2C steruje
przekaźnikami.
Problem:
- Po przeniesieniu do serwerowni, urządzenie niepoprawnie
obsługuje protokół I2C (złe napięcia na linii).
Pytanie:
- Jaka jest przyczyna awarii?
a) zakłócenia EM od pobliskich serwerów upośledzają pracę układu
b) złośliwy sąsiad wysyła pakiety WiFi-killer z piwnicy
c) dostarczone przez producenta modułu SDK ma niską jakość
d) wilgoć zakłócająca działanie układu
www.pollev.com/buglegends405
6. Stan:
- dwa urządzenia, Host i Karta Sieciowa, połączone kablem
PCIe o długości 10cm
Problem:
- po przełożeniu zestawu z biurka do labu, duży transfer
powoduje powstanie błędów transmisji na PCIe
Pytanie:
- Co zostało użyte do naprawy?
a) młotek ze stali St500
b) opakowanie czekolady Milka
c) spinacz biurowy i pudełko zapałek
d) WD40 i taśma izolacyjna
www.pollev.com/buglegends405
7. a) młotek ze stali St500
b) opakowanie czekolady Milka
c) spinacz biurowy i pudełko zapałek
d) WD40 i taśma izolacyjna
www.pollev.com/buglegends405
9. a) zależy od architektury
b) 1
c) 4
d) nie jest zdefiniowany przez standard
sizeof(char) == ?
www.pollev.com/buglegends405
10. sizeof(char) == 1
6.5.3.4 The sizeof and _Alignof operators
4. When sizeof is applied to an operand that
has type char, unsigned char, or
signed char, (or a qualified version thereof)
the result is 1.
a) zależy od architektury
b) 1
c) 4
d) Nie jest zdefiniowany przez standard
www.pollev.com/buglegends405
11. Ile bitów mieści char?
a) zależy od architektury
b) 7
c) 8
d) nie jest zdefiniowany przez standard
www.pollev.com/buglegends405
12. Ile bitów mieści char ?
5.2.4.2.1 Sizes of integer types <limits.h>
(...) Their implementation-defined values shall be equal or greater in magnitude (absolute
value) to those shown, with the same sign.
—number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
const size_t BitsInByte = CHAR_BIT * sizeof(char);
a) zależy od architektury
b) 7
c) 8
d) Nie jest zdefiniowany przez standard
www.pollev.com/buglegends405
13. a) 0
b) 1
c) sizeof(char*)
d) zachowanie niezdefiniowane (Undefined Behaviour)
struct X {
;
};
sizeof(struct X) = ? *
*
wg ISO C
www.pollev.com/buglegends405
14. a) 0
b) 1
c) sizeof(char*)
d) Zachowanie niezdefiniowane (Undefined Behaviour)
struct X {
;
};
Standard C11 (Draft N1570)
6.7.2.1 Structure and union specifiers
7. If the struct-declaration-list contains no named members,
the behavior is undefined.
www.pollev.com/buglegends405
16. a) 8
b) 16
c) Nie skompiluje się
d) Zachowanie niezdefiniowane
struct X {
uint64_t a;
char arr[];
};
printf("sizeof(X) = %lun", sizeof(struct X));
*
* wg ISO C
www.pollev.com/buglegends405
17. a) 8
b) 16
c) Nie skompiluje się
d) Zachowanie niezdefiniowane
struct X {
uint64_t a;
char arr[];
};
printf("sizeof...
6.7.2.1 Structure and union
specifiers
3. …, except that the last member of a
structure with more than one named member
may have incomplete array type; such a
structure (and any union containing,
possibly recursively, a member that is such
a structure) shall not be a member of a
structure or an element of an array.
To nie jest arr[0]
www.pollev.com/buglegends405
18. #define DATA_SIZE
struct X {
uint64_t a;
char arr[DATA_SIZE];
};
f (void) {
int a;
struct X object;
object.arr[0] = ...
www.pollev.com/buglegends405
19. struct proto_hdr {
uint16_t type; /* data type */
uint16_t size; /* data size in bytes */
char data[]; /* flexible array member - pointer to
payload */
};
uint16_t size = 64;
struct proto_hdr *h = malloc (
sizeof (struct
proto_hdr) +
sizeof (char [size]));
h->type = TOP_SECRET_PAYLOAD;
h->size = size;
www.pollev.com/buglegends405
20. a) sizeof (struct ab) == 4; sizeof ( struct a0b) == 4;
b) sizeof (struct ab) == 4; sizeof ( struct a0b) == 8;
c) sizeof (struct ab) == 8; sizeof ( struct a0b) == 8;
d) Nie skompiluje się
struct ab{
int a : 1;
int b : 1;
};
struct a0b{
int a : 1;
int : 0;
int b : 1;
};
sizeof (struct ab) == ?
sizeof (struct a0b) == ?
*
wg ISO C
www.pollev.com/buglegends405
21. a) sizeof (struct ab) == 4; sizeof ( struct a0b) == 4;
b) sizeof (struct ab) == 4; sizeof ( struct a0b) == 8;
c) sizeof (struct ab) == 8; sizeof ( struct a0b) == 8;
d) Nie skompiluje się
struct ab{
int a : 1;
int b : 1;
};
struct a0b{
int a : 1;
int : 0;
int b : 1;
};
6.7.2.1 Structure and union specifiers
As a special case, a bit-field structure
member with a width of 0 indicates that
no further bit-field is to be packed
into the unit in which the previous bit-
field, if any, was placed.
www.pollev.com/buglegends405
22. struct nextvend {
u_char nv_magic[4]; /* Magic number for vendor specificity
*/
u_char nv_version; /* NeXT protocol version */
/*
* Round the beginning
* of the union to a 16
* bit boundary due to
* struct/union alignment
* on the m68k.
*/
unsigned short :0;
union {
u_char NV0[58];
struct {
u_char NV1_opcode; /* opcode - Version 1 */
u_char NV1_xid; /* transcation id */
u_char NV1_text[NVMAXTEXT]; /* text */
u_char NV1_null; /* null terminator */
} NV1;
} nv_U;
...
Źródło: https://github.com/apple/darwin-xnu/blob/master/bsd/netinet/bootp.h#L97
www.pollev.com/buglegends405
23. CPU0
System wbudowany
interfejs SSI
CPU0 i CPU1 w osobnych IC
Brak MMU – adresowanie fizyczne
ETH
SSI – Synchronous Serial Interface
ETH → CPU0 → SSI → CPU1
Problem – co jakiś czas błąd krytyczny
sterty na CPU0 powoduje reset całego systemu
CPU1 → SSI → CPU0 → ETH
Jaka jest przyczyna błędu krytycznego na stercie?
ETH
CPU1
www.pollev.com/buglegends405
24. Jaka jest przyczyna błędu krytycznego na stercie ?
a) błąd w sprzęcie
b) wyścig i brak walidacji danych w driverze interfejsu SSI
c) błąd w implementacji sterty
d) błąd w dokumentacji CPU
Jaka jest przyczyna błędu krytycznego na stercie ? www.pollev.com/buglegends405
25. a) błąd w sprzęcie
b) wyścig i brak walidacji danych w driverze interfejsu SSI
c) błąd w implementacji sterty
d) błąd w dokumentacji CPU
Jaka jest przyczyna błędu krytycznego na stercie ?
Jaka jest przyczyna błędu krytycznego na stercie ?
26. Wyjaśnienie
interfejs SSI
CPU0 CPU1
Format ramki SSI HEADER | PAYLOAD
LEN | TYPE
CPU1 wysyła ramkę bez sprawdzenia czy
transmisja poprzedniej już się zakończyła
request #1
reply #1
request #2
reply #2
CPU0 skopiuje dane z SSI bez
sprawdzenia wielkości bufora
docelowego i uszkodzi dane
kontrolne sterty
27. Programuj wbrew regułom!
29.05. gdz. 19:00
Drugie życie elektroniki.
Jak z routera zrobić nierouter?
13.06 gdz. 19:00
Oczyszczacz powietrza i stos sieciowy?
Czas na test!