Видно что
buf[idx]++;
компилятор выкинул
Кстати если inline отключить, т.е. и Pow и Int2Str будут как функции!
Все равно buf[idx]++; выкидывает!
На самом деле бага довольно серьезная!!! И может вылезти в проектах
Если в цикле используется buf[i]++, а после цикла присваивание последнему элементу массива проявляется!
Для иллюстрации 2 простых функции
Код
void test_bug(uint32_t v, uint8_t *buf)
{
unsigned i;
for(i=0;i<3;i++){
buf[i]='0';
if (v & 1<<i)
buf[i]++;
}
buf[i]=v & 0x8;
}
void test_bug2(uint32_t v, uint8_t *buf)
{
unsigned i;
for(i=0;i<3;i++){
buf[i]='0';
if (v & 1<<i)
buf[i]++;
}
}
А вот листинг
Код
19 void test_bug(uint32_t v, uint8_t *buf)
20 {
21 unsigned i;
22 for(i=0;i<3;i++){
23 buf[i]='0';
24 if (v & 1<<i)
25 buf[i]++;
26 }
27 buf[i]=v & 0x8;
\ test_bug:
\ 00000000 0x2208 MOVS R2,#+8
\ 00000002 0x4010 ANDS R0,R0,R2
\ 00000004 0x70C8 STRB R0,[R1, #+3]
28 }
\ 00000006 0x4770 BX LR ;; return
29
\ In section .text, align 2, keep-with-next
30 void test_bug2(uint32_t v, uint8_t *buf)
31 {
\ test_bug2:
\ 00000000 0xB418 PUSH {R3,R4}
32 unsigned i;
33 for(i=0;i<3;i++){
\ 00000002 0x2230 MOVS R2,#+48
34 buf[i]='0';
\ 00000004 0x2330 MOVS R3,#+48
35 if (v & 1<<i)
\ 00000006 0x07C4 LSLS R4,R0,#+31
\ 00000008 0xD500 BPL ??test_bug2_0
36 buf[i]++;
\ 0000000A 0x2331 MOVS R3,#+49
\ ??test_bug2_0:
\ 0000000C 0x700B STRB R3,[R1, #+0]
\ 0000000E 0x2330 MOVS R3,#+48
\ 00000010 0x0784 LSLS R4,R0,#+30
\ 00000012 0xD500 BPL ??test_bug2_1
\ 00000014 0x2331 MOVS R3,#+49
\ ??test_bug2_1:
\ 00000016 0x704B STRB R3,[R1, #+1]
\ 00000018 0x0740 LSLS R0,R0,#+29
\ 0000001A 0xD500 BPL ??test_bug2_2
\ 0000001C 0x2231 MOVS R2,#+49
\ ??test_bug2_2:
\ 0000001E 0x708A STRB R2,[R1, #+2]
37 }
38 }
\ 00000020 0xBC11 POP {R0,R4}
\ 00000022 0x4770 BX LR ;; return
\ In section .text, align 4, keep-with-next
\ ??DataTable0:
\ 00000000 0x........ DC32 buf
Видно что в первом варианте код весь убран!
Вы будете смеяться!!!все еще проще

void test_bug3(uint8_t *buf)
{
unsigned i;
for(i=0;i<3;i++){
buf[i]=0;
}
buf[i]=0;
}
Код
In section .text, align 2, keep-with-next
40 void test_bug3(uint8_t *buf)
41 {
42 unsigned i;
43 for(i=0;i<3;i++){
44 buf[i]=0;
45 }
46 buf[i]=0;
\ test_bug3:
\ 00000000 0x2100 MOVS R1,#+0
\ 00000002 0x70C1 STRB R1,[R0, #+3]
47 }
\ 00000004 0x4770 BX LR ;; return