История изменений
Исправление KivApple, (текущая версия) :
В ОП-посте же. В данном случае важно именно выдаст ли компилятор предупреждение или нет. Для char он точно также генерирует невалидный код, однако явно предупреждает об этом. Если тебе хочется именно программу, которая упадёт из-за этого бага:
$ cat test.c
#include <stdbool.h>
#include <stdarg.h>
void testFunc(int firstArg, ...) {
(void)firstArg;
va_list ap;
va_start(ap, firstArg);
bool secondArg = va_arg(ap, bool);
(void)secondArg;
va_end(ap);
}
int main(void) {
testFunc(10, true);
return 0
}
$ gcc -Wall -Wextra -O2 -o test test.c
$ ./test
Недопустимая инструкция (core dumped)
$ gcc -c -Wall -Wextra -O2 -o test.o test.c
Либо компилятор должен выдать предупреждение, либо генерировать валидный код. В отличии от обычного UB, когда просто результат может быть странным, в данном случае компилятор делает код невалидным умышленно, вставляя недопустимый опкод. То есть где-то в коде GCC или stdarg.h есть фрагмент «если va_arg(bool), то сделать падующую прогу», такие вещи нельзя делать без предупреждений.
Исправление KivApple, :
В ОП-посте же. В данном случае важно именно выдаст ли компилятор предупреждение или нет. Для char он точно также генерирует невалидный код, однако явно предупреждает об этом. Если тебе хочется именно программу, которая упадёт из-за этого бага:
$ cat test.c
#include <stdbool.h>
#include <stdarg.h>
void testFunc(int firstArg, ...) {
(void)firstArg;
va_list ap;
va_start(ap, firstArg);
bool secondArg = va_arg(ap, bool);
(void)secondArg;
va_end(ap);
}
int main(void) {
testFunc(10, true);
return 0
}
$ gcc -Wall -Wextra -O2 -o test test.c
$ ./test
Недопустимая инструкция (core dumped)
$ gcc -c -Wall -Wextra -O2 -o test.o test.c
Либо компилятор должен выдать предупреждение, либо генерировать валидный код. В отличии от обычного UB, когда просто результат может быть странным, в данном случае компилятор делает код невалидным умышленно, вставляя недопустимый опкод.
Исходная версия KivApple, :
В ОП-посте же. В данном случае важно именно выдаст ли компилятор предупреждение или нет. Для char он точно также генерирует невалидный код, однако явно предупреждает об этом. Если тебе хочется именно программу, которая упадёт из-за этого бага:
$ cat test.c
#include <stdbool.h>
#include <stdarg.h>
void testFunc(int firstArg, ...) {
(void)firstArg;
va_list ap;
va_start(ap, firstArg);
bool secondArg = va_arg(ap, bool);
(void)secondArg;
va_end(ap);
}
int main(void) {
testFunc(10, true);
return 0
}
$ gcc -Wall -Wextra -O2 -o test test.c
$ ./test
Недопустимая инструкция (core dumped)
$ gcc -c -Wall -Wextra -O2 -o test.o test.c