LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

[kiv@kiv-hp15r161nr ~]$ cat test.c
#include <stdarg.h>
#include <stdbool.h>

void func1(va_list arg) {
        bool value = va_arg(arg, bool);
        (void)value;
}

void func2(va_list arg) {
        char value = va_arg(arg, char);
        (void)value;
}
[kiv@kiv-hp15r161nr ~]$ gcc -O2 -c -Wall -Wpedantic -Wextra -o test.o test.c
In file included from test.c:1:0:
test.c: В функции «func2»:
test.c:10:27: предупреждение: «char» преобразован к «int» при передаче через «...»
  char value = va_arg(arg, char);
                           ^
test.c:10:27: замечание: (поэтому «va_arg» нужно передать «int», а не «char»)
test.c:10:27: замечание: при достижении этого кода выполнение программы завершится аварийно
[kiv@kiv-hp15r161nr ~]$ objdump -d test.o

test.o:     формат файла elf64-x86-64
                                                                                                             
                                                                                                             
Дизассемблирование раздела .text:                                                                            
                                                                                                             
0000000000000000 <func1>:                                                                                    
   0:   0f 0b                   ud2                                                                          
   2:   0f 1f 40 00             nopl   0x0(%rax)                                                             
   6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)                                                  
   d:   00 00 00 

0000000000000010 <func2>:
  10:   0f 0b                   ud2  

Можно заметить, что для char тоже генерируется некорректный код, однако об этом компилятор явно предупреждает. А вот про bool молчит.

Как по мне либо он должен генерировать валидный код, либо выдавать предупреждение. А сейчас это какое-то молчаливое вредительство.

Исправление KivApple, :

[kiv@kiv-hp15r161nr ~]$ nano  test.c
[kiv@kiv-hp15r161nr ~]$ gcc -O2 -c -Wall -Wpedantic -Wextra -o test.o test.c
In file included from test.c:1:0:
test.c: В функции «func2»:
test.c:10:27: предупреждение: «char» преобразован к «int» при передаче через «...»
  char value = va_arg(arg, char);
                           ^
test.c:10:27: замечание: (поэтому «va_arg» нужно передать «int», а не «char»)
test.c:10:27: замечание: при достижении этого кода выполнение программы завершится аварийно
[kiv@kiv-hp15r161nr ~]$ objdump -d test.o

test.o:     формат файла elf64-x86-64
                                                                                                             
                                                                                                             
Дизассемблирование раздела .text:                                                                            
                                                                                                             
0000000000000000 <func1>:                                                                                    
   0:   0f 0b                   ud2                                                                          
   2:   0f 1f 40 00             nopl   0x0(%rax)                                                             
   6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)                                                  
   d:   00 00 00 

0000000000000010 <func2>:
  10:   0f 0b                   ud2  

Можно заметить, что для char тоже генерируется некорректный код, однако об этом компилятор явно предупреждает. А вот про bool молчит.

Как по мне либо он должен генерировать валидный код, либо выдавать предупреждение. А сейчас это какое-то молчаливое вредительство.

Исходная версия KivApple, :

[kiv@kiv-hp15r161nr ~]$ nano  test.c
[kiv@kiv-hp15r161nr ~]$ gcc -O2 -c -Wall -Wpedantic -Wextra -o test.o test.c
In file included from test.c:1:0:
test.c: В функции «func2»:
test.c:10:27: предупреждение: «char» преобразован к «int» при передаче через «...»
  char value = va_arg(arg, char);
                           ^
test.c:10:27: замечание: (поэтому «va_arg» нужно передать «int», а не «char»)
test.c:10:27: замечание: при достижении этого кода выполнение программы завершится аварийно
[kiv@kiv-hp15r161nr ~]$ objdump -d test.o

test.o:     формат файла elf64-x86-64
                                                                                                             
                                                                                                             
Дизассемблирование раздела .text:                                                                            
                                                                                                             
0000000000000000 <func1>:                                                                                    
   0:   0f 0b                   ud2                                                                          
   2:   0f 1f 40 00             nopl   0x0(%rax)                                                             
   6:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)                                                  
   d:   00 00 00 

0000000000000010 <func2>:
  10:   0f 0b                   ud2  

Можно заметить, что для char тоже генерируется некорректный код, однако об этом компилятор явно предупреждает. А вот про bool молчит.

Как по мне либо он должен генерировать валидный код, либо выдавать предупреждение.