ошибка clang, связанная с stdarg? - PullRequest
0 голосов
/ 12 сентября 2018

Это похоже на ошибку в clang, связанную со списками аргументов переменных с нулевым символом в конце.

Ожидаемое поведение - va_arg () вернет 0 на первой итерации, поскольку аргумент, следующий за псевдонимом, равен 0.

Полный код ниже. В main () удаление "void * map = 0;" или вызов foo () устраняет ошибку.

#include <stdio.h>
#include <stdarg.h>

/*
clang --version:
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
*/

void *foo(char *a, char *b, char *c, ...) {
        return 0;
}

void *bar(char *a, char *b, char *c, char *d, char *e, char *f, char *alias, ...) {
        char *arg;
        va_list ap;
        va_start(ap, alias);
        printf("alias = %s\n", alias);
        while((arg = va_arg(ap, char *))) {
                printf("arg = %p\n", arg);
                printf("BUG!\n");
                return 0;
        }
        va_end(ap);
        printf("NO BUG\n");
        return 0;
}

int main() {
        void *map = 0; // removing this statement hides bug
        foo(0, 0, 0, 0);// removing this statement hides bug
        bar("a", "b", "c", "d", "e", "f", "b", 0);
}

Вывод:

alias = b
arg = 0x100000000
BUG!

1 Ответ

0 голосов
/ 12 сентября 2018

0 не является char*; это int. Поэтому чтение с va_arg(ap, char*) - это неопределенное поведение.

Укажите аргумент (char*)0, если вы имеете в виду нулевой указатель типа char *. (Или (char*)NULL, если хотите). Как М.М. указывает в комментарии, что часто встречающийся NULL неверен, поскольку NULL может быть #define d как 0.

(Поскольку 0 является int, компилятор не беспокоится о старших четырех байтах. Четыре младших байта аргумента действительно равны 0. Но это детали реализации; я только упомяну это в порядке объяснения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...