История изменений
Исправление 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 молчит.
Как по мне либо он должен генерировать валидный код, либо выдавать предупреждение.